Флаг, как и семафор, является объектом RTOS, предназначенным для синхронизации задач. В отличие от семафора флаг не имеет счетчика свободных ресурсов, однако с каждым флагом ассоциирован элемент, называемый битовой маской. Битовая маска это переменная с разрядностью, равной, как правило, разрядности машинного слова. В TNKernel битовая маска флага имеет разрядность 16 бит для PIC24/dsPIC и 32 бита для ARM/PIC32.
Любая задача (или системное прерывание) может с помощью сервисов управления флагом установить или сбросить определенные биты в битовой маске, сигнализируя таким образом об определенном событии.
Задача может ожидать появления определенного набора битов в битовой маске. Как только битовая маска флага станет равна ожидаемой, задача перейдет в состояние готовых к выполнению.
В TNKernel существует два типа флагов. Первый тип подразумевает, что ожидать события (то есть определенного набора битов в маске флага) будет несколько задач. Второй тип разрешает прием события только одной задаче - в этом случае биты в маске могут быть сброшены средствами сервиса.
В сервис ожидания в качестве параметра передается аргумент, который указывает, какая логика будет использоваться для ожидания битовой маски: AND или OR. В первом случае задача будет переведена в состояние готовых к выполнению, если все ожидаемые биты будут установлены. Во втором случае - если хотя бы один из ожидаемых битов будет установлен.
Каждый флаг ассоциируется со структурой управления:
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() | Ожидание флага без блокировки |