Ограничение на вызов API-функций
из функции таймера
Так как функция таймера вызывается
из задачи обслуживания таймеров, а переход
последней в блокированное состояние и вы-
ход из него напрямую связан с отсчетом вре-
мени таймерами, то функция таймера никог-
да не должна пытаться заблокировать задачу
обслуживания прерываний, то есть вызывать
блокирующие API-функции.
Например, функция таймера никогда
не должна вызывать API-функции vTaskDelay()
и vTaskDelayUntil(), а также API-функции до-
ступа к очередям, семафорам и мьютексам
с ненулевым временем тайм-аута.
Очередь команд таймеров
Для совершения операций запуска, оста-
нова, сброса, изменения периода и удале-
ния таймеров во FreeRTOS предоставляется
набор API-функций, которые могут вызы-
ваться из задач и обработчиков прерываний,
а также из функций таймеров. Вызов этих
API-функций не воздействует напрямую
на задачу обслуживания таймеров. Вместо
этого он приводит к записи команды в оче-
редь, которую в дальнейшем мы будем на-
зывать очередью команд таймеров. Задача
обслуживания таймеров считывает команды
из очереди и выполняет их.
Таким образом, очередь команд выступа-
ет средством безопасного управления про-
граммными таймерами в многозадачной сре-
де, где программные таймеры играют роль
совместно используемого ресурса.
Очередь команд недоступна для прямого
использования в программе, доступ к ней
имеют только API-функции работы с тай-
мерами. Рис. 5 поясняет процесс передачи
команды от прикладной задачи к задаче об-
служивания программных таймеров.
Как видно на рис. 5, прикладная програм-
ма не обращается к очереди напрямую, вме-
сто этого она вызывает API-функцию сброса
таймера, которая помещает команду сброса
таймера в очередь команд программных тай-
меров. Задача обслуживания программных
таймеров считывает эту команду из очереди
и непосредственно сбрасывает таймер.
Важно, что таймер отсчитывает промежу-
ток времени с момента, когда была вызвана
соответствующая API-функция, а не с мо-
мента, когда команда была считана из очере-
ди. Это достигается за счет того, что в очередь
команд помещается информация о значении
счетчика системных квантов.
Достарыңызбен бөлісу: |