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

Эффективное межзадачное взаимодействие с Nucleus SE Signals

В этой серии RTOS Revealed мы исследуем signals — самый простой, низкозатратный метод межзадачного взаимодействия в Nucleus SE. Сигналы обеспечивают легковесную, надежную передачу сообщений между задачами.

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

В отличие от других kernel объектов, signals не автономны; они интринсично связаны с задачей и существуют только в контексте этой задачи. Когда signals включены в приложении, каждая задача автоматически получает набор из восьми бинарных сигнальных флагов.

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

Nucleus RTOS предлагает возможность, позволяющую задаче назначить callback для запуска, когда другая задача устанавливает один из её сигнальных флагов. Это аналогично interrupt service routine. К сожалению, эта фича недоступна в Nucleus SE; задачи должны явно опрашивать свои сигнальные флаги.

Конфигурация Signals

Signals конфигурируются в основном через #define директивы в nuse_config.h. Ключевой макрос — NUSE_SIGNAL_SUPPORT, который, когда установлен в TRUE, активирует поддержку сигналов во всем приложении. Число сигналов на задачу фиксировано в восьми; никакая дополнительная конфигурация не требуется.

Включение signals создает необходимые структуры данных и активирует релевантные API вызовы. Каждая API функция в Nucleus SE имеет свой enabling макрос. Для signals определены следующие enables:

NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE

По умолчанию оба установлены в FALSE, отключая соответствующие service calls и опуская любой код реализации. Для использования signals установите желаемые enables в TRUE. Неудача включить API при использовании вызов вызовет compile-time ошибку; использование нереализованного API вызовет link-time ошибку.

Пример фрагмента из nuse_config.h:

#define NUSE_SIGNAL_SUPPORT FALSE /* Enables support for signals */ #define NUSE_SIGNALS_SEND FALSE /* Service call enabler */ #define NUSE_SIGNALS_RECEIVE FALSE /* Service call enabler */

Signals Service Calls

Nucleus SE предоставляет четыре основных service call, связанных с signals. Только два реализованы в SE; остальные зарезервированы для RTOS но не SE.

Операции Send и Receive

Сигнальные флаги — биты, лучше визуализируемые как бинарные числа. Поскольку стандартный C не имеет бинарных литералов, Nucleus SE включает nuse_binary.h, который определяет макросы вроде b01010101 для всех 256 8-битных значений.

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

Отправка Signals

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

Nucleus RTOS API Call

STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);

Параметры:

Возвращает:

Nucleus SE API Call

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);

Параметры:

Возвращает:

Реализация NUSE_Signals_Send()

STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals){ #if NUSE_API_PARAMETER_CHECKING if (task >= NUSE_TASK_NUMBER){ return NUSE_INVALID_TASK; } #endif NUSE_CS_Enter(); NUSE_Task_Signal_Flags[task] |= signals; NUSE_CS_Exit(); return NUSE_SUCCESS; }

Получение Signals

Задача может читать только свои собственные сигнальные флаги, и операция деструктивна — флаги очищаются при чтении.

Nucleus RTOS API Call

UNSIGNED NU_Receive_Signals(VOID);

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

Nucleus SE API Call

U8 NUSE_Signals_Receive(void);

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

Реализация NUSE_Signals_Receive()

U8 NUSE_Signals_Receive(void){ U8 signals; NUSE_CS_Enter(); signals = NUSE_Task_Signal_Flags[NUSE_Task_Active]; NUSE_Task_Signal_Flags[NUSE_Task_Active] = 0; NUSE_CS_Exit(); return signals; }

Эти простые функции иллюстрируют, как Nucleus SE управляет signals эффективно без влияния на task blocking или scheduling.

Встроенный

  1. Эффективное межзадачное взаимодействие с Nucleus SE Signals
  2. Rutronik распространяет RS14100 от Redpine Signals: ультра‑низкопотребляющие, мульти‑протокольные безопасные беспроводные…
  3. Rutronik предлагает ультра‑низкопотребляющие мульти‑протокольные SoC от Redpine Signals
  4. Измерение магнитной сигнатуры ядра одиночного атома
  5. Искусственные нейронные сети повышают производительность беспроводной связи
  6. Гибкий ректенна из MoS₂ превращает Wi-Fi в электричество для малых устройств
  7. Квантовая схема детектирует слабейшие радиосигналы — отдельные фотоны
  8. Полупроводниковый лазер излучает микроволны и принимает радио: путь к ультрабыстрому Wi-Fi
  9. Алгоритм портаменто в реальном времени бесшовно объединяет любые два аудиосигнала
  10. Ключевые принципы проектирования RF и СВЧ печатных плат для надежной работы