Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Control API Functions - vTaskDelayUntil()
Назад: [vTaskDelay()] | Вверх: [ИПП: Управление задачами] | Вперёд: [uxTaskPriorityGet()] |
Функция объявляется в файле task.h
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,
const TickType_t xTimeIncrement );
Настройка INCLUDE_vTaskDelayUntil в файле FreeRTOSConfig.h должна быть установлена в 1. Без этого функция недоступна.
Функция vTaskDelayUntil() обеспечивает задержку выполнения задачи до указанного времени. Эта функция может быть использована в периодических задачах для обеспечения постоянной частоты выполнения.
Эта функция имеет одно важное отличие от vTaskDelay(). Функция vTaskDelay() выполняет блокировку задачи на определённое количество тиков относительно момента вызова. А vTaskDelayUntil() задаёт абсолютное время разблокировки задачи.
vTaskDelay () вызовет блокировку задачи на указанное количество тиков с момента вызова vTaskDelay(). Поэтому vTaskDelay() сложно использовать для реализации фиксированной частоты повторения выполнения задачи. Это связано с тем, что задача может пойти по другому ветвлению алгоритма, либо будет прервана выполнением другой задачи или прерыванием. И время, затраченное задачей до следующего вызова vTaskdelay(), будет разным на разных проходах алгоритма.
Ещё раз: vTaskDelay() блокирует выполнение задачи на определённое количество тиков, а vTaskDelay() до определённого тика.
Следует отметить, что функция vTaskDelayUntil() возвращает управление немедленно (без блокирования задачи), если для разблокировки указывается время, которе уже было в прошлом. Поэтому задача, использующая vTaskDelayUntil() для периодического выполнения, должна будет повторно рассчитать время своего пробуждения, если периодическое выполнение было прервано по какой-либо причине. Например - если задача была приостановлена на какое-то время. В этом случае задача пропустит одно или несколько своих периодических выполнений. Эта ситуация может быт обнаружена путём проверки переменной, переданной по ссылке в качестве параметра pxPreviousWakeTime, по текущему значению тиков ОС. Однако в большинстве сценариев использования этого не требуется.
Параметры:
pxPreviousWakeTime | Указатель на переменную, содержащую время последней разблокировки задачи. Перед первым использованием переменная должна быть инициализирована текущим временем, как в примере ниже. После этого переменная будет автоматически обновляться внутри vTaskDelayUntil(). |
xTimeIncrement |
Время до следующей разблокировки задачи. Т.е. время периода цикла. Задача будет разблокирована в момент времени (*pxPreviousWakeTime + xTimeIncrement). Если вызывать функцию vTaskDelayUntil с одним и тем же значением параметра xTimeIncrement, то задача будет выполняться (разблокироваться) с фиксированным периодом. |
Возвращаемое значение:
Отсутствует.
Пример использования:
// Выполнение некоторых действий каждые 10 тиков ОС.
void vTaskFunction( void * pvParameters )
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 10;
// Инициализируем переменную xLastWakeTime значением текущего времени ОС.
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
// Ожидание момента следующего повтора выполнения задачи.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
// Выполнение требуемых периодических действий.
}
}