Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511

Работа FreeRTOS в системах жесткого реалтайма

21.04.2021, 06:59. Показов 6588. Ответов 34

Студворк — интернет-сервис помощи студентам
Есть проект, использующий FreeRTOS, но в котором необходимо откликаться на внешнее прерывание в минимальное время. Т.е. своего рода проект с жеским реалтаймом. Столкнулся с проблемой, что на FreeRTOS пока не могу это реализовать.
Основная проблема в том, что есть планировщик, который каждую миллисекунду берет управление себе и проверяет кому его передать. Что своего рода прерывает код, и в этот момент может наступить внешнее прерывание EXTI1, которое будет отложено до окончания работы планировщика. Время работы планировщика, время переключения между задачами/прерываниями я не замерял, но вычитал, что это порядка единиц мксек, что довольно много.
По сути мне надо разбить код на две части:
1 часть - это обработка EXTI1 и обработка прерываний 4 каналов от таймера
2 часть - это весь остальной код, там так же есть прерывания, задачи и тд, но это уже не требует такого жесткого реалтайма
Вопрос в том, как это можно сделать без вреда для работы ОС?
Задать приоритет EXTI1 и прерывания таймера выше приоритета планировщика, но не приведет ли это к сбою FreeRTOS?
На рисунке зеленым это то, что должно выполняться моментально вне зависимости от того, чем занят процессор, остальное может прерываться и работать в штатном режиме ОС
Рисунок немного неправильно нарисован, естественно, что когда наступает EXTI1 и EXTI от таймера 1 весь код прервется (TASK1, TASK2)
Миниатюры
Работа FreeRTOS в системах жесткого реалтайма  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2021, 06:59
Ответы с готовыми решениями:

Работа АЦП по таймеру во FREERTOS stm32
Столкнулся с такой проблемой: не работает АЦП по таймеру во FREERTOS. Есть проект, сгенерированный в CubeMX, там настроено: FREERTOS, LWIP,...

Одновременная работа LWIP и USB HS FreeRTOS STM32F407
Такая проблема, есть задачи которые должен решать контроллер - прочитать файл с USB флешки и передать его по Ethernet Ethernet отдельно...

Работа с гитом на двух операционных системах
Добрый день! на компе установил две операционки - windows и ubuntu. на винде делаю проект, иницировал в соответствующем каталоге гит,...

34
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
22.04.2021, 13:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
А вот приоритет прерывания относительно задачи?
Это "параллельные" приоритеты. То есть прерывания вызываются сами по себе, соотносно своим приоритетам, а задачи переключаются, соответственно своим приоритетам, при вызове системного клика ОСи. Но пересечение этих двух миров и происходит в функциях *_ISR(), которые резолвят атомарность доступа к ресурсам, при вложенности прерываний (с одной стороны) и взаимодействия с задачами (с другой).
1
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
22.04.2021, 14:15
Лучший ответ Сообщение было отмечено DmitryDDDD как решение

Решение

DmitryDDDD,
Создал проект в кубе по вашим скринам. Так вот Cube не делает TIM1 системным таймером для ОС. Таймер для ОС по дефолту SysTick и из куба вы его не измените.
То что вы настроили SYS Timebase таймер - это просто таймер который в прерывании инкрементирует переменную - но он никак не работает с ОС.
Если вы не поленитесь, и полазите по проекту то найдете такие строки
в файле FreeRTOSConfig_template.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   0xf
 
/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
 
/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY   ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY  ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
Эти строки намекают, что приоритет ядра равен 0xF.
Далее вы увидите строки:
C
1
2
3
4
5
6
7
8
9
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
   standard names. */
#define vPortSVCHandler    SVC_Handler
#define xPortPendSVHandler PendSV_Handler
 
/* IMPORTANT: FreeRTOS is using the SysTick as internal time base, thus make sure the system and peripherials are
              using a different time base (TIM based for example).
 */
#define xPortSysTickHandler SysTick_Handler
Что намекает на то, что в качестве xPortSysTickHandler используется SysTick_Handler.

Теперь поищем, где же используется
C
1
configLIBRARY_LOWEST_INTERRUPT_PRIORITY
И найдем переопределение в port.c:
C
1
#define portNVIC_SYSTICK_PRI                ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
Ищем дальше:
C
1
2
3
    /* Make PendSV and SysTick the lowest priority interrupts. */
    portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
    portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
Смотрим, что же это за регистр сакой:
/* Constants required to manipulate the core. Registers first... */
C
1
2
3
4
#define portNVIC_SYSTICK_CTRL_REG           ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
#define portNVIC_SYSTICK_LOAD_REG           ( * ( ( volatile uint32_t * ) 0xe000e014 ) )
#define portNVIC_SYSTICK_CURRENT_VALUE_REG  ( * ( ( volatile uint32_t * ) 0xe000e018 ) )
#define portNVIC_SYSPRI2_REG                ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )
Идем в документацию на ядро и смотрим, что же у нас там по адресу 0xe000ed20:
0xE000ED20 SHPR3 RW Privileged 0x00000000 System handler priority register 3
Смотрим, что там

Бинго, регистр установки приоритета прерываний SysTick.
На всякий случай смотрим, что у нас там по адресам 0xe000e010:

А там не что иное как системный таймер.

Выводы: Куб генерит источник тактирования для ОС - SysTick. Timebase в разделе SYS не имеет никакого отношения к ОС.
Приоритет ядра configLIBRARY_LOWEST_INTERRUPT_PRIORITY равен 0xF (или 15), что при 4 битном приоритете является минимальным из возможных. Любое прерывание которое имеет приоритет выше - прервет ОС. Приоритет прерываний с системными вызовами FreeRTOS configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIO RITY равен 5. Соответсвенно все прерывания которые используют API ОС должны иметь приоритет от 5 до 15 и могут прерывать ядро. Все прерывания 0 до 5 не должны использовать API ОС, они могут прерывать всё и ядро и прерывания с системными вызовами.
1
 Аватар для COKPOWEHEU
4139 / 2717 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
23.04.2021, 10:47
Цитата Сообщение от Voland_ Посмотреть сообщение
DmitryDDDD, когда речь идет о переключении контекста задач, думаю, приоритет действительно должен быть наивысшим.
Не думаю что это хорошая идея. Что и куда должен переключить таскменеджер если вклинился в чужое прерывание? Хуже того: переключаемая задача окажется в контексте прерывания, то есть со всеми правами ядра (если это разделение в контроллере вообще есть) и запрещенными прерываниями.
То есть обработчик прерывания, длящийся миллисекунды!
Нет уж, пусть у переключателя задач будет минимальный приоритет: прерывания быстро куда хотят вклиниваются, быстро отрабатывают и быстро возвращают все как было, юзерский код и таскменеджер даже не заметят что там что-то возникало.
1
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
23.04.2021, 11:55  [ТС]
_SayHello,
Цитата Сообщение от _SayHello Посмотреть сообщение
Выводы: Куб генерит источник тактирования для ОС - SysTick. Timebase в разделе SYS не имеет никакого отношения к ОС.
Приоритет ядра configLIBRARY_LOWEST_INTERRUPT_PRIORITY равен 0xF (или 15), что при 4 битном приоритете является минимальным из возможных. Любое прерывание которое имеет приоритет выше - прервет ОС. Приоритет прерываний с системными вызовами FreeRTOS configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIO RITY равен 5. Соответсвенно все прерывания которые используют API ОС должны иметь приоритет от 5 до 15 и могут прерывать ядро. Все прерывания 0 до 5 не должны использовать API ОС, они могут прерывать всё и ядро и прерывания с системными вызовами.
Спасибо, очень доступно объяснено
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
23.04.2021, 12:07
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не думаю что это хорошая идея.
Да, все верно, я не про то подумал. Просто в FreeRTOS есть два таймера. Один переключает в прерывании контекст задач, другой считает время. И этот "второй" действительно имеет самый высокий приоритет, чтобы не пропустить отсчет времени. И в HAL этот хендлер достаточно большой: https://github.com/STMicroelec... 3741-L3931

Скорее всего большинство кода из него выкидывается линкером, но это не точно. Если это действительно мешает - нужно либо сделать как я чуть выше предложил, либо изменить хендлер прерывания так, чтобы он делал только то, что от него требуется. У меня этот хендлер выглядит так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
  * @brief This function handles TIM1 break interrupt and TIM9 global interrupt.
  */
void TIM1_BRK_TIM9_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_BRK_TIM9_IRQn 0 */
 
  ulTotalRunTime++;
 
  /* USER CODE END TIM1_BRK_TIM9_IRQn 0 */
  HAL_TIM_IRQHandler(&htim9);
  /* USER CODE BEGIN TIM1_BRK_TIM9_IRQn 1 */
 
  /* USER CODE END TIM1_BRK_TIM9_IRQn 1 */
}
Добавлено через 5 минут
..у меня в одном из проектов этот `HAL_TIM_IRQHandler` занимает 366 байт. Не много, конечно, однако, как для самой высокоприоритетной задачи - вполне ощутимо
0
 Аватар для COKPOWEHEU
4139 / 2717 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
23.04.2021, 12:15
Цитата Сообщение от Voland_ Посмотреть сообщение
И в HAL этот хендлер достаточно большой:
Потому что это HAL. Уверен, если переписать его по-человечески, объем уменьшится раза в 3 а то и больше.
Цитата Сообщение от Voland_ Посмотреть сообщение
Один переключает в прерывании контекст задач, другой считает время. И этот "второй" действительно имеет самый высокий приоритет
Довольно странно. Таймеры у stm32 жирные, там можно чуть ли не раз в секунду ловить переполнения даже без предделителя, то есть измеряя при этом время с точностью до такта.
HAL_TIM_PWM_PulseFinishedCallback(htim);
Это что, ШИМ? В системном таймере? Их ардуинщики покусали?
.
Видимо, задач они на этот таймер повесили много...
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
23.04.2021, 12:17  [ТС]
Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
Да, все верно, я не про то подумал. Просто в FreeRTOS есть два таймера. Один переключает в прерывании контекст задач, другой считает время. И этот "второй" действительно имеет самый высокий приоритет, чтобы не пропустить отсчет времени.
Я так понимаю речь идет о System tick timer и TIM1 (в моем случае) в Вашем - TIM9. Причет последний и считает время.
Если Вы хотите обойти коллбэк этого таймера в HAL, то что Вы делаете потом с переменной ulTotalRunTime++;? И в таком случае HAL_TIM_IRQHandler(&htim9); надо закомментировать?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
23.04.2021, 12:41
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Если Вы хотите обойти коллбэк этого таймера в HAL, то что Вы делаете потом с переменной ulTotalRunTime++;? И в таком случае HAL_TIM_IRQHandler(&htim9); надо закомментировать?
Ну, если на этом таймере больше ничего не планируется и нет никаких настроенных колл-беков - вызов HAL хендлера можно комментировать. Пока не вижу никаких проблем.
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
23.04.2021, 12:50  [ТС]
Voland_, Ну просто так же нельзя его закомментировать, надо заменить ему функционал чем-то? В Вашем случае это, видимо, ulTotalRunTime++; Только где эта переменная дальше используется?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
23.04.2021, 13:59
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
где эта переменная дальше используется?
1) в VSCode вы можете нажать Ctrl+Shift+F и найти все включения 'ulTotalRunTime' в исходниках проекта. Ну, или что-то типа
Bash
1
grep -r 'ulTotalRunTime' .
Насколько я понял, переменная используется для определения времени работы задачи. На что именно это влияет (кроме таблицы загрузки ЦП) - не углублялся.

Добавлено через 15 минут
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
надо заменить ему функционал чем-то?
не надо.

PS: в большом количестве случаев хендлер ничего и не делает - он просто пробегает по флагам таймера, убеждается что они все не выставлены, и ничего не вызывает. Все это легко убирается на compile-time либо link-time, вот только разрабам от ST это все пофигу, как и раньше, в их SPL. Я давно на них чертыхаюсь, по этому поводу тоже . Поэтому, прошу считать мое мнение субьективным, и можно даже сказать - предвзятым, (как конкурента) .
0
 Аватар для COKPOWEHEU
4139 / 2717 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
23.04.2021, 14:18
Цитата Сообщение от Voland_ Посмотреть сообщение
как конкурента
Можно поподробнее?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
23.04.2021, 14:50
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
поподробнее?
...эм...

Не по теме:

это не значит, что я пишу библиотеки для платформ ST параллельно с их разрабами, нет ). Но... есть много других платформ, под которые пишутся программные платформы

0
 Аватар для COKPOWEHEU
4139 / 2717 / 433
Регистрация: 09.09.2017
Сообщений: 12,050
23.04.2021, 14:53
То есть "конкурент" только в том смысле что пишете свои слои абстракции вместо ST-шных? Ну в этом смысле и я им конкурент
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
23.04.2021, 20:11
Цитата Сообщение от _SayHello Посмотреть сообщение
Создал проект в кубе по вашим скринам. Так вот Cube не делает TIM1 системным таймером для ОС. Таймер для ОС по дефолту SysTick и из куба вы его не измените.
Как так не дает
может задействован куда?
0
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511
24.04.2021, 07:06  [ТС]
_SayHello, ValeryS, Не, там TIM1 можно выбрать, откуда это пошло я уже не помню, возможно отсюда
https://narodstream.ru/stm-uro... y-chast-1/
https://narodstream.ru/stm-uro... free-rtos/
Я в коде потом проверял, каждую милисекунду срабатывает прерывание от этого таймера (по-моему от этого таймера..., подзабыл уже), планировщик видимо заведен на него
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2021, 07:06

Одинакова ли совершаемая данной силой работа в двух инерциальных системах отсчета?
Насколько я понял, одинакова. Только вот преподаватель требует объяснения, как пояснить? Заранее благодарен.

Медленная работа жесткого диска
Недавно вырубали свет и примерно с этого момента жесткий диск начал издавать звуки и очень медленно работать. Сам диск работает где-то...

Работа жесткого диска в фоне.
Обычно люди жалуются, что у них постоянно мигает желтая лампочка. Я же, наоборот, обеспокоен тем, что когда жесткий диск некоторое время не...

Слышна работа жесткого дисках в колонках
Всем добрый день! Помогите решить проблему... В студийных мониторах слышна работа жесткого диска(треск скрежет, потрескивание), в общем все...

Работа с unsigned long long int на 32-битных системах
В программе испольуется тип данных unsigned long int, но в некоторых (хотя и очень редких) случаях этого диапазона может быть недостаточно....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru