Компоненты и технологии • №2 '2011 компоненты


Ограничение на вызов API-функций



Pdf көрінісі
бет116/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   112   113   114   115   116   117   118   119   ...   129
Kurniz

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


Достарыңызбен бөлісу:
1   ...   112   113   114   115   116   117   118   119   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет