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

Сигналы

В этой раскрытой ОСРВ я собираюсь рассмотреть сигналы, которые представляют собой простейший метод межзадачного взаимодействия, поддерживаемый Nucleus SE. Они обеспечивают очень дешевое средство передачи простых сообщений между задачами.

Использование сигналов

Сигналы отличаются от всех других типов объектов ядра тем, что они не автономны - сигналы связаны с задачами и не имеют независимого существования. Если сигналы настроены для приложения, каждая задача имеет набор из восьми сигнальных флагов.

Любая задача может подавать сигналы о другой задаче. Только задача владельца может читать сигналы. Чтение является деструктивным, то есть сигналы сбрасываются в процессе чтения. Никакая другая задача не может считывать или очищать сигналы задачи.

В Nucleus RTOS есть средство, которое позволяет задаче назначать функцию, которая запускается, когда другая задача устанавливает один или несколько своих сигнальных флагов. Это в некоторой степени аналогично программе обслуживания прерывания. Эта возможность не поддерживается в Nucleus SE; Задачи должны явно запрашивать свои сигнальные флаги.

Настройка сигналов

Как и в большинстве аспектов Nucleus SE, конфигурация сигналов в первую очередь контролируется #define . операторы в nuse_config.h . Ключевой параметр: NUSE_SIGNAL_SUPPORT . , что включает средство (для всех задач в приложении). Нет вопроса об указании количества сигналов - есть просто набор из восьми флагов для каждой задачи в приложении.

Установка этого параметра включения - это «главное разрешение» для сигналов. Это приводит к тому, что структура данных определяется и имеет соответствующий размер, о чем будет подробнее рассказано далее в этой статье. Он также активирует настройки включения API.

Включает API

Каждая функция API (вызов службы) в Nucleus SE имеет разрешающий #define символ в nuse_config.h . Для сигналов это:

  NUSE_SIGNALS_SENDNUSE_SIGNALS_RECEIVE  

По умолчанию оба параметра имеют значение FALSE . , таким образом отключая каждый вызов службы и запрещая включение любого кода реализации. Чтобы настроить сигналы для приложения, вам необходимо выбрать вызовы API, которые вы хотите использовать, и установить для их разрешающих символов значение ИСТИНА . .

Вот выдержка из файла nuse_config.h по умолчанию файл:

  #define NUSE_SIGNAL_SUPPORT FALSE / * Включает поддержку сигналов * / # define NUSE_SIGNALS_SEND FALSE / * Активатор сервисного вызова * / # define NUSE_SIGNALS_RECEIVE FALSE / * Сервисный звонок * /  

Ошибка времени компиляции приведет к тому, что функция API сигналов включена, а средство сигналов не включено. Если в вашем коде используется вызов API, который не был включен, возникнет ошибка времени связывания, поскольку в приложение не будет включен код реализации. Конечно, включение двух функций API в некоторой степени избыточно, поскольку не было бы смысла включать поддержку сигналов и не иметь этих API-интерфейсов. Включения включены для совместимости с другими функциями Nucleus SE.

Обращения в службу сигналов

Nucleus RTOS поддерживает четыре служебных вызова, относящихся к сигналам, которые обеспечивают следующие функции:

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

Службы отправки и получения сигналов

Основные операции, которые могут быть выполнены с набором сигналов задачи, - это отправка данных в нее (что может быть выполнено любой задачей) и чтение данных из нее (и, таким образом, очистка данных, что может быть выполнено только владельцем) . Nucleus RTOS и Nucleus SE предоставляют по два основных вызова API для этих операций, которые будут обсуждаться здесь.

Поскольку флаги сигналов являются битами, их лучше всего отображать в виде двоичных чисел. Поскольку стандарт C исторически не поддерживает представление двоичных констант (только восьмеричных и шестнадцатеричных), дистрибутив Nucleus SE включает полезный файл заголовка - nuse_binary.h - который содержит #define символы вида b01010101 для всех 256 8-битных значений. Вот выдержка из nuse_binary.h файл:

 #define b00000000 ((U8) 0x00) #define b00000001 ((U8) 0x01) #define b00000010 ((U8) 0x02) #define b00000011 ((U8) 0x03) #define b00000100 ((U8) 0x04) #define b00000101 ((U8) 0x05) 

Отправка сигналов

Любая задача может посылать сигналы любой другой задаче в приложении. Отправка сигналов включает установку одного или нескольких сигнальных флагов. Это операция ИЛИ, которая не влияет на установленные ранее флаги.

Вызов API Nucleus RTOS для отправки сигналов

Прототип сервисного вызова:

STATUS NU_Send_Signals (задача NU_TASK *, сигналы UNSIGNED);

Параметры:

задача - указатель на блок управления задачи, которой принадлежат устанавливаемые сигнальные флаги

сигналы - значение устанавливаемых сигнальных флагов

Возврат:

NU_SUCCESS - звонок был успешно завершен

NU_INVALID_TASK - указатель задачи недействителен

Вызов Nucleus SE API для отправки сигналов

Этот вызов API поддерживает ключевые функции Nucleus RTOS API.

Прототип сервисного вызова:

STATUS NUSE_Signals_Send (задача NUSE_TASK, сигналы U8);

Параметры:

задача - индекс (ID) задачи, которой принадлежат устанавливаемые сигнальные флаги

сигналы - значение устанавливаемых сигнальных флагов

Возврат:

NUSE_SUCCESS - звонок был успешно завершен

NUSE_INVALID_TASK - указатель задачи недействителен

Реализация отправки сигналов в Nucleus SE

Вот полный код для NUSE_Signals_Send () функция:

  STATUS NUSE_Signals_Send (задача NUSE_TASK, сигналы U8) {#if NUSE_API_PARAMETER_CHECKING if (task> =NUSE_TASK_NUMBER) {return NUSE_INVALID_TASK; } #endif NUSE_CS_Enter (); NUSE_Task_Signal_Flags [задача] | =сигналы; NUSE_CS_Exit (); return NUSE_SUCCESS;}  

Код очень простой. После проверки любого параметра значения сигналов объединяются в сигнальные флаги заданной задачи по ИЛИ. Блокировка задач не имеет отношения к сигналам.

Получение сигналов

Задача может читать только собственный набор сигнальных флагов. Процесс их чтения деструктивен; т.е. это также приводит к сбросу флагов.

Вызов API Nucleus RTOS для приема сигналов

Прототип сервисного вызова:

НЕПОДПИСАННЫЙ NU_Receive_Signals (VOID);

Параметры:нет

Возвращает:значение флагов сигналов

Вызов API Nucleus SE для приема сигналов

Этот вызов API поддерживает ключевые функции Nucleus RTOS API.

Прототип сервисного вызова:

U8 NUSE_Signals_Receive (недействительно);

Параметры:нет

Возвращает:значение сигнальных флагов

Реализация приема сигналов в Nucleus SE

Вот полный код для NUSE_Signals_Receive () функция:

  U8 NUSE_Signals_Receive (void) {сигналы U8; NUSE_CS_Enter (); сигналы =NUSE_Task_Signal_Flags [NUSE_Task_Active]; NUSE_Task_Signal_Flags [NUSE_Task_Active] =0; NUSE_CS_Exit (); ответные сигналы;}  

Код очень простой. Значение флагов копируется, исходное значение очищается, и функция API возвращает копию. Блокировка задач не имеет отношения к сигналам.


Встроенный

  1. Сигналы
  2. Rutronik:беспроводные микроконтроллеры со сверхнизким энергопотреблением от Redpine Signals
  3. Rutronik:многопротокольные беспроводные SoC и модули от Redpine Signals
  4. Обнаружение магнетизма ядра одиночного атома
  5. Искусственная нейронная сеть может улучшить беспроводную связь
  6. Новое гибкое устройство может преобразовывать сигналы WiFi в электричество
  7. Новая схема обнаруживает самые слабые радиосигналы, разрешенные квантовой механикой
  8. Лазеры теперь могут излучать микроволны и принимать внешние радиочастотные сигналы
  9. Новый алгоритм плавно смешивает любые два аудиосигнала
  10. Рекомендации по проектированию ВЧ и СВЧ