Nucleus SE信号:高效任务间通信实战
在RTOS Revealed系列中,我们探索信号——Nucleus SE中最简单、低成本的任务间通信方法。信号实现任务间轻量、可靠的消息传递。
使用信号
与其他内核对象不同,信号非自主;它们内在关联任务,仅存在于该任务上下文中。应用启用信号时,每个任务自动获得八个二进制信号标志集。
任意任务可设置另一任务的信号标志。但仅拥有任务可读取和清除这些标志——且读取是破坏性的,即读取操作中标志被复位。无其他任务能检查或修改任务的信号状态。
Nucleus RTOS提供机制让任务指定回调,在另一任务设置其信号标志时运行。这类似中断服务程序。遗憾的是,此功能Nucleus SE不可用;任务必须显式轮询信号标志。
配置信号
信号主要通过nuse_config.h中#define指令配置。关键宏NUSE_SIGNAL_SUPPORT设为TRUE时,激活整个应用的信号支持。每任务信号数固定为八;无需额外配置。
启用信号创建必要数据结构并激活相关API调用。Nucleus SE每个API函数有专用启用宏。信号相关启用:
NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE
默认全为FALSE,禁用对应服务调用并省略实现代码。使用信号需将所需启用设为TRUE。未启用API而调用将导致编译时错误;使用未实现API导致链接时错误。
nuse_config.h示例片段:
#define NUSE_SIGNAL_SUPPORT FALSE /* 启用信号支持 */ #define NUSE_SIGNALS_SEND FALSE /* 服务调用启用器 */ #define NUSE_SIGNALS_RECEIVE FALSE /* 服务调用启用器 */
信号服务调用
Nucleus SE提供四个主要信号相关服务调用。仅两个在SE实现;其余保留给RTOS但SE无。
- 发送信号给指定任务 – NUSE_Signals_Send()
- 接收信号 – NUSE_Signals_Receive()
- 注册信号处理器 – SE未实现
- 启用/禁用信号 – SE未实现
发送与接收操作
信号标志是位,最佳可视化为二进制数。因标准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)
发送信号
任意任务可通过OR操作在另一任务上设置一个或多个信号标志——先前设置的标志保持不变。
Nucleus RTOS API调用
STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);
参数:
- task – 目标任务控制块指针
- signals – 要设置的信号标志值
返回:
- NU_SUCCESS – 调用成功
- NU_INVALID_TASK – 无效任务指针
Nucleus SE API调用
STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);
参数:
- task – 目标任务索引(ID)
- signals – 要设置的信号标志值
返回:
- NUSE_SUCCESS – 调用成功
- NUSE_INVALID_TASK – 无效任务索引
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; } 接收信号
任务只能读取自身信号标志,操作破坏性——读取时标志被清零。
Nucleus RTOS API调用
UNSIGNED NU_Receive_Signals(VOID);
返回当前信号标志值。
Nucleus SE API调用
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如何高效管理信号,不影响任务阻塞或调度。
嵌入式
- 人工神经网络提升无线通信性能
- 柔性整流天线将WiFi信号转电能:为微型设备供电新突破
- 量子电路突破极限:探测最微弱射频信号(单光子级)
- 半导体激光器实现微波收发:超高速Wi-Fi关键突破
- 实时滑音算法无缝融合任意两音频信号
- RF 与微波 PCB 设计核心原则:高频可靠性的基石
- Nucleus SE信号:高效任务间通信实战
- Rutronik 分销 Redpine Signals RS14100:超低功耗、多协议安全无线 MCU
- Rutronik 提供 Redpine Signals 超低功耗多协议 SoC
- 实时射频成像技术:远距离穿墙探测隐藏与高速移动目标
- 可拉伸传感器材料提升电子器件受拉性能
- 首次测量单个原子原子核的磁性特征