Содержание

TNKernel : Флаги

Введение

Флаг, как и семафор, является объектом RTOS, предназначенным для синхронизации задач. В отличие от семафора флаг не имеет счетчика свободных ресурсов, однако с каждым флагом ассоциирован элемент, называемый битовой маской. Битовая маска это переменная с разрядностью, равной, как правило, разрядности машинного слова. В TNKernel битовая маска флага имеет разрядность 16 бит для PIC24/dsPIC и 32 бита для ARM/PIC32.

Любая задача (или системное прерывание) может с помощью сервисов управления флагом установить или сбросить определенные биты в битовой маске, сигнализируя таким образом об определенном событии.

Задача может ожидать появления определенного набора битов в битовой маске. Как только битовая маска флага станет равна ожидаемой, задача перейдет в состояние готовых к выполнению.

В TNKernel существует два типа флагов. Первый тип подразумевает, что ожидать события (то есть определенного набора битов в маске флага) будет несколько задач. Второй тип разрешает прием события только одной задаче - в этом случае биты в маске могут быть сброшены средствами сервиса.

В сервис ожидания в качестве параметра передается аргумент, который указывает, какая логика будет использоваться для ожидания битовой маски: AND или OR. В первом случае задача будет переведена в состояние готовых к выполнению, если все ожидаемые биты будут установлены. Во втором случае - если хотя бы один из ожидаемых битов будет установлен.

В TNKernel будет запущена задача, которая стоит первой в очереди задач ожидающих флаг, вне зависимости от приоритетов задач в очереди.

Структура управления флагом

Каждый флаг ассоциируется со структурой управления:

typedef struct _TN_EVENT_S
{
    CDLL_QUEUE_S        wait_queue;
    TN_UWORD            attr;
    TN_UWORD            pattern;
    TN_OBJ_ID           id_event;
} TN_EVENT_S;

В состав структуры флага входят следующие элементы:

wait_queue Очередь задач, ожидающих флаг
attr Тип флага - для всех задач или для одной задачи
pattern Битовая маска флага
id_event Поле идентификации объекта как флага

Структура флага доступна только при определении TN_DEBUG. Тем не менее, прямой доступ к элементам структуры флага крайне не рекомендуется, так как это является вмешательством в работу планировщика и других сервисов RTOS.

Сервисы управления флагами

TNKernel имеет следующий набор функций (сервисов) для управления флагами:

Сервис Описание Свойства
Создание и удаление флага
  tn_event_create() Создание флага Разрешен вызов только в контексте задачи
  tn_event_delete() Удаление флага Разрешен вызов только в контексте задачи Может привести к переключению контекста
Установка и сброс битовой маски флага
  tn_event_set() Установка битов в битовой маске Разрешен вызов только в контексте задачи Может привести к переключению контекста
  tn_event_iset() Установка битов в битовой маске в прерывании Разрешен вызов только в прерывании Может привести к переключению контекста
  tn_event_clear() Сброс битов в битовой маске Разрешен вызов только в контексте задачи
  tn_event_iclear() Сброс битов в битовой маске в прерывании Разрешен вызов только в прерывании
Ожидание флага
  tn_event_wait() Ожидание флага Разрешен вызов только в контексте задачи Может привести к переключению контекста Сервис использует таймаут
  tn_event_iwait() Ожидание флага в прерывании Разрешен вызов только в прерывании
  tn_event_wait_polling() Ожидание флага без блокировки Разрешен вызов только в контексте задачи