====== 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~~