You are here

FreeRTOS ИПП: vTaskDelayUntil()

Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Control API Functions - vTaskDelayUntil()

Назад: [vTaskDelay()] Вверх: [ИПП: Управление задачами] Вперёд: [uxTaskPriorityGet()]

 

vTaskDelayUntil()

Функция объявляется в файле 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 );

         // Выполнение требуемых периодических действий.
     }
 }
Hobby's category: