You are here

FreeRTOS ИПП: vTaskDelay()

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

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

 

vTaskDelay()

Функция объявляется в файле task.h

void vTaskDelete( TaskHandle_t xTask );

Настройка INCLUDE_vTaskDelay в файле FreeRTOSConfig.h должна быть установлена в 1. Без этого функция недоступна.

Задержка задачи на заданное количество тиков. Реальное время, на которое задача будет заблокирована, зависит от частоты тиков ОСРВ. Константа portTICK_PERIOD_MS может быть использована для вычисления реального времени задержки (основываясь на частоте тиков ядра ОСРВ) с разрешением, равным периоду одного тика.

После вызова vTaskDelay() вызывающая задача будет заблокирована. В вызове vTaskDelay() указывается количество тиков, по истечении которых задача будет выполнена разблокировка задачи. Например, если в вызове указан период блокировки 100 тиков, задача будет находиться в заблокированном состоянии 100 тиков.

Но следует учесть, что вызов vTaskDelay не лучшим образом подходит для организации циклического выполнения тела задачи с определённым периодом выполнения. Дело в том, что помимо периодической задачи могут быть другие задачи с более высоким приоритетом, которые будут прерывать выполнение данной задачи. Кроме того могут выполняться обработчики прерываний. Это всё приводит к тому, что период повторения будет меняться непредсказуемым образом. Поэтому для организации повторяющихся вычислений с заданным периодом лучше использовать другую функцию ИПП - vTaskDelayUntil(), которая подходит как раз для таких случаев, поскольку в ней указывается абсолютное время, когда задача должна разблокироваться, а не относительное.

Параметры:

xTicksToDelay  Время, в тиках ядра ОСРВ, на которое задача должна быть заблокирована.

Возвращаемое значение:

Отсутствует.

Пример использования:

void vTaskFunction( void * pvParameters )
{
/* Блокировка задачи на 500мс. */
const TickType_t xDelay = 500 / portTICK_PERIOD_MS;

    for( ;; )
    {
        /* Просто переключаем состояни светодиода каждые 500мс, блокируя задачу на
        500мс между каждыми двумя переключениями. */
        vToggleLED();
        vTaskDelay( xDelay );
    };
}
Hobby's category: