95
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 10 '2011
www.kite.ru
компоненты
микроконтроллеры
реализация программных
таймеров во FreeRTOS
Функция таймера
При срабатывании таймера автоматиче-
ски происходит вызов функции таймера.
Функция таймера реализуется в программе
в виде функции языка Си, она должна иметь
следующий прототип:
void vTimerCallbackFunction( xTimerHandle xTimer );
В отличие от функций, реализующих за-
дачи и сопрограммы, функция таймера
не должна содержать бесконечного цикла.
Напротив, ее выполнение должно происхо-
дить как можно быстрее:
void vTimerCallbackFunction( xTimerHandle xTimer )
{
// Код функции таймера
return;
}
Единственный аргумент функции тай-
мера — дескриптор таймера, срабатывание
которого привело к вызову этой функции.
Функция таймера является функцией обрат-
ного вызова (Callback function), это значит,
что ее вызов происходит автоматически.
Программа не должна содержать явные вы-
зовы функции таймера. Дескриптор таймера
автоматически копируется в аргумент функ-
ции таймера при ее вызове и может быть ис-
пользован в теле функции таймера для опе-
раций с этим таймером.
Указатель на функцию таймера задан в виде
макроопределения tmrTIMER_CALLBACK.
Задача обслуживания
программных таймеров
Немаловажно и то, что механизм програм-
мных таймеров фактически не является частью
ядра FreeRTOS. Все программные таймеры
в программе отсчитывают время и вызывают
свои функции за счет того, что в программе
выполняется одна дополнительная сервисная
задача, которую в дальнейшем мы будем на-
зывать задачей обслуживания программных
таймеров. Вызов функции таймера выполняет
именно задача обслуживания таймеров.
Задача обслуживания таймеров недоступ-
на программисту напрямую (нет доступа к ее
дескриптору), она автоматически создается
во время запуска планировщика, если на-
стройки FreeRTOS предусматривают исполь-
зование программных таймеров.
Большую часть времени задача обслужи-
вания таймеров пребывает в блокированном
состоянии, она разблокируется лишь тогда,
когда будет вызвана API-функция работы
с таймерами или сработал один из таймеров.
Достарыңызбен бөлісу: |