101
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 4 '2011
www.kite.ru
компоненты
микроконтроллеры
действия с четко фиксированной частотой и, следовательно, перио-
дом. API-функция
vTaskDelay() переводит задачу в блокированное
состояние на промежуток времени, который отсчитывается от мо-
мента вызова
vTaskDelay(). В случае реализации циклически повто-
ряющегося действия период его выполнения
dt3 будет складываться
из времени его выполнения
dt1 и задержки
dt2, создаваемой функци-
ей
vTaskDelay() (рис. 12).
Если стоит цель обеспечить циклическое выполнение с точно за-
данным периодом
dt3, то необходимо знать время выполнения тела
задачи
dt1, чтобы скорректировать величину задержки
dt2. Это созда-
ет дополнительные сложности.
Для таких целей предназначена API-функция
vTaskDelayUntil().
Программист в качестве ее параметра задает период
dT, который от-
считывается с момента
t1 — момента выхода задачи из блокирован-
ного состояния (рис. 13).
Прототип
функции vTaskDelayUntil():
void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );
Функции
vTaskDelayUntil() передаются следующие аргументы:
1.
pxPreviousWakeTime — указатель на переменную, в которой хра-
нится значение счетчика квантов в момент последнего выхода за-
дачи из блокированного состояния (момент времени
t1 на рис. 13).
Этот момент используется как отправная точка для отсчета вре-
мени, на которое задача переходит в блокированное состояние.
Переменная, на которую ссылается указатель
pxPreviousWakeTime,
автоматически обновляется функцией
vTaskDelayUntil(), поэтому
при типичном использовании эта переменная не должна моди-
фицироваться в теле задачи. Исключение составляет начальная
инициализация, как показано в примере ниже.
2.
xTimeIncrement — непосредственно задает период выполнения
задачи. Задается в квантах; для задания в миллисекундах может
использоваться макроопределение
portTICK_RATE_MS.
Типичное применение API-функции
vTaskDelayUntil() в теле
функции, реализующей задачу:
/*
Функция задачи, которая будет циклически выполняться с жестко заданным периодом в 50 мс */
void vTaskFunction( void *pvParameters )
{
/* Переменная, которая будет хранить
значение счетчика квантов
в момент выхода задачи из блокированного состояния */
portTickType xLastWakeTime;
/* Переменная xLastWakeTime нуждается в инициализации текущим значением счетчика квантов.
Это
единственный случай, когда ее значение задается явно.
В дальнейшем ее значение будет автоматически модифицироваться API-функцией vTaskDelayUntil(). */
xLastWakeTime = xTaskGetTickCount();
/* Бесконечный цикл */
for( ;; )
{
/* Какая-либо полезная работа */
/* ... */
/* Период выполнения этой задачи составит 50 мс.
Достарыңызбен бөлісу: