osDelay() - Ожидание таймаута (временной задержки) в CMSIS-RTOS2
Wait for Timeout (Time Delay).
Ожидание таймаута (временной задержки).
osStatus_t osDelay (uint32_t ticks);
Параметры
Возвращаемое значение
Возможные возвращаемые значения:
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).