112
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 3 '2011
компоненты
микроконтроллеры
но тайм-аутом. То есть если ожидаемое внеш-
нее событие не наступило в течение тайм-аута,
то задача возвращается в состояние готовности
к выполнению. Это предотвращает «подвиса-
ние» задачи при ожидании внешнего события,
которое по каким-то причинам никогда не на-
ступит. Блокированная задача не получает про-
цессорного времени.
Приостановленная (suspended) задача так-
же не получает процессорного времени, од-
нако, в отличие от блокированного состоя-
ния, переход в приостановленное состояние
и выход из него осуществляется в явном
виде вызовом API-функций
vTaskSuspend()
и
xTaskResume(). Тайм-аут для приостанов-
ленного состояния не предусмотрен, и задача
может оставаться приостановленной сколь
угодно долго [5].
В любой
программе реального вре-
мени есть как менее, так и более ответствен-
ные задачи. Под «ответственностью» задачи
здесь понимается время реакции программы
на внешнее событие, которое обрабатывает-
ся задачей. Например, ко времени реакции
на срабатывание датчика в производственной
установке предъявляются куда более строгие
требования, чем ко времени реакции на на-
жатие клавиши на клавиатуре. Для обеспече-
ния преимущества на выполнение более от-
ветственных задач во FreeRTOS применяется
механизм приоритетов задач (Task priorities).
Среди всех задач, находящихся в состоянии
готовности, планировщик отдаст управление
той задаче, которая имеет наивысший приори-
тет. Задача будет выполняться до тех пор, пока
она не будет блокирована или приостановлена
или пока не появится готовая к выполнению
задача с более высоким приоритетом.
Каждой задаче назначается приоритет от 0
до (
configMAX_PRIORITIES — 1). Меньшее
значение приоритета соответствует меньшему
приоритету. Наиболее низкий приоритет у за-
дачи «бездействие», значение которого опреде-
лено в
tskIDLE_PRIORITY как 0. Изменяя зна-
чение
configMAX_PRIORITIES, можно опре-
делить любое число возможных приоритетов,
однако уменьшение
configMAX_PRIORITIES
позволяет уменьшить объем ОЗУ, потребляе-
мый ядром.
Задачи в FreeRTOS реализуются в виде Си-
функций. Обязательное требование к функ-
ции, реализующей задачу: она должна иметь
один аргумент типа указатель на void и ни-
чего не возвращать (void). Указатель на та-
кую функцию определен как
pdTASK_CODE.
Каждая задача — это небольшая программа
со своей точкой входа, которая содержит бес-
конечный цикл:
void ATaskFunction( void *pvParameters )
{
/* Переменные могут быть объявлены здесь, как и в обычной
функции. Каждый экземпляр этой
задачи будет иметь свою
собственную копию переменной iVariableExample. Если
объявить переменную со спецификатором static, то будет
создана только одна
переменная iVariableExample,
доступная из всех экземпляров задачи */
int iVariableExample = 0;
/* Тело задачи реализовано как бесконечный цикл */
for( ;; )
{
/* Код, реализующий функциональность задачи */
}
/* Если все-таки произойдет выход из бесконечного цикла,
то задача должна быть уничтожена ДО конца функции.
Параметр NULL обозначает,
что уничтожается задача,
вызывающая API-функцию vTaskDelete() */
vTaskDelete( NULL );
}
З а д ач и с о з д а ю т с я A P I - ф у н к ц и е й
Достарыңызбен бөлісу: