Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Task Control API Functions - vTaskDelay()
Назад: [vTaskDelete()] | Вверх: [ИПП: Управление задачами] | Вперёд: [vTaskDelayUntil()] |
Функция объявляется в файле 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 );
};
}