|
|
|
FreeRTOS - минимальное время тика? |
|
|
|
May 22 2018, 17:56
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ May 22 2018, 12:36) Меняю это значение на 10000Hz.... МК STM32L152rc работает на 16MHz В чем может быть дело? Даже в толстых проектах никогда не ставлю больше 1000, а обычно вполне хватает 100. Все остальные более точные времена и задержки следует реализовывать через аппаратные таймера и будить задачи из прерываний флагами или семафорами. Цитата Шедуллер перестает работать вовсе - vApplicationTickHook перестает вызываться и задачи не переключаются. Вангую - в таком режиме либо не хватает основного стека (см. MSP) либо "кончается" стек одной из задач (PSP). Ставьте контроль стека в настойках freeRTOS, и соотв. ловушки. Зы. Как stress-test подобный "садизм" с таких космическим соотношением: 16МГц / 10кГц - имхо, вполне годное решение, возьму на вооружение
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 23 2018, 08:55
|
Профессионал
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848
|
Цитата(uriy @ May 23 2018, 07:19) Тоже никогда не делал меньше 1 мс. Зачем вам это понадобилось? Задачи обработки информации и событий "разложены" недостаточно неэффективно. может так ? приоритет High - "RealtimeTask" + IRQ приоритет Middle - "DriverTask" приоритет Low - "ApplicationTask" приоритет LowLow - "GUI_keyb_console_Task"
|
|
|
|
|
May 23 2018, 09:01
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(k155la3 @ May 23 2018, 11:55) Задачи обработки информации и событий "разложены" недостаточно неэффективно. Длительность системного такта не имеет отношения к этому. Если загрузка СPU достигает 100% (ни разу не запускается IDLE задача), то нужно либо поднимать таковую частоту ядра, либо уменьшать частоту системного таймера ОС. А правильнее - искать виновника: какая из задач "гадит в общую кастрюлю". Слепая игра с приоритетами - это как молитвы о спасении умирающему: в самом лучшем случае лишь немного отсрочат неизбежную "кончину"
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 23 2018, 10:57
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(haker_fox @ May 22 2018, 16:08) Кстати, автору топика рекомендую включить ловушки на нехватку памяти (настройки оси), использовать configASSERT'ы (настройки ОСИ), а также повесить обработчик на hardfault. Все эти вещи НЕ РАЗ выручали меня при отладке проекта. С памятью все ок! Ловушки хоть и примитивные - бесконечный цикл (для отладки сгодится) везде стоят: vApplicationStackOverflowHook, HardFault_Handler и т.д. Цитата(uriy @ May 23 2018, 07:19) Тоже никогда не делал меньше 1 мс. Зачем вам это понадобилось? Я не проект готовый делаю, а только разбираюсь. С STM и FreeRTOS, ранее не работал. Нужно было сделать захват сигнала с частотой 10мкс. Думал попробовать на таймере ОС, вот и поднял частоту. То оказалась глупая затея, а вот баг вылез. Вот и хочу разобраться, чтоб потом таких грабель не было.
|
|
|
|
|
May 23 2018, 12:16
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Нашел костыль. В функции обработка кнопок есть дефайн отключения а потом включения прерываний. Там осталось от оригинала управление SysTick: Код #define enableInterrupts() {SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;} #define disableInterrupts() {SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;} , а я кручу тайминг на TIM3. Только пока не могу понять как это приводит к полному отключению прерываний. Проверил все места где disableInterrupts применяется, всегда есть обратный на включение enableInterrupts, а пока SysTick отключен, планировщик ведь не может передать управление. Дело в том что функция в которой SysTick включается/отключается вызывается из задачи 1, а когда происходит баг, программа весит в задаче 2.
Сообщение отредактировал maxntf - May 23 2018, 12:26
|
|
|
|
|
May 23 2018, 12:46
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(Forger @ May 23 2018, 15:25) Это еще мягко сказано! Это настоящие грабли! Впервые вижу такую дичь Берите готовые решения от 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.
Сообщение отредактировал maxntf - May 23 2018, 12:51
|
|
|
|
|
May 23 2018, 12:49
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ May 23 2018, 15:46) Нужные макросы чего? Как чего? Критических секций: пара disableInterrupts/enableInterrupts именно для этого и тут и создана. Цитата Просто эта библиотека TouchSensorLib была заточена под SysTick. Ее нужно перебирать. Ясень пень, что влоб такие вещи не решаются, иначе получается именно такой результат, как в "шапке" темы. Или искать эту библиотеку, уже переделанную под FreeRTOS, где-нить на гитхабе или типа того
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 23 2018, 19:46
|
Профессионал
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877
|
Цитата(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'а мы никогда не выйдем...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
May 24 2018, 04:27
|
Частый гость
Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344
|
Цитата(jcxz @ May 24 2018, 01:31) А какой смысл в замене SysTick на TIM3? В Ваш МК SysTick впаять забыли? Почему? Вот не копал глубоко - при использовании мастера CubeMX + FreeRtos ПО советует использовать другой кроме SysTic таймер. "Явление открыл - причин не измышляю"(Ломоносов).
--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть" "Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
|
|
|
|
|
|
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0
|
|
|