Event Flag Groups в Nucleus SE: Вводное руководство по конфигурации и использованию API
View the RTOS Revealed series
Event flag groups предоставляют легковесный, гибкий механизм для межзадачного взаимодействия в Nucleus SE, аналогичный сигналам но с более богатой функциональностью.
Использование Event Flags
В Nucleus SE event flags конфигурируются на этапе сборки. Максимум 16 групп может быть определено. Если ни одна не сконфигурирована, RTOS опускает все связанные структуры данных и API код.
Конфигурация Event Flag Groups
Количество Event Flag Groups
Конфигурация управляется #define директивами в nuse_config.h. Ключевой макрос NUSE_EVENT_GROUP_NUMBER задает, сколько групп приложение будет использовать (по умолчанию 0). Значения выше 16 или отрицательные триггерят compile-time #error, генерируемый nuse_config_check.h.
Установка ненулевого значения активирует event-flag подсистему: структуры данных аллоцируются и API enables рассматриваются.
API Enables
У каждого service call есть enable макрос в nuse_config.h:
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT
По умолчанию все FALSE, отключая соответствующие функции. Для использования API установите желаемые макросы в TRUE. Несоответствие (включение API пока NUSE_EVENT_GROUP_NUMBER это 0) вызывает compile-time ошибку, кроме NUSE_Event_Group_Count(), который всегда доступен.
Пример фрагмента из дефолтного nuse_config.h:
#define NUSE_EVENT_GROUP_NUMBER 0 /* Number of event groups – 0‑16 */ #define NUSE_EVENT_GROUP_SET FALSE /* Service call enabler */ #define NUSE_EVENT_GROUP_RETRIEVE FALSE /* Service call enabler */ #define NUSE_EVENT_GROUP_INFORMATION FALSE /* Service call enabler */ #define NUSE_EVENT_GROUP_COUNT FALSE /* Service call enabler */
Если ваш код ссылается на API, который не был включен, линкер выдаст ошибку, потому что реализация опущена.
Event Flag Service Calls
Nucleus SE предлагает семь service calls, связанных с event flags, хотя только четыре реализованы:
- NUSE_Event_Group_Set() — установить или очистить флаги.
- NUSE_Event_Group_Retrieve() — прочитать текущее состояние флагов.
- NUSE_Event_Group_Information() — запросить статус группы.
- NUSE_Event_Group_Count() — получить число сконфигурированных групп.
- Создание, удаление и перечисление групп не реализованы в SE.
Нет выделенной reset функции; группу можно сбросить в нули, используя NUSE_Event_Group_Set() с OR операцией на нулевой флаговой маске.
Операции Set и Retrieve
Поскольку event flags — биты, их лучше выражать как бинарные значения. Nucleus SE поставляет nuse_binary.h, который определяет макросы вроде b01010101 для каждого 8-битного паттерна.
Установка Event Flags
И RTOS, и SE экспонируют похожие APIs. RTOS прототип:
STATUS NU_Set_Events(NU_EVENT_GROUP *group, UNSIGNED event_flags, OPTION operation);
Параметры:
group— указатель на event-flag control block.event_flags— битмаска флагов для манипуляции.operation—NU_OR(установить) илиNU_AND(очистить).
Возвращаемые значения:
NU_SUCCESSNU_INVALID_GROUPNU_INVALID_OPERATION
SE эквивалент:
STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP group, U8 event_flags, OPTION operation);
Параметры и коды возврата зеркалят RTOS версию, с NUSE_SUCCESS, NUSE_INVALID_GROUP и NUSE_INVALID_OPERATION.
Implementation Highlights
Основная рутина проверяет operation и применяет маску:
NUSE_CS_Enter(); if (operation == NUSE_OR) { NUSE_Event_Group_Data[group] |= event_flags; } else { /* NUSE_AND */ NUSE_Event_Group_Data[group] &= event_flags; }
Когда блокировка включена (NUSE_BLOCKING_ENABLE), функция итерирует по всем задачам, будит любые, приостановленные на этой группе, и обновляет blocking counter. Послеward может произойти reschedule если активен priority scheduler.
Приостановленные задачи возобновляются, когда состояние флагов меняется, позволяя им оценить их wait условия.
Продолжить на страницу два >>
Встроенный
- Камерные замки (Cam Locks): как они скрыто запирают шкафы
- Что такое кольцевые винты (Eye Screws)? Профессиональное руководство по дизайну и применению
- Громметы: виды, применение и защита вашего оборудования
- Нержавеющая сталь: состав, производство и глобальное влияние
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Mailboxes в Nucleus SE: Практическое руководство по конфигурации и использованию
- Семафоры в Nucleus RTOS: Утилитарные сервисы и структуры данных
- Семафоры в Nucleus SE: Обзор, конфигурация и основы API
- Мастерство Event Flag Groups: Утилитарные сервисы и структуры данных в Nucleus RTOS/SE
- Queues в Nucleus SE: Введение и основные Service Calls