Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS - минимальное время тика?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Страницы: 1, 2, 3
maxntf
Всем привет.
На FreeRTOS вертятся 3 задачи, больше ничего из инструментария ОС не пользую.
Так вот когда configTICK_RATE_HZ установлен 1000Hz, все работает без проблем. Меняю это значение на 10000Hz, после ресета все задачи какое то время работают, а потом работает только одна - 2-я задача (скорее работает просто функция). Шедуллер перестает работать вовсе - vApplicationTickHook перестает вызываться и задачи не переключаются.
МК STM32L152rc работает на 16MHz.
В чем может быть дело?
Как отследить где планировщик заткнулся и почему?
nanorobot
Цитата(maxntf @ May 22 2018, 14:36) *
Всем привет.
На FreeRTOS вертятся 3 задачи, больше ничего из инструментария ОС не пользую.
Так вот когда configTICK_RATE_HZ установлен 1000Hz, все работает без проблем. Меняю это значение на 10000Hz, после ресета все задачи какое то время работают, а потом работает только одна - 2-я задача (скорее работает просто функция). Шедуллер перестает работать вовсе - vApplicationTickHook перестает вызываться и задачи не переключаются.
МК STM32L152rc работает на 16MHz.
В чем может быть дело?
Как отследить где планировщик заткнулся и почему?



Может стоит попробовать поочередно в каждой задаче не вызывать ничего иного кроме , например sleep(1000), или как там оно во ФриРтос. (я использую ChibiOs) Таким образом определиться, какая именно задача вешает шедулер, и уж потом исследовать ее под микроскопом.
haker_fox
QUOTE (maxntf @ May 22 2018, 17:36) *
Как отследить где планировщик заткнулся и почему?

1. Воспользоваться JTAG или SWD.
2. Если код задач небольшой, то привести его тут.
3. А есть уверенность, что при тике 1 кГц всё работает правильно?
k155la3
Цитата(maxntf @ May 22 2018, 12:36) *
. . . .
МК STM32L152rc работает на 16MHz.
В чем может быть дело?
Как отследить где планировщик заткнулся и почему?

Работа самого планировщика не укладывается в период, который Вы задали. Одна задача осталась - в соотв-ии с приоритетом.
Поставьте в каждую задачу "ногодрыг" (а лучше - и в планировщик). Где собака порылась будет видно в реалтайм.

Да, и это. + поставьте равные приоритеты для задач.
Цитата(nanorobot @ May 22 2018, 12:57) *
Может стоит попробовать поочередно в каждой задаче не вызывать ничего иного кроме , например sleep(1000) . . .
haker_fox
QUOTE (k155la3 @ May 22 2018, 18:31) *
Работа самого планировщика не укладывается в период, который Вы задали.

Кстати, ДА! Вспомнил, что когда-то читал о тиках планировщика. В голове отложилось, не делать менее 1 мс. Кстати, использовал эту цифру всегда, начиная с AVR и заканчивая Cortex-M4. Операционки: scmRTOS, FreeRTOS.
maxntf
Цитата(haker_fox @ May 22 2018, 13:24) *
1. Воспользоваться JTAG или SWD.
2. Если код задач небольшой, то привести его тут.
3. А есть уверенность, что при тике 1 кГц всё работает правильно?

Да при тике 1кгц все работает.
2-я задача читает блоками аудио файл с флешь и DMA его пересылает в DAC. Она то и оставалась работать. Я ее отключил.

1-я задача обрабатывает сенсорные кнопки библиотекой touch-sensing library от ST. Собственно вызывает функцию, которая возвращает состояние кнопок. И если кнопка нажата, устанавливает глобальный флаг.
3-я задача проверяет этот флаг, когда он установился, запускает два таймера, один читает IR код с фотоприемника, а второй его передает.

Сразу оговорюсь, с ARM только начал разбираться, так что некоторые мои рассуждения могут быть глупые, не судите строго sm.gif.

Глючит именно пара задач 1 и 3.
Причем если я блокирую одну из них, глюк пропадает.
У меня пока один вариант:
- библиотека touch-sensing library как то конфликтует с FreeRTOS.

Сейчас просматриваю не использует ли она какие то аппаратные ресурсы что и ОС, например SysTickTimer.


Цитата(k155la3 @ May 22 2018, 13:31) *
Работа самого планировщика не укладывается в период, который Вы задали. Одна задача осталась - в соотв-ии с приоритетом.
Поставьте в каждую задачу "ногодрыг" (а лучше - и в планировщик). Где собака порылась будет видно в реалтайм.


В планировщик больше вообще не попадаем после глюка. Надо проверить что там с прерываниями SysTickTimer, которые где то в FreeRTOS

По ходу прерывания SysTick отключаются. Точнее я вижу что в структуре описания этого регистра меняется значение CTRL - при старте CTRL = 0х00000007 / 0х00010007, а после глюка 0х00010005, и больше в прерывание не попадаем. Сейчас поставил частоту 20000Нz и глюк начал проявляться практически сразу.
k155la3
Кроме всего, проверьте значения стеков задач (не помню, в FreeRTOS он общий или индивидуальные).
В настройках ОС задайте максимум, насколько позволит RAM. Если используются библиотеки - трудно сказать, как они потребляют стековую память.
Вместо "библиотечной" клавиатуры поставьте обычные кнопки или софт-эмулятор или эмулятор через USART.
Клавиатурная задача - самый низкий приоритет. Когда заработает "как надо" - прикрутите.
Цитата
Сразу оговорюсь, с ARM только начал разбираться, так что некоторые мои рассуждения могут быть глупые, не судите строго . . .
Аналогично sm.gif
Цитата
Сейчас просматриваю не использует ли она какие то аппаратные ресурсы что и ОС, например SysTickTimer.
Если есть осцилограф - ловится "на-раз" ногодрыгом.
Можно также под отладчиком поставить контрольную точку по состоянию (изменение) на требуемый регистр.
maxntf
Цитата(k155la3 @ May 22 2018, 14:43) *
Можно также под отладчиком поставить контрольную точку по состоянию (изменение) на требуемый регистр.

В Кеил брекпоинт можно поставить только на весь регистр, вот если бы на изменение бита.sm.gif
Глючит из за библиотеки, там в прерывании таймера, у меня TIM3, вызывается некая функция обработчика этих кнопок. Вот тут то и происходит баг.
k155la3
Цитата(maxntf @ May 22 2018, 14:53) *
В Кеил брекпоинт можно поставить только на весь регистр, вот если бы на изменение бита.sm.gif
Глючит из за библиотеки, там в прерывании таймера, у меня TIM3, вызывается некая функция обработчика этих кнопок. Вот тут то и происходит баг.
Апп. прерывания надо переносить под FreeRTOS иначе . . .
Соотв-но "напрямую" использовать библиотеки с апп. прерываниями без адаптации - могут быть "варианты". IMHO (чтобы не подрались с прерыванием планировщика).


maxntf
Цитата(k155la3 @ May 22 2018, 15:02) *
Апп. прерывания надо переносить под FreeRTOS иначе . . .
Соотв-но "напрямую" использовать библиотеки с апп. прерываниями без адаптации - могут быть "варианты". IMHO (чтобы не подрались с прерыванием планировщика).

Не понял что значит переносить под FreeRTOS?
Какие могут быть коллизии, если FreeRTOS использует прерывания с самыми высокими приоритетами? Я же обработчик делаю на низкоприоритетных TIM3 приоритет 36, а SysTick приоритет 6;

В общем из за малого опыта, тажело судить что происходит, но причина выявлена - 100% перестает работать SysTick, а соответственно и scheduler который крутится на этом таймере.
Вот только что происходит с SysTick, понять не могу.

Кто может, опишите регистры SysTick или ткните где посмотреть.

PS:
Судя по функции SysTick_Config там всего 3 бита, интуитивно по названиям дефайнов SysTick_CTRL_CLKSOURCE_Msk, SysTick_CTRL_TICKINT_Msk, SysTick_CTRL_ENABLE_Msk. один включает тактирование, второй инициализирует и третий запускает. Вот этот SysTick_CTRL_TICKINT_Msk и сбрасывается. Где не могу поймать. если бы в Кеил можно было установить брекпоинт на запись в бит. Кто знает можно такое?
esaulenka
Цитата(maxntf @ May 22 2018, 15:27) *
В общем из за малого опыта, тажело судить что происходит, но причина выявлена - 100% перестает работать SysTick, а соответственно и scheduler который крутится на этом таймере.
Вот только что происходит с SysTick, понять не могу.



Файлик STMTouch_Driver_um.chm
Раздел STM32L1xx resources used

Цитата
Hardware acquisition mode
GPIOs Acquisition
SysTick Time base for ECS and DTO
Routing interface (RI) Acquisition
2 x 16-bit timers (TIM9, TIM11) Acquisition

Software acquisition mode
GPIOs Acquisition
SysTick Time base for ECS and DTO
Routing interface (RI) Acquisition


Из прерывания SysTick'а они вызывают TSL_tim_ProcessIT().
Должны, во всяком случае.
И, видимо, как-то некорректно работают с
Код
// SysTick enable/disable interrupt macros
#define enableInterrupts()  {SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;}
#define disableInterrupts() {SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;}

во всяком случае, каких-то других способов отключения таймера я сходу не нашёл.

А вообще - покажите регистры SYSTICK'а после ошибки.
Описание можно посмотреть на arm.com.
maxntf



Я функцию TSL_tim_ProcessIT перенес в TIM3. Возможно у них где то в инициализации есть управление SysTick, буду искать. Спасибо за наводку.
haker_fox
QUOTE (k155la3 @ May 22 2018, 19:43) *
Кроме всего, проверьте значения стеков задач (не помню, в FreeRTOS он общий или индивидуальные).
В настройках ОС задайте максимум, насколько позволит RAM. Если используются библиотеки - трудно сказать, как они потребляют стековую память.

У FreeRTOS свой стек для каждой задачи.

Кстати, автору топика рекомендую включить ловушки на нехватку памяти (настройки оси), использовать configASSERT'ы (настройки ОСИ), а также повесить обработчик на hardfault. Все эти вещи НЕ РАЗ выручали меня при отладке проекта.


QUOTE (maxntf @ May 22 2018, 20:27) *
Не понял что значит переносить под FreeRTOS?
Какие могут быть коллизии, если FreeRTOS использует прерывания с самыми высокими приоритетами? Я же обработчик делаю на низкоприоритетных TIM3 приоритет 36, а SysTick приоритет 6;

На всякий случай)))
k155la3
Цитата(maxntf @ May 22 2018, 15:27) *
Не понял что значит переносить под FreeRTOS? Какие могут быть коллизии, если FreeRTOS использует прерывания с самыми высокими приоритетами? Я же обработчик делаю на низкоприоритетных TIM3 приоритет 36, а SysTick приоритет 6; . . .
Очевидно, это процессор-зависимое требование. Возможно для ARM и не требуется.
В Demo FreeRTOS serial.c для STM32L152 в обработчике используется макрос portEND_SWITCHING_ISR( . . . ).
Код
void USART3_IRQHandler( void )
{
  . . . . . . . .
    /* If sending or receiving from a queue has caused a task to unblock, and
    the unblocked task has a priority equal to or higher than the currently
    running task (the task this ISR interrupted), then xHigherPriorityTaskWoken
    will have automatically been set to pdTRUE within the queue send or receive
    function.  portEND_SWITCHING_ISR() will then ensure that this ISR returns    <<<
    directly to the higher priority unblocked task. */                                             <<<
    portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}

Код
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD_WITHIN_API()
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )





esaulenka
Цитата(maxntf @ May 22 2018, 15:58) *
Я функцию TSL_tim_ProcessIT перенес в TIM3. Возможно у них где то в инициализации есть управление SysTick, буду искать. Спасибо за наводку.


Ну вот и включение/выключение прерываний в коде этой тачлиб надо перенести на таймер 3. NVIC_Enable() / NVIC_Disable().

... а, по-хорошему, выкинуть их г-нокод задержек и переписать без критических секций.
Forger
Цитата(maxntf @ May 22 2018, 12:36) *
Меняю это значение на 10000Hz....
МК STM32L152rc работает на 16MHz
В чем может быть дело?

cranky.gif

Даже в толстых проектах никогда не ставлю больше 1000, а обычно вполне хватает 100.
Все остальные более точные времена и задержки следует реализовывать через аппаратные таймера и будить задачи из прерываний флагами или семафорами.

Цитата
Шедуллер перестает работать вовсе - vApplicationTickHook перестает вызываться и задачи не переключаются.

Вангую - в таком режиме либо не хватает основного стека (см. MSP) либо "кончается" стек одной из задач (PSP).
Ставьте контроль стека в настойках freeRTOS, и соотв. ловушки.

Зы. Как stress-test подобный "садизм" с таких космическим соотношением: 16МГц / 10кГц - имхо, вполне годное решение, возьму на вооружение smile3046.gif
uriy
Тоже никогда не делал меньше 1 мс. Зачем вам это понадобилось?
k155la3
Цитата(uriy @ May 23 2018, 07:19) *
Тоже никогда не делал меньше 1 мс. Зачем вам это понадобилось?
Задачи обработки информации и событий "разложены" недостаточно неэффективно.
может так ?
приоритет High - "RealtimeTask" + IRQ
приоритет Middle - "DriverTask"
приоритет Low - "ApplicationTask"
приоритет LowLow - "GUI_keyb_console_Task"
Forger
Цитата(k155la3 @ May 23 2018, 11:55) *
Задачи обработки информации и событий "разложены" недостаточно неэффективно.

Длительность системного такта не имеет отношения к этому.
Если загрузка СPU достигает 100% (ни разу не запускается IDLE задача), то нужно либо поднимать таковую частоту ядра, либо уменьшать частоту системного таймера ОС.
А правильнее - искать виновника: какая из задач "гадит в общую кастрюлю".
Слепая игра с приоритетами - это как молитвы о спасении умирающему: в самом лучшем случае лишь немного отсрочат неизбежную "кончину" laughing.gif
maxntf
Цитата(haker_fox @ May 22 2018, 16:08) *
Кстати, автору топика рекомендую включить ловушки на нехватку памяти (настройки оси), использовать configASSERT'ы (настройки ОСИ), а также повесить обработчик на hardfault. Все эти вещи НЕ РАЗ выручали меня при отладке проекта.


С памятью все ок!
Ловушки хоть и примитивные - бесконечный цикл (для отладки сгодится) везде стоят: vApplicationStackOverflowHook, HardFault_Handler и т.д.

Цитата(uriy @ May 23 2018, 07:19) *
Тоже никогда не делал меньше 1 мс. Зачем вам это понадобилось?

Я не проект готовый делаю, а только разбираюсь. С STM и FreeRTOS, ранее не работал. Нужно было сделать захват сигнала с частотой 10мкс. Думал попробовать на таймере ОС, вот и поднял частоту. То оказалась глупая затея, а вот баг вылез. Вот и хочу разобраться, чтоб потом таких грабель не было.
maxntf
Нашел костыль.
В функции обработка кнопок есть дефайн отключения а потом включения прерываний.
Там осталось от оригинала управление SysTick:
Код
#define enableInterrupts()  {SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;}
#define disableInterrupts() {SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;}

, а я кручу тайминг на TIM3.
Только пока не могу понять как это приводит к полному отключению прерываний. Проверил все места где disableInterrupts применяется, всегда есть обратный на включение enableInterrupts, а пока SysTick отключен, планировщик ведь не может передать управление. Дело в том что функция в которой SysTick включается/отключается вызывается из задачи 1, а когда происходит баг, программа весит в задаче 2.
Forger
Цитата(maxntf @ May 23 2018, 15:16) *
Нашел костыль.

Это еще мягко сказано! Это настоящие грабли! smile3046.gif
Впервые вижу такую дичь cranky.gif

Берите готовые решения от FreeRTOS, там есть нужные макросы.
maxntf
Цитата(Forger @ May 23 2018, 15:25) *
Это еще мягко сказано! Это настоящие грабли! smile3046.gif
Впервые вижу такую дичь cranky.gif

Берите готовые решения от FreeRTOS, там есть нужные макросы.


Нужные макросы чего?
Просто эта библиотека TouchSensorLib была заточена под SysTick. Ее нужно перебирать. Только хрена было ее делать под хардтимер не понятно.
Там и так хренова куча настроек, ну добавили бы еще одну по выбору и настройке таймера. Тем более что там нужно только мсек и сек считать и все!

Заделал такое:
Код
#define enableInterrupts()    {NVIC->ISER[TIM3_IRQn >> 0x05] = (uint32_t)0x01 << (TIM3_IRQn & (uint8_t)0x1F);}
#define disableInterrupts()     {NVIC->ICER[TIM3_IRQn >> 0x05] = (uint32_t)0x01 << (TIM3_IRQn & (uint8_t)0x1F);}

Все вроде работает.
Осталось проверить чтоб теперь TIM3 не вис. Если будет виснуть, тогда косяк где то в TouchSensorLib.
Forger
Цитата(maxntf @ May 23 2018, 15:46) *
Нужные макросы чего?

Как чего? Критических секций: пара disableInterrupts/enableInterrupts именно для этого и тут и создана.

Цитата
Просто эта библиотека TouchSensorLib была заточена под SysTick. Ее нужно перебирать.

Ясень пень, что влоб такие вещи не решаются, иначе получается именно такой результат, как в "шапке" темы.
Или искать эту библиотеку, уже переделанную под FreeRTOS, где-нить на гитхабе или типа того
esaulenka
Цитата(maxntf @ May 23 2018, 15:16) *
Нашел костыль.


Сообщения #11 и #15 в этом топике не читали? ладно, следующий раз постараюсь более внятно излагать свои мысли.


Цитата(maxntf @ May 23 2018, 15:16) *
Только пока не могу понять как это приводит к полному отключению прерываний. Проверил все места где disableInterrupts применяется, всегда есть обратный на включение enableInterrupts, а пока SysTick отключен, планировщик ведь не может передать управление. Дело в том что функция в которой SysTick включается/отключается вызывается из задачи 1, а когда происходит баг, программа весит в задаче 2.

Например, если задача 2 более высокоприоритетная, и устроена как-то следующим образом:
while (1) {
wait_mutex(); // queue/...
do_job();
sleep(N);
}
а это внешний мьютекс или элемент из очереди привязан не к SysTick'у, а к какому-то внешнему воздействию, она может проснуться в т.ч. и в тот момент, когда задача 1 находится внутри критической секции. И всё - из sleep'а мы никогда не выйдем...
jcxz
Цитата(maxntf @ May 23 2018, 15:16) *
, а я кручу тайминг на TIM3.

А какой смысл в замене SysTick на TIM3? В Ваш МК SysTick впаять забыли? biggrin.gif

Цитата(esaulenka @ May 23 2018, 22:46) *
она может проснуться в т.ч. и в тот момент, когда задача 1 находится внутри критической секции. И всё - из sleep'а мы никогда не выйдем...

Почему?
volodya
Цитата(jcxz @ May 24 2018, 01:31) *
А какой смысл в замене SysTick на TIM3? В Ваш МК SysTick впаять забыли? biggrin.gif


Почему?


Вот не копал глубоко - при использовании мастера CubeMX + FreeRtos
ПО советует использовать другой кроме SysTic таймер.
"Явление открыл - причин не измышляю"(Ломоносов).
jcxz
Цитата(volodya @ May 24 2018, 07:27) *
Вот не копал глубоко - при использовании мастера CubeMX + FreeRtos

хммм.... Если это так, то это причина не заменить таймер, а выбросить нафиг куб вместе с фриртос-ом (или его кривым портом). laughing.gif
Forger
Цитата(jcxz @ May 24 2018, 09:17) *
вместе с фриртос-ом (или его кривым портом). laughing.gif

Фриртос вполне годная вещь, и порты в целом годные, но в погоне за универсальностью (поддержка огромного числа платформ) вся ось стала монстроподобной и потому не самой шустрой и удобной.
Но запускается с полпинка и вполне годно работает, но при условии: делать все правильно и не заниматься самодеятельностью (как это делает ТС).
Arlleex
FreeRTOS работает хорошо и правильно, если с ней правильно работать...
А вот прикручивать таймеры общего назначения вместо специально интегрированного в ядро Cortex-Mx SysTick - ИМХО попахивает аттавизмом из 8-битных микроконтроллеров, где и другого выбора-то не было.
maxntf
Цитата(esaulenka @ May 23 2018, 22:46) *
Сообщения #11 и #15 в этом топике не читали? ладно, следующий раз постараюсь более внятно излагать свои мысли.

Этот пост я проглядел. то есть не совсем проглядел, а проглядывал его с телефона дома, и не особо придал значение коду с дефайнами. После продолжение ветки перешло на второй лист, и туда забыл посмотреть. Но зато комент, где было сказано что тачлиб юзает SysTick натолкнула на мысль, что нужно из нее удалить все упоминания SysTick чтоб она вообще забыла о его существовании.
По этому автору esaulenka отдельное спасибо.

Это все хорошо.
Только мне не понятен один момент, откинув всю лирику о приоритетах задач, концепции FreeRTOS и т.д.
Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы.
Он вызывается по прерыванию таймера на котором он работает - SysTick, или через API функции FreeRTOSа.
У меня 3 задачи, не в одной нет никаких API функций, даже делай.
1-я вызывает функцию, которая отключает SysTick и по какой то причине он не включается. Каким образом моя программа оказывается во второй задачи и там висит, потому как SysTick отключен и планировщик больше не вызывается, а API функций в задачах нет, чтоб вызвать планировщик.

P.S. Остается только один вариант - когда 1-я задача включает SysTick, срабатывает прерывание, мы попадаем в планировщик, он передает управление 2-й задаче, и тут по какой то причине SysTick отключается (уже в планировщике).
Baser
Цитата(jcxz @ May 24 2018, 01:31) *
А какой смысл в замене SysTick на TIM3? В Ваш МК SysTick впаять забыли? biggrin.gif

Цитата(volodya @ May 24 2018, 07:27) *
Вот не копал глубоко - при использовании мастера CubeMX + FreeRtos
ПО советует использовать другой кроме SysTic таймер.

При использовании STMовского HAL (CubeMX) + FreeRTOS нужно назначать системный таймер HALа (который формирует сетку 1 мс) на любой другой свободный таймер кроме SysTick. Потому что SysTick монопольно занимает FreeRTOS.
И приоритеты на них назначаются соответственно.
Это подробно описано в доках на HAL, целая глава есть.

А по минимальному тику FreeRTOS тоже встречал рекомендации не делать частоту больше 1000 гц
Из доки на FreeRTOS v9.0 :
Цитата
configTICK_RATE_HZ
Sets the tick interrupt frequency. The value is specified in Hz.
The pdMS_TO_TICKS() macro can be used to convert a time specified in milliseconds to a time specified in ticks. Block times specified this way will remain constant even when the configTICK_RATE_HZ definition is changed. pdMS_TO_TICKS() can only be used when configTICK_RATE_HZ is less than or equal to 1000. The standard demo tasks make extensive use of pdMS_TO_TICKS(), so they too can only be used when configTICK_RATE_HZ is less than or equal to 1000.

То есть, если в ваших библиотеках применяется макрос pdMS_TO_TICKS(), то он будет неправильно считать время.
maxntf
Что то кажется мне, что дело не в тачлиб, во второй задаче у меня используется FatFS, я ее прикрутил и просто читаю файл через SPI. Но сейчас вспоминаю, когда я с ней разбирался (поверхностно) особо на детали внимание не обращал, меня интересовало только чтение файла. Но там ведь где то должны быть часы, чтоб указывать время создания/редактирования файла (по идеи). То есть эта библиотека как то должна работать со временем, а где это делается и настраивается я даже не разбирался. Возможно это вторая задача SysTick останавливает.

P.S.
Хотя вроде нужно самому эти атрибуты заполнять, FatFS за датой не следит, по крайне мере настраивать ее я не находил как. Там есть структура FILINFO, вот пользователь ее сам и заполняет.
Forger
Цитата(maxntf @ May 24 2018, 11:26) *
Только мне не понятен один момент ....

Судя по всему у вас нет не хватает знаний по RTOS, читайте матчасть, она есть на сайте freeRTOS.
В частности примеры применения.
Тогда не придется гадать на кофейной гуще ))

jcxz
Цитата(Forger @ May 24 2018, 09:27) *
вся ось стала монстроподобной и потому не самой шустрой и удобной.

Мне тоже она показалась слишком монстроидальной. Поэтому пользую uCOS-II - она полегче.

Цитата(maxntf @ May 24 2018, 11:26) *
Он вызывается по прерыванию таймера на котором он работает - SysTick, или через API функции FreeRTOSа.

Обычно в РТОС он вызывается не только из ISR таймера и вызовов API OS, но и в других ISR (в которых это разрешено).

Цитата(Baser @ May 24 2018, 11:34) *
При использовании STMовского HAL (CubeMX) + FreeRTOS нужно назначать системный таймер HALа (который формирует сетку 1 мс) на любой другой свободный таймер кроме SysTick. Потому что SysTick монопольно занимает FreeRTOS.

Ну так можно вызвать нужную функцию этого куба из ISR FreeRTOS. Выставить для FreeRTOS 1КГЦ и вызывать.
Нафига козе баян Зачем кста кубу это прерывание? Там своя ОС внутри уже что-ль? wacko.gif

Цитата(maxntf @ May 24 2018, 11:26) *
Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы.

Кста: не планировщик (шедулер) перекидывает ход выполнения программы, а переключатель контекста. Если уж на то пошло.
Шедулер только выбирает и назначает какая задача будет выполняться следующей, и возбуждает PendSV, в котором собственно контекст и переключается. Без PendSV ничего никуда не перекинется.
Forger
Цитата(jcxz @ May 24 2018, 14:11) *
Мне тоже она показалась слишком монстроидальной. Поэтому пользую uCOS-II - она полегче.

Тоже смотрел в сторону uCOS, но уже uCOS-III.
Но "вдруг" попалась под руки RTX Keil (теперь она кстати принадлежит ARM), сделана по-уму: все сервисы на SVC, т.е. именно так, как это рекомендуется самой АRM при проектировании ядра.
Работает несколько быстрее FreeRTOS, размера занимает немного меньше. Сравнивал на одном и том же проекте.
Turnaev Sergey
Цитата(Baser @ May 24 2018, 11:34) *
А по минимальному тику FreeRTOS тоже встречал рекомендации не делать частоту больше 1000 гц
Из доки на FreeRTOS v9.0 :

То есть, если в ваших библиотеках применяется макрос pdMS_TO_TICKS(), то он будет неправильно считать время.

На самом деле, сделать частоту тиков выше не проблема. Ну да, придётся переписать пару простых макросов и на этом всё.
Использую в сложном проекте где порядка 60 задач, частоту тиков почти 13кГц, при тактовой 96МГц, отлично работает.

Зачем это надо. Объясняю. Если используете энергосберегающие режимы и режим ticklessIdle, т.е. пропуск тиков, то в сон контроллер уходит не ранее чем через один тик, соответственно чем тик меньше, тем быстрее после выполнения задачи контроллер уснёт.

Цитата(maxntf @ May 24 2018, 11:26) *
Это все хорошо.
Только мне не понятен один момент, откинув всю лирику о приоритетах задач, концепции FreeRTOS и т.д.
Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы.
Он вызывается по прерыванию таймера на котором он работает - SysTick, или через API функции FreeRTOSа.
У меня 3 задачи, не в одной нет никаких API функций, даже делай.
1-я вызывает функцию, которая отключает SysTick и по какой то причине он не включается. Каким образом моя программа оказывается во второй задачи и там висит, потому как SysTick отключен и планировщик больше не вызывается, а API функций в задачах нет, чтоб вызвать планировщик.

P.S. Остается только один вариант - когда 1-я задача включает SysTick, срабатывает прерывание, мы попадаем в планировщик, он передает управление 2-й задаче, и тут по какой то причине SysTick отключается (уже в планировщике).

Я правильно понял, что в задачах нет вызовов vTaskDelay()?
В таком случае они всегда будут подвешивать планировщик.
vTaskDelay() обязателен в любой задаче FreeRTOS.
Хотя вру, не обязателен, вместо него может быть ожидание очереди или семафора, но что-то подобное обязано быть внутри бесконечного цикла каждой задачи.
jcxz
Цитата(Forger @ May 24 2018, 15:03) *
Работает несколько быстрее FreeRTOS, размера занимает немного меньше. Сравнивал на одном и том же проекте.

Что значит "несколько быстрее"? Изменилась загрузка CPU? И на сколько (в %)?
Forger
Цитата(jcxz @ May 24 2018, 16:59) *
Что значит "несколько быстрее"? Изменилась загрузка CPU? И на сколько (в %)?

Да, загрузка меньше, буквально проценты, но конкретное значение сильно зависит от проекта.
Т.е. если использутся очень много сервисов, то разница получается более заметная.
Полагаю, что все дело в более оптимальной работе шедулера и самих сервисов.
Точные замеры (профилирование) я не делал, ибо такой задачи себе не ставил.
Просто, было принято решение выбора: соскакивать с FreeRTOS или остаться. Выбор пал на первое ))


Ну и вторым доводом сыграло то, что мои проекты не привязаны к какой-то конкретной RTOS (раньше я об этом писал, использую "обертку"), но почти все проекты на ARM-Cortex.
Поэтому тащить чудовищную универсальность в плане портов FreeRTOS для меня просто нет смысла.

Но есть и минус (для меня): пока что нет у Segger порта для их SystemView под эту ось, но дойдут руки сам сделаю или на край дождусь пока на это созреет Segger.
Порты SystemView на FreeRTOS и uCOS есть в комплекте, вполне рабочие. Правда порт SystemView под FreeRTOS пришлось немного допиливать - сыроват он был на тот момент ((
uriy
Цитата
Но есть и минус (для меня): пока что нет у Segger порта для их SystemView под эту ось
А про эту штуку знаете https://electronix.ru/forum/index.php?showtopic=127646 ? Вроде и под ucos ее уже сделали
Forger
Цитата(uriy @ May 25 2018, 08:04) *
А про эту штуку знаете?

Знаем такую, пробовали ))
Но лично мне она вообще не понравилась - вертикальная прокрутка (WTF???), информативность уступает systemview и нет нормальной FREE версии ((
uriy
У меня было такое же мнение о вертикальной прокрутке.
Но сейчас у меня противоложное мнение.
Цитата
нет нормальной FREE версии
А J-link у вас настоящий? Тогда какая разница?
Как в горизонтальной прокрутке вывести столько инфы:
Нажмите для просмотра прикрепленного файла
Forger
Цитата(uriy @ May 25 2018, 09:12) *
А J-link у вас настоящий? Тогда какая разница?

Поясните, не пойму связи. J-link-ов в конторе много и нормальные и китай.
Придет время купят и SystemView, но пока 1млн событий (ограничение free версии) хватает в любом нынешнем проекте.

Цитата
Как в горизонтальной прокрутке вывести столько инфы:
В SystemView все события (текст) точно также выводятся c вертикальной прокруткой.
Если щелкнуть на любое событие в окне терминала или событий, то на графике автоматом будет указано место.
Удобно и главное - привычно: ось времени - X, слева направо. Никакой самодеятельности ))

Нажмите для просмотра прикрепленного файла
esaulenka
Цитата(Turnaev Sergey @ May 24 2018, 16:25) *
Я правильно понял, что в задачах нет вызовов vTaskDelay()?
В таком случае они всегда будут подвешивать планировщик.

Нет. Если задачи одного приоритета, они будут переключаться по кругу с периодом SYSTICK.
Не самая лучшая идея, но работает.

Заодно мы решили загадку топикстартера. Переключение задач у него не привязано к выполнению задачи никак, и в какой-то "счастливый" момент оно срабатывает посреди критической секции. Один раз.
В общем, это никуда не годится. Если есть RTOS, надо ей пользоваться. Нужна задержка - delay() операционки. Нужно подождать, пока сработает прерывание - выкинуть вечный цикл с флажком, сделать очередь или семафор.

Цитата(jcxz @ May 24 2018, 14:11) *
Нафига козе баян Зачем кста кубу это прерывание? Там своя ОС внутри уже что-ль? wacko.gif


Классика. Пастернака не читал, но осуждаю. Извините.
jcxz
Цитата(esaulenka @ May 25 2018, 10:31) *
Классика. Пастернака не читал, но осуждаю. Извините.

Я конечно извиняю за ваше незнание Пастернака. Но какое он имеет отношение к моему вопросу? wacko.gif
maxntf
Потихоньку разбираюсь далее с FreeRTOS.
Возникла новая проблема, я ее решил но возможно не совсем правильно и не понимаю из за чего так получилось.
Сейчас системный тик 1мсек.
Может кто подскажет?

Есть таймер настроенный на 10мкс, на каждом прерывании он декрементирует глоб. переменную, значение которой задает Task2 (имеет самый высокий приоритет).
Когда переменная = 0, устанавливает семафор, чтоб разбудить задачу, которая установит новое значение переменной.
Код
//Task2
...
        IrState.ctim10ms = IrState.bRxTx[pValue->nComm][0];
        ctx_bit = 1;
        xSemaphoreTake(IrState.xSemNx, 0);
        T10_Init();
        while(ctx_bit <= IrState.cRxTx[pValue->nComm])
        {        
            [b]enableInterruptTIM10();[/b]
            if(xSemaphoreTake(IrState.xSemNx, 25) != pdTRUE) break;
            SwitchPWM;
            IrState.ctim10ms = IrState.bRxTx[pValue->nComm][ctx_bit];
            ctx_bit++;
        }
        T10_DeInit();
...

void TIM10_IRQHandler(void)
{
    static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
    
    if(TIM_GetFlagStatus(TIM10, TIM_FLAG_Update) != RESET)
    {
        TIM_ClearFlag(TIM10, TIM_FLAG_Update);
        if(IrState.ctim10ms) IrState.ctim10ms--;
        else
        {
            [b]disableInterruptTIM10();[/b]
            xSemaphoreGiveFromISR(IrState.xSemNx, &xHigherPriorityTaskWoken);
            portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
        }
    }
}

В общем пока я не начал отключать прерывания таймера (в коде выделил), все висло в обработчике таймера и ни одна задача управление не получает.
jcxz
Цитата(maxntf @ May 29 2018, 13:17) *
Есть таймер настроенный на 10мкс, на каждом прерывании он декрементирует глоб. переменную, значение которой задает Task2 (имеет самый высокий приоритет).
...
В общем пока я не начал отключать прерывания таймера (в коде выделил), все висло в обработчике таймера и ни одна задача управление не получает.

Чтобы на столь высоких частотах периодических прерываний работало и не висло, нужно вначале научиться обходиться без куба.
И потрудитесь хотя-бы посчитать каков период прерываний в тактах ядра.
maxntf
Цитата(jcxz @ May 29 2018, 13:26) *
Чтобы на столь высоких частотах периодических прерываний работало и не висло, нужно вначале научиться обходиться без куба.
И потрудитесь хотя-бы посчитать каков период прерываний в тактах ядра.

Где тут куб увидели?
Ядра чего ОС? Если да то я писал 1мсек.

P.S. На всякий случай, частота тактирования МК - 16МГц.
jcxz
Цитата(maxntf @ May 29 2018, 13:33) *
P.S. На всякий случай, частота тактирования МК - 16МГц.

Естественно тактах CPU.
Если не куб, то кубоподбный код: TIM_GetFlagStatus(), TIM_ClearFlag()
у Вас всего 160 тактов между прерываниями, за которые CPU должен успеть кучу всего (откройте листинг и вручную посчитайте такты или то же самое сделайте отладчиком).
Даже если писать нормально (с прямой работой с регистрами IO, без ненужных функций) при такой высокой частоте у Вас CPU только и будет заниматься входами/выходами в ISR - загрузка будет близка к 100%.
А при обнулении счётчика так вообще там у Вас таймер наверняка переполняется и что-то при этом происходит.
Вам надо кардинально пересматривать архитектуру проекта и или повышать частоту CPU или обходиться без таких ВЧ прерываний. И научиться работать с регистрами напрямую, без ненужных обёрток.
ViKo
Цитата(jcxz @ May 29 2018, 13:44) *
у Вас всего 160 тактов между прерываниями, за которые CPU должен успеть кучу всего

1600
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.