|
|
|
FreeRTOS - минимальное время тика? |
|
|
|
May 24 2018, 08:26
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Цитата(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 отключается (уже в планировщике).
Сообщение отредактировал maxntf - May 24 2018, 08:33
|
|
|
|
|
May 24 2018, 08:34
|
Просто Che
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881
|
Цитата(jcxz @ May 24 2018, 01:31) А какой смысл в замене SysTick на TIM3? В Ваш МК SysTick впаять забыли? Цитата(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(), то он будет неправильно считать время.
|
|
|
|
|
May 24 2018, 09:14
|
Частый гость
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008
|
Что то кажется мне, что дело не в тачлиб, во второй задаче у меня используется FatFS, я ее прикрутил и просто читаю файл через SPI. Но сейчас вспоминаю, когда я с ней разбирался (поверхностно) особо на детали внимание не обращал, меня интересовало только чтение файла. Но там ведь где то должны быть часы, чтоб указывать время создания/редактирования файла (по идеи). То есть эта библиотека как то должна работать со временем, а где это делается и настраивается я даже не разбирался. Возможно это вторая задача SysTick останавливает.
P.S. Хотя вроде нужно самому эти атрибуты заполнять, FatFS за датой не следит, по крайне мере настраивать ее я не находил как. Там есть структура FILINFO, вот пользователь ее сам и заполняет.
Сообщение отредактировал maxntf - May 24 2018, 09:25
|
|
|
|
|
May 24 2018, 09:59
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(maxntf @ May 24 2018, 11:26) Только мне не понятен один момент .... Судя по всему у вас нет не хватает знаний по RTOS, читайте матчасть, она есть на сайте freeRTOS. В частности примеры применения. Тогда не придется гадать на кофейной гуще ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 24 2018, 11:11
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(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КГЦ и вызывать. Нафига козе баян Зачем кста кубу это прерывание? Там своя ОС внутри уже что-ль? Цитата(maxntf @ May 24 2018, 11:26) Планировщик, очень сокращенно - это функция которая управляет регистром PC, то есть выбирает куда перекинуть ход выполнения программы. Кста: не планировщик (шедулер) перекидывает ход выполнения программы, а переключатель контекста. Если уж на то пошло. Шедулер только выбирает и назначает какая задача будет выполняться следующей, и возбуждает PendSV, в котором собственно контекст и переключается. Без PendSV ничего никуда не перекинется.
|
|
|
|
|
May 24 2018, 12:03
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(jcxz @ May 24 2018, 14:11) Мне тоже она показалась слишком монстроидальной. Поэтому пользую uCOS-II - она полегче. Тоже смотрел в сторону uCOS, но уже uCOS-III. Но "вдруг" попалась под руки RTX Keil (теперь она кстати принадлежит ARM), сделана по-уму: все сервисы на SVC, т.е. именно так, как это рекомендуется самой АRM при проектировании ядра. Работает несколько быстрее FreeRTOS, размера занимает немного меньше. Сравнивал на одном и том же проекте.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 24 2018, 13:25
|
Знающий
Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088
|
Цитата(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. Хотя вру, не обязателен, вместо него может быть ожидание очереди или семафора, но что-то подобное обязано быть внутри бесконечного цикла каждой задачи.
--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка." Ф.Дзержинский.
|
|
|
|
|
May 24 2018, 14:14
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(jcxz @ May 24 2018, 16:59) Что значит "несколько быстрее"? Изменилась загрузка CPU? И на сколько (в %)? Да, загрузка меньше, буквально проценты, но конкретное значение сильно зависит от проекта. Т.е. если использутся очень много сервисов, то разница получается более заметная. Полагаю, что все дело в более оптимальной работе шедулера и самих сервисов. Точные замеры (профилирование) я не делал, ибо такой задачи себе не ставил. Просто, было принято решение выбора: соскакивать с FreeRTOS или остаться. Выбор пал на первое )) Ну и вторым доводом сыграло то, что мои проекты не привязаны к какой-то конкретной RTOS (раньше я об этом писал, использую "обертку"), но почти все проекты на ARM-Cortex. Поэтому тащить чудовищную универсальность в плане портов FreeRTOS для меня просто нет смысла. Но есть и минус (для меня): пока что нет у Segger порта для их SystemView под эту ось, но дойдут руки сам сделаю или на край дождусь пока на это созреет Segger. Порты SystemView на FreeRTOS и uCOS есть в комплекте, вполне рабочие. Правда порт SystemView под FreeRTOS пришлось немного допиливать - сыроват он был на тот момент ((
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 25 2018, 06:12
|
Гуру
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606
|
У меня было такое же мнение о вертикальной прокрутке. Но сейчас у меня противоложное мнение. Цитата нет нормальной FREE версии А J-link у вас настоящий? Тогда какая разница? Как в горизонтальной прокрутке вывести столько инфы:
|
|
|
|
|
May 25 2018, 06:17
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(uriy @ May 25 2018, 09:12) А J-link у вас настоящий? Тогда какая разница? Поясните, не пойму связи. J-link-ов в конторе много и нормальные и китай. Придет время купят и SystemView, но пока 1млн событий (ограничение free версии) хватает в любом нынешнем проекте. Цитата Как в горизонтальной прокрутке вывести столько инфы: В SystemView все события (текст) точно также выводятся c вертикальной прокруткой. Если щелкнуть на любое событие в окне терминала или событий, то на графике автоматом будет указано место. Удобно и главное - привычно: ось времени - X, слева направо. Никакой самодеятельности ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 25 2018, 07:31
|
Профессионал
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877
|
Цитата(Turnaev Sergey @ May 24 2018, 16:25) Я правильно понял, что в задачах нет вызовов vTaskDelay()? В таком случае они всегда будут подвешивать планировщик. Нет. Если задачи одного приоритета, они будут переключаться по кругу с периодом SYSTICK. Не самая лучшая идея, но работает. Заодно мы решили загадку топикстартера. Переключение задач у него не привязано к выполнению задачи никак, и в какой-то "счастливый" момент оно срабатывает посреди критической секции. Один раз. В общем, это никуда не годится. Если есть RTOS, надо ей пользоваться. Нужна задержка - delay() операционки. Нужно подождать, пока сработает прерывание - выкинуть вечный цикл с флажком, сделать очередь или семафор. Цитата(jcxz @ May 24 2018, 14:11) Нафига козе баян Зачем кста кубу это прерывание? Там своя ОС внутри уже что-ль? Классика. Пастернака не читал, но осуждаю. Извините.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|