Компоненты и технологии • №2 '2011 компоненты


API-функция vTaskDelayUntil ()



Pdf көрінісі
бет27/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   23   24   25   26   27   28   29   30   ...   129
Kurniz

API-функция vTaskDelayUntil ()
API-функция vTaskDelayUntil() служит для 
тех же целей, что и vTaskDelay(), — для пере-
вода задачи в блокированное состояние на за-
данное время. Однако она имеет некоторые 
особенности, позволяющие с меньшими уси-
лиями реализовать циклическое выполнение 
кода задачи с точно заданным периодом.
Часто перед программистом стоит зада-
ча циклического выполнения какого-либо 
рис. 10. Результат работы учебной программы № 2
рис. 11. Разделение процессорного времени между задачами в учебной программе № 2


101
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 4 '2011
www.kite.ru
компоненты
микроконтроллеры
действия с четко фиксированной частотой и, следовательно, перио-
дом. API-функция vTaskDelay() переводит задачу в блокированное 
состояние на промежуток времени, который отсчитывается от мо-
мента вызова vTaskDelay(). В случае реализации циклически повто-
ряющегося действия период его выполнения dt3 будет складываться 
из времени его выполнения dt1 и задержки dt2, создаваемой функци-
ей vTaskDelay() (рис. 12).
Если стоит цель обеспечить циклическое выполнение с точно за-
данным периодом dt3, то необходимо знать время выполнения тела 
задачи dt1, чтобы скорректировать величину задержки dt2. Это созда-
ет дополнительные сложности.
Для таких целей предназначена API-функция vTaskDelayUntil()
Программист в качестве ее параметра задает период dT, который от-
считывается с момента t1 — момента выхода задачи из блокирован-
ного состояния (рис. 13).
Прототип функции vTaskDelayUntil():
void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );
Функции vTaskDelayUntil() передаются следующие аргументы:
1. pxPreviousWakeTime — указатель на переменную, в которой хра-
нится значение счетчика квантов в момент последнего выхода за-
дачи из блокированного состояния (момент времени t1 на рис. 13). 
Этот момент используется как отправная точка для отсчета вре-
мени, на которое задача переходит в блокированное состояние. 
Переменная, на которую ссылается указатель pxPreviousWakeTime
автоматически обновляется функцией vTaskDelayUntil(), поэтому 
при типичном использовании эта переменная не должна моди-
фицироваться в теле задачи. Исключение составляет начальная 
инициализация, как показано в примере ниже.
2. xTimeIncrement — непосредственно задает период выполнения 
задачи. Задается в квантах; для задания в миллисекундах может 
использоваться макроопределение portTICK_RATE_MS.
Типичное применение API-функции vTaskDelayUntil() в теле 
функции, реализующей задачу:
/* Функция задачи, которая будет циклически выполняться с жестко заданным периодом в 50 мс */
void vTaskFunction( void *pvParameters )
{
/* Переменная, которая будет хранить значение счетчика квантов
в момент выхода задачи из блокированного состояния */
portTickType xLastWakeTime;
/* Переменная xLastWakeTime нуждается в инициализации текущим значением счетчика квантов.
Это единственный случай, когда ее значение задается явно.
В дальнейшем ее значение будет автоматически модифицироваться API-функцией vTaskDelayUntil(). */
xLastWakeTime = xTaskGetTickCount();
/* Бесконечный цикл */
for( ;; )
{
/* Какая-либо полезная работа */
/* ... */
/* Период выполнения этой задачи составит 50 мс.

Достарыңызбен бөлісу:
1   ...   23   24   25   26   27   28   29   30   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет