Группы флагов событий:введение и базовые услуги
Посмотреть серию раскрытых ОСРВ
Группы флагов событий были представлены в предыдущей статье. В Nucleus SE они чем-то похожи на сигналы, но обладают большей гибкостью. Они предоставляют недорогие, но гибкие средства передачи простых сообщений между задачами.
Использование флагов событий
В Nucleus SE флаги событий настраиваются во время сборки. Для приложения может быть настроено не более 16 групп флагов событий. Если группы флагов событий не настроены, в приложение не включаются никакие структуры данных или код вызова службы, относящиеся к группам флагов событий.
Группа флагов событий - это просто набор из восьми 1-битных флагов, доступ к которым контролируется, чтобы их можно было безопасно использовать в нескольких задачах. Одна задача может установить или сбросить любую комбинацию флажков событий. Другая задача может считывать группу флагов события в любое время или может ждать (опрос или приостановка) определенного шаблона флагов.
Настройка групп флагов событий
Количество групп флагов событий
Как и в большинстве аспектов Nucleus SE, конфигурация групп флагов событий в основном контролируется #define . операторы в nuse_config.h . Ключевой параметр: NUSE_EVENT_GROUP_NUMBER . , который определяет, сколько групп флагов событий настроено для приложения. По умолчанию установлено значение 0 (т. Е. Группы флагов событий не используются), и вы можете установить для него любое значение до 16. Ошибочное значение приведет к ошибке времени компиляции, которая генерируется тестом в nuse_config_check. h (он включен в nuse_config.c и, следовательно, скомпилирован с этим модулем), что приводит к ошибке #error выписка составляется.
Выбор ненулевого значения является «основным включением» для групп флагов событий. Это приводит к тому, что некоторые структуры данных определяются и имеют соответствующие размеры, о которых мы поговорим позже в этой серии. Он также активирует настройки включения API.
Включает API
Каждая функция API (вызов службы) в Nucleus SE имеет разрешающий #define символ в nuse_config.h . Для групп флагов событий это:
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT
По умолчанию для всех них установлено значение FALSE . , таким образом отключая каждый вызов службы и запрещая включение любого кода реализации. Чтобы настроить группы флагов событий для приложения, вам необходимо выбрать вызовы API, которые вы хотите использовать, и установить для их символов включения значение ИСТИНА . .
Вот выдержка из файла nuse_config.h по умолчанию файл.
#define NUSE_EVENT_GROUP_NUMBER 0 / * Количество групп событий в системе - 0-16 * / #define NUSE_EVENT_GROUP_SET FALSE / * Включатель сервисного вызова * / #define NUSE_EVENT_GROUP_RETRIEVE FALSE / * Включатель сервисного вызова * / #define NUSE_EVENT_GROUP_INFORMATION FALSE / * Включатель сервисного вызова * / #define NUSE_EVENT_GROUP_COUNT FALSE / * Включатель сервисного вызова * /
Ошибка времени компиляции приведет к тому, что функция API группы флагов событий включена и группы флагов событий не настроены (за исключением NUSE_Event_Group_Count () что всегда разрешено). Если в вашем коде используется вызов API, который не был включен, возникнет ошибка времени связывания, поскольку в приложение не будет включен код реализации.
Вызовы службы отметки события
Nucleus RTOS поддерживает семь вызовов служб, относящихся к флагам событий, которые обеспечивают следующие функции:
-
Установить флаги событий. Реализуется с помощью NUSE_Event_Group_Set () в Nucleus SE.
-
Получить флаги событий. Реализуется с помощью NUSE_Event_Group_Retrieve () в Nucleus SE.
-
Предоставляет информацию об указанной группе флагов событий. Реализуется с помощью NUSE_Event_Group_Information () в Nucleus SE.
-
Возвращает количество групп флагов событий, настроенных (в настоящее время) для приложения. Реализуется NUSE_Event_Group_Count () в Nucleus SE.
-
Добавить новую группу флагов событий в приложение (создать). Не реализовано в Nucleus SE.
-
Удалить группу флагов событий из приложения (удалить). Не реализовано в Nucleus SE.
-
Возвращает указатели на все группы флагов событий (в настоящее время) в приложении. Не реализовано в Nucleus SE.
Подробно рассматривается реализация каждого из этих сервисных вызовов.
Следует отметить, что функция сброса не предусмотрена (ни в Nucleus RTOS, ни в Nucleus SE). Это сделано намеренно. Сброс подразумевает, что преобладает особое условие. Для группы флагов событий единственным «особым» условием будут все нули, которые можно установить с помощью NUSE_Event_Group_Set () .
Установка группы флагов событий и получение служб
Основные операции, которые могут выполняться над группой флагов событий, - это установка одного или нескольких флагов и получение текущих состояний флагов. Nucleus RTOS и Nucleus SE предоставляют по два основных вызова API для этих операций, которые будут обсуждаться здесь.
Поскольку флаги событий являются битами, их лучше всего отображать в виде двоичных чисел. Поскольку стандартный C не поддерживает представление двоичных констант (только восьмеричное и шестнадцатеричное), дистрибутив Nucleus SE включает полезный файл заголовка - nuse_binary.h - который содержит #define символы вида b01010101 для всех 256 8-битных значений.
Установка флагов событий
Вызов API Nucleus RTOS для установки флагов событий очень гибок, позволяя устанавливать и очищать флаги событий с помощью И и ИЛИ операции. Nucleus SE предоставляет ту же услугу, за исключением того, что приостановка задачи не является обязательной.
Вызов API Nucleus RTOS для установки флага
Прототип сервисного вызова:
STATUS NU_Set_Events (группа NU_EVENT_GROUP *, UNSIGNED event_flags,
OPTION операция);
Параметры:
группа - указатель на пользовательский блок управления группой флагов событий
event_flags - битовое значение шаблона флагов, с которыми нужно работать
операция - операция, которую нужно выполнить; может быть NU_OR (для установки флагов) или NU_AND (для снятия флажков)
Возврат:
NU_SUCCESS - звонок был успешно завершен
NU_INVALID_GROUP - указатель группы флагов события недействителен
NU_INVALID_OPERATION - указанная операция не была NU_OR или NU_AND
Вызов Nucleus SE API для установки флага
Этот вызов API поддерживает ключевые функции Nucleus RTOS API.
Прототип сервисного вызова:
STATUS NUSE_Event_Group_Set (группа NUSE_EVENT_GROUP,
U8 event_flags, OPTION операция);
Параметры:
группа - индекс (ID) группы событий, в которой должны быть установлены / сброшены флаги
event_flags - битовое значение шаблона флагов, с которыми нужно работать
операция - операция, которую нужно выполнить; может быть NUSE_OR (для установки флагов) или NUSE_AND (для снятия флажков)
Возврат:
NUSE_SUCCESS - звонок был успешно завершен
NUSE_INVALID_GROUP - недействительный индекс группы флагов событий
NUSE_INVALID_OPERATION - указанная операция не была NUSE_OR или NUSE_AND
Реализация установки флагов событий в Nucleus SE
Исходный код NUSE_ Event_Group_Set () Функция API - после проверки параметров - является обычным явлением, независимо от того, включена ли поддержка блокировки (приостановки задачи) вызовов API. Логика довольно проста:
NUSE_CS_Enter (); if (operation ==NUSE_OR) {NUSE_Event_Group_Data [group] | =event_flags;} else / * NUSE_AND * / {NUSE_Event_Group_Data [group] &=event_flags;}
Битовая комбинация, event_flags , просто объединяется ИЛИ или И в указанную группу флагов событий.
Оставшийся код включается только в том случае, если включена блокировка задач:
#if NUSE_BLOCKING_ENABLE while (NUSE_Event_Group_Blocking_Count [группа]! =0) { Индекс U8; / * проверяем, заблокированы ли какие-либо задачи * / / * в этой группе событий * / for (index =0; index{ if ((LONIB (NUSE_Task_Status [индекс]) == NUSE_EVENT_SUSPEND) &&(HINIB (NUSE_Task_Status [index]) ==группа)) { NUSE_Task_Blocking_Return [index] =NUSE_SUCCESS; NUSE_Task_Status [индекс] =NUSE_READY; перерыв; } } NUSE_Event_Group_Blocking_Count [группа] -; } #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER NUSE_Reschedule (NUSE_NO_TASK); #endif #endif NUSE_CS_Exit (); return NUSE_SUCCESS;
Если какие-либо задачи приостановлены (извлечение из) этой группы флагов событий, все они возобновляются. Когда у них есть возможность выполнить, что зависит от планировщика, они могут определить, были ли выполнены их условия возврата - см. Получение флагов событий ниже.
Перейти на вторую страницу>>
Встроенный
- Введение в кулачковые замки и принцип их работы
- Введение в глазные винты и принцип их действия
- Введение в люверсы и принципы их работы
- Знакомство с нержавеющей сталью и ее производством
- Базовый ввод и вывод C#
- Почтовые ящики:введение и основные услуги
- Семафоры:служебные службы и структуры данных
- Семафоры:введение и базовые услуги
- Группы флагов событий:служебные службы и структуры данных
- Очереди:введение и базовые услуги