Эффективное межзадачное взаимодействие с 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.
- Отправить сигналы указанной задаче – NUSE_Signals_Send()
- Получить сигналы – NUSE_Signals_Receive()
- Зарегистрировать signal handler – не реализован в SE
- Включить/отключить signals – не реализован в 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);
Параметры:
- task — указатель на control block целевой задачи
- signals — значение сигнальных флагов для установки
Возвращает:
- NU_SUCCESS — вызов успешен
- NU_INVALID_TASK — недействительный task pointer
Nucleus SE API Call
STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);
Параметры:
- task — task index (ID) целевой задачи
- signals — значение сигнальных флагов для установки
Возвращает:
- NUSE_SUCCESS — вызов успешен
- NUSE_INVALID_TASK — недействительный task index
Реализация 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.
Встроенный
- Эффективное межзадачное взаимодействие с Nucleus SE Signals
- Rutronik распространяет RS14100 от Redpine Signals: ультра‑низкопотребляющие, мульти‑протокольные безопасные беспроводные…
- Rutronik предлагает ультра‑низкопотребляющие мульти‑протокольные SoC от Redpine Signals
- Измерение магнитной сигнатуры ядра одиночного атома
- Искусственные нейронные сети повышают производительность беспроводной связи
- Гибкий ректенна из MoS₂ превращает Wi-Fi в электричество для малых устройств
- Квантовая схема детектирует слабейшие радиосигналы — отдельные фотоны
- Полупроводниковый лазер излучает микроволны и принимает радио: путь к ультрабыстрому Wi-Fi
- Алгоритм портаменто в реальном времени бесшовно объединяет любые два аудиосигнала
- Ключевые принципы проектирования RF и СВЧ печатных плат для надежной работы