====== TNKernel : Флаги ====== ===== Введение ===== //Флаг//, как и [[tnkernel:ref:sem:intro|семафор]], является объектом RTOS, предназначенным для синхронизации задач. В отличие от семафора флаг не имеет счетчика свободных ресурсов, однако с каждым флагом ассоциирован элемент, называемый //битовой маской//. Битовая маска это переменная с разрядностью, равной, как правило, разрядности машинного слова. В TNKernel битовая маска флага имеет разрядность 16 бит для PIC24/dsPIC и 32 бита для ARM/PIC32. Любая задача (или системное прерывание) может с помощью [[tnkernel:ref:event:intro#Сервисы управления флагами|сервисов управления флагом]] установить или сбросить определенные биты в битовой маске, сигнализируя таким образом об определенном событии. Задача может ожидать появления определенного набора битов в битовой маске. Как только битовая маска флага станет равна ожидаемой, задача перейдет в состояние готовых к выполнению. В TNKernel существует два типа флагов. Первый тип подразумевает, что ожидать события (то есть определенного набора битов в маске флага) будет несколько задач. Второй тип разрешает прием события только одной задаче - в этом случае биты в маске могут быть сброшены средствами сервиса. В сервис ожидания в качестве параметра передается аргумент, который указывает, какая логика будет использоваться для ожидания битовой маски: AND или OR. В первом случае задача будет переведена в состояние готовых к выполнению, если //все// ожидаемые биты будут установлены. Во втором случае - если //хотя бы один// из ожидаемых битов будет установлен. В TNKernel будет запущена задача, которая стоит первой в очереди задач ожидающих флаг, вне зависимости от приоритетов задач в очереди. ~~UP~~ ===== Структура управления флагом ===== Каждый флаг ассоциируется со структурой управления: typedef struct _TN_EVENT_S { CDLL_QUEUE_S wait_queue; TN_UWORD attr; TN_UWORD pattern; TN_OBJ_ID id_event; } TN_EVENT_S; В состав структуры флага входят следующие элементы: {| class = "fpl" |- | ''wait_queue'' | Очередь задач, ожидающих флаг |- | ''attr'' | Тип флага - для всех задач или для одной задачи |- | ''pattern'' | Битовая маска флага |- | ''id_event'' | Поле идентификации объекта как флага |} Структура флага доступна только при определении ''TN_DEBUG''. Тем не менее, прямой доступ к элементам структуры флага крайне не рекомендуется, так как это является вмешательством в работу планировщика и других сервисов RTOS. ~~UP~~ ===== Сервисы управления флагами ===== TNKernel имеет следующий набор функций (сервисов) для управления флагами: ^ Сервис ^ Описание ^ Свойства ^ | **Создание и удаление флага** ||| | \ \ [[tnkernel:ref:event:tn_event_create|tn_event_create()]] | Создание флага | {{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} | | \ \ [[tnkernel:ref:event:tn_event_delete|tn_event_delete()]] | Удаление флага | {{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} {{tnkernel:ref:attr_call_ct_sw.png|Может привести к переключению контекста}} | | **Установка и сброс битовой маски флага** ||| | \ \ [[tnkernel:ref:event:tn_event_set|tn_event_set()]] | Установка битов в битовой маске | {{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} {{tnkernel:ref:attr_call_ct_sw.png|Может привести к переключению контекста}} | | \ \ [[tnkernel:ref:event:tn_event_iset|tn_event_iset()]] | Установка битов в битовой маске в прерывании | {{tnkernel:ref:attr_call_int.png|Разрешен вызов только в прерывании}} {{tnkernel:ref:attr_call_ct_sw.png|Может привести к переключению контекста}} | | \ \ [[tnkernel:ref:event:tn_event_clear|tn_event_clear()]] | Сброс битов в битовой маске | {{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} | | \ \ [[tnkernel:ref:event:tn_event_iclear|tn_event_iclear()]] | Сброс битов в битовой маске в прерывании | {{tnkernel:ref:attr_call_int.png|Разрешен вызов только в прерывании}} | | **Ожидание флага** ||| | \ \ [[tnkernel:ref:event:tn_event_wait|tn_event_wait()]] | Ожидание флага | {{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} {{tnkernel:ref:attr_call_ct_sw.png|Может привести к переключению контекста}} {{tnkernel:ref:attr_call_to.png|Сервис использует таймаут}} | | \ \ [[tnkernel:ref:event:tn_event_iwait|tn_event_iwait()]] | Ожидание флага в прерывании | {{tnkernel:ref:attr_call_int.png|Разрешен вызов только в прерывании}} | | \ \ [[tnkernel:ref:event:tn_event_wait_polling|tn_event_wait_polling()]] | Ожидание флага без блокировки | {{tnkernel:ref:attr_call_task.png|Разрешен вызов только в контексте задачи}} | ~~UP~~