Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial Internet of Things >> Встроенный

Группы флагов событий:введение и базовые услуги


Посмотреть серию раскрытых ОСРВ

Группы флагов событий были представлены в предыдущей статье. В 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 поддерживает семь вызовов служб, относящихся к флагам событий, которые обеспечивают следующие функции:

Подробно рассматривается реализация каждого из этих сервисных вызовов.

Следует отметить, что функция сброса не предусмотрена (ни в 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;  

Если какие-либо задачи приостановлены (извлечение из) этой группы флагов событий, все они возобновляются. Когда у них есть возможность выполнить, что зависит от планировщика, они могут определить, были ли выполнены их условия возврата - см. Получение флагов событий ниже.

Перейти на вторую страницу>>


Встроенный

  1. Введение в кулачковые замки и принцип их работы
  2. Введение в глазные винты и принцип их действия
  3. Введение в люверсы и принципы их работы
  4. Знакомство с нержавеющей сталью и ее производством
  5. Базовый ввод и вывод C#
  6. Почтовые ящики:введение и основные услуги
  7. Семафоры:служебные службы и структуры данных
  8. Семафоры:введение и базовые услуги
  9. Группы флагов событий:служебные службы и структуры данных
  10. Очереди:введение и базовые услуги