osDelayUntil() - Ожидание таймаута (временной задержки) в абсолютном времени в CMSIS-RTOS2
Wait until specified time.
Ожидание таймаута (временной задержки) в абсолютном времени от заданой точки отсчета в тактах системного таймера (тиках).
osStatus_t osDelayUntil (uint32_t ticks);
Параметры
Возвращаемое значение
Возможные возвращаемые значения:
osOK : выполняется временная задержка;
osErrorParameter : ошибка аргумента (нулевое значение);
osErrorISR : функция osDelayUntil() не может быть вызвана из процедуры обработки прерывания (ISR).
osError : не удаётся выполнить osDelayUntil(): не запущено ядро RTOS или не запущена задача.
Описание работы
До начала бесконечного цикла работы задачи необходимо, с помощью функции osKernelGetTickCount(), получить абсолютное время работы операционной системы (тип uint32_t) в тиках.
В бесконечном цикле перед вызовом osDelayUntil() к абсолютному времени операционной системы прибавить требуемое время задержки. Полученное значение передать как аргумент функции osDelayUntil() и сохранить в качестве нового абсолютного времени для формирования следующего таймаута. Этот процесс будет повторятся циклически при каждом запуске задачи.
Отсчет времени задержки не зависит от момента вызова функции osDelayUntil(). Время разблокировки задачи фиксировано и определяется только абсолютным временем RTOS и заданным шагом.
Переполнение счетчика тиков ядра обрабатывается корректно, пользователю не надо предпринимать никаких действий.
Время задержки ограничено только разрядностью 32-битного числа и не может превышать 232-1.
Алгоритм работы osDelayUntil():
1. Фиксирует (однократно, вне бесконечного цикла задачи) абсолютное время операционной системы.
2. Определяет время разблокировки задачи как сумму зафиксированного абсолютного времени RTOS и время задержки (всё измеряется в тиках). Для следующего шага переопределяет зафиксированное абсолютное время как время разблокировки задачи.
3. Останавливает выполнение текущей задачи и переводит её в состояние Заблокировано (Blocked).
4. Управление передаётся планировщику для вызова первой задачи из очереди задач. Если очередь пуста - будет вызвана задача простоя (Idle Task)
5. Когда время операционной системы достигнет времени разблокировки задачи, задача переводится из состояния Заблокировано (Blocked), в состояние готовности (Ready) и в соответствии с установленным приоритетом:
- если у задачи не самый высший приоритет, она помещается в конец очереди своего приоритета;
- если у задачи высший приоритет (нет задач с более высоким или равным приоритетом), она немедленно вызывается планировщиком на выполнение (состояние Running).
6. Возврщается на п.2
Примеры использования
#include "cmsis_os2.h"
void Task_01 (void *arg) { //- функция задачи
uint32_t tick;
tick = osKernelGetTickCount(); //- абсолютное время RTOS в тиках
...
for (;;) {
tick += 1000u; //- время задержки
osDelayUntil (tick);
...
}
}