osDelay() - Ожидание таймаута (временной задержки) в CMSIS-RTOS2

Wait for Timeout (Time Delay).

Ожидание таймаута (временной задержки).

osStatus_t  osDelay  (uint32_t ticks);

Параметры

ticks
time ticks value
Значение времени задержки в тиках (тактах таймера операционной системы).



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

osStatus_t
ThreadID identifies the thread
Код статуса, указывающий на состояние выполнения функции.

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

 osOK :  выполняется временная задержка;

 osErrorParameter :  ошибка аргумента (нулевое значение);

 osErrorISR :  функция osDelay() не может быть вызвана из процедуры обработки прерывания (ISR).

 osError :  не удаётся выполнить osDelay(): не запущено ядро RTOS или не запущена задача.




Описание работы

Функция osDelay останавливает выполнение задачи как минимум на время, указанного в тактах (тиках) таймера операционной системы. Отсчет ведётся от момента вызова функции osDelay до ближайшего по счету тика, указанного в качестве параметра функции.

 osDelay(0) -  [проверить, разночтение в документации] RTOS не блокирует задачу, а сразу переводит её в состояние готовности (Ready); или - вызывает ошибку аргумента (нулевое значение): osErrorParameter

 osDelay(1) -  RTOS блокирует задачу, ожидает до первого ближайшего тика и переводит её в состояние готовности (Ready).

 osDelay(2) -  RTOS блокирует задачу, ожидает до второго ближайшего тика и переводит её в состояние готовности (Ready).

...

 osDelay(osWaitForever) -  RTOS блокирует задачу навсегда и ожидает какого-либо внешнего события, возвращающего задачу в состояние готовности (Ready).

osWaitForever - определён макросом как беззнаковое целое:

#define  osWaitForever   0xFFFFFFFFu

Пример ожидания с арументом функции равным 2.

Алгоритм работы osDelay():

 1.  Останавливает выполнение текущей задачи и переводит её в состояние Заблокировано (Blocked).

 2.  Управление передаётся планировщику для вызова первой задачи из очереди задач. Если очередь пуста - будет вызвана задача простоя (Idle Task)

 3.  По истечении заданного времени задача переводится из состояния Заблокировано (Blocked), в состояние готовности (Ready) и в соответствии с установленным приоритетом:

 -  если у задачи не самый высший приоритет, она помещается в конец очереди своего приоритета;

 -  если у задачи высший приоритет (нет задач с более высоким или равным приоритетом), она немедленно вызывается планировщиком на выполнение (состояние Running).