Jump to content

    

FreeRTOS - минимальное время тика?

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

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

По этому автору esaulenka отдельное спасибо.

 

Это все хорошо.

Только мне не понятен один момент, откинув всю лирику о приоритетах задач, концепции FreeRTOS и т.д.

Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы.

Он вызывается по прерыванию таймера на котором он работает - SysTick, или через API функции FreeRTOSа.

У меня 3 задачи, не в одной нет никаких API функций, даже делай.

1-я вызывает функцию, которая отключает SysTick и по какой то причине он не включается. Каким образом моя программа оказывается во второй задачи и там висит, потому как SysTick отключен и планировщик больше не вызывается, а API функций в задачах нет, чтоб вызвать планировщик.

 

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

Edited by maxntf

Share this post


Link to post
Share on other sites
А какой смысл в замене SysTick на TIM3? В Ваш МК SysTick впаять забыли? :biggrin:

Вот не копал глубоко - при использовании мастера 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(), то он будет неправильно считать время.

Share this post


Link to post
Share on other sites

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

 

P.S.

Хотя вроде нужно самому эти атрибуты заполнять, FatFS за датой не следит, по крайне мере настраивать ее я не находил как. Там есть структура FILINFO, вот пользователь ее сам и заполняет.

Edited by maxntf

Share this post


Link to post
Share on other sites
Только мне не понятен один момент ....

Судя по всему у вас нет не хватает знаний по RTOS, читайте матчасть, она есть на сайте freeRTOS.

В частности примеры применения.

Тогда не придется гадать на кофейной гуще ))

 

 

Share this post


Link to post
Share on other sites
вся ось стала монстроподобной и потому не самой шустрой и удобной.

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

 

Он вызывается по прерыванию таймера на котором он работает - SysTick, или через API функции FreeRTOSа.

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

 

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

Ну так можно вызвать нужную функцию этого куба из ISR FreeRTOS. Выставить для FreeRTOS 1КГЦ и вызывать.

Нафига козе баян Зачем кста кубу это прерывание? Там своя ОС внутри уже что-ль? :wacko:

 

Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы.

Кста: не планировщик (шедулер) перекидывает ход выполнения программы, а переключатель контекста. Если уж на то пошло.

Шедулер только выбирает и назначает какая задача будет выполняться следующей, и возбуждает PendSV, в котором собственно контекст и переключается. Без PendSV ничего никуда не перекинется.

Share this post


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

Тоже смотрел в сторону uCOS, но уже uCOS-III.

Но "вдруг" попалась под руки RTX Keil (теперь она кстати принадлежит ARM), сделана по-уму: все сервисы на SVC, т.е. именно так, как это рекомендуется самой АRM при проектировании ядра.

Работает несколько быстрее FreeRTOS, размера занимает немного меньше. Сравнивал на одном и том же проекте.

 

Share this post


Link to post
Share on other sites
А по минимальному тику FreeRTOS тоже встречал рекомендации не делать частоту больше 1000 гц

Из доки на FreeRTOS v9.0 :

 

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

На самом деле, сделать частоту тиков выше не проблема. Ну да, придётся переписать пару простых макросов и на этом всё.

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

 

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

 

Это все хорошо.

Только мне не понятен один момент, откинув всю лирику о приоритетах задач, концепции FreeRTOS и т.д.

Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы.

Он вызывается по прерыванию таймера на котором он работает - SysTick, или через API функции FreeRTOSа.

У меня 3 задачи, не в одной нет никаких API функций, даже делай.

1-я вызывает функцию, которая отключает SysTick и по какой то причине он не включается. Каким образом моя программа оказывается во второй задачи и там висит, потому как SysTick отключен и планировщик больше не вызывается, а API функций в задачах нет, чтоб вызвать планировщик.

 

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

Я правильно понял, что в задачах нет вызовов vTaskDelay()?

В таком случае они всегда будут подвешивать планировщик.

vTaskDelay() обязателен в любой задаче FreeRTOS.

Хотя вру, не обязателен, вместо него может быть ожидание очереди или семафора, но что-то подобное обязано быть внутри бесконечного цикла каждой задачи.

Share this post


Link to post
Share on other sites
Работает несколько быстрее FreeRTOS, размера занимает немного меньше. Сравнивал на одном и том же проекте.

Что значит "несколько быстрее"? Изменилась загрузка CPU? И на сколько (в %)?

Share this post


Link to post
Share on other sites
Что значит "несколько быстрее"? Изменилась загрузка CPU? И на сколько (в %)?

Да, загрузка меньше, буквально проценты, но конкретное значение сильно зависит от проекта.

Т.е. если использутся очень много сервисов, то разница получается более заметная.

Полагаю, что все дело в более оптимальной работе шедулера и самих сервисов.

Точные замеры (профилирование) я не делал, ибо такой задачи себе не ставил.

Просто, было принято решение выбора: соскакивать с FreeRTOS или остаться. Выбор пал на первое ))

 

 

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

Поэтому тащить чудовищную универсальность в плане портов FreeRTOS для меня просто нет смысла.

 

Но есть и минус (для меня): пока что нет у Segger порта для их SystemView под эту ось, но дойдут руки сам сделаю или на край дождусь пока на это созреет Segger.

Порты SystemView на FreeRTOS и uCOS есть в комплекте, вполне рабочие. Правда порт SystemView под FreeRTOS пришлось немного допиливать - сыроват он был на тот момент ((

Share this post


Link to post
Share on other sites
А про эту штуку знаете?

Знаем такую, пробовали ))

Но лично мне она вообще не понравилась - вертикальная прокрутка (WTF???), информативность уступает systemview и нет нормальной FREE версии ((

 

Share this post


Link to post
Share on other sites

У меня было такое же мнение о вертикальной прокрутке.

Но сейчас у меня противоложное мнение.

нет нормальной FREE версии
А J-link у вас настоящий? Тогда какая разница?

Как в горизонтальной прокрутке вывести столько инфы:

post-11606-1527228652_thumb.png

Share this post


Link to post
Share on other sites
А J-link у вас настоящий? Тогда какая разница?

Поясните, не пойму связи. J-link-ов в конторе много и нормальные и китай.

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

 

Как в горизонтальной прокрутке вывести столько инфы:
В SystemView все события (текст) точно также выводятся c вертикальной прокруткой.

Если щелкнуть на любое событие в окне терминала или событий, то на графике автоматом будет указано место.

Удобно и главное - привычно: ось времени - X, слева направо. Никакой самодеятельности ))

 

post-2831-1527229016_thumb.png

Share this post


Link to post
Share on other sites
Я правильно понял, что в задачах нет вызовов vTaskDelay()?

В таком случае они всегда будут подвешивать планировщик.

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

Не самая лучшая идея, но работает.

 

Заодно мы решили загадку топикстартера. Переключение задач у него не привязано к выполнению задачи никак, и в какой-то "счастливый" момент оно срабатывает посреди критической секции. Один раз.

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

 

Нафига козе баян Зачем кста кубу это прерывание? Там своя ОС внутри уже что-ль? :wacko:

 

Классика. Пастернака не читал, но осуждаю. Извините.

Share this post


Link to post
Share on other sites
Классика. Пастернака не читал, но осуждаю. Извините.

Я конечно извиняю за ваше незнание Пастернака. Но какое он имеет отношение к моему вопросу? :wacko:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now