osDelayUntil() - Ожидание таймаута (временной задержки) в абсолютном времени в CMSIS-RTOS2

Wait until specified time.

Ожидание таймаута (временной задержки) в абсолютном времени от заданой точки отсчета в тактах системного таймера (тиках).

osStatus_t  osDelayUntil  (uint32_t ticks);

Параметры

ticks
time ticks value
Значение абсолютного времени RTOS в тиках (тактах таймера операционной системы). Для формирования таймаута к текущему значению времени RTOS, полученного функцией osKernelGetTickCount(), добавляется требуемое время задержки в тиках.



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

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

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

 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);
    ...
  }
}