Nucleus SE事件标志组:配置与API使用入门指南
事件标志组在Nucleus SE中提供轻量、灵活的任务间通信机制,类似信号但功能更丰富。
使用事件标志
在Nucleus SE中,事件标志在构建时配置。最多可定义16组。若无配置,RTOS省略所有相关数据结构和API代码。
配置事件标志组
事件标志组数量
配置由nuse_config.h中#define指令驱动。关键宏NUSE_EVENT_GROUP_NUMBER设定应用使用组数(默认0)。超16或负值触发nuse_config_check.h产生的编译时#error。
设非零值激活事件标志子系统:分配数据结构、考虑API启用。
API启用
每个服务调用在nuse_config.h有启用宏:
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT 默认全为FALSE,禁用对应函数。使用API需将所需宏设为TRUE。不匹配(启用API而NUSE_EVENT_GROUP_NUMBER为0)导致编译时错误,除NUSE_Event_Group_Count()始终可用。
默认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,链接器将报错因实现被省略。
事件标志服务调用
Nucleus SE提供七个事件标志相关服务调用,仅四个实现:
- NUSE_Event_Group_Set() – 设置或清除标志。
- NUSE_Event_Group_Retrieve() – 读取当前标志状态。
- NUSE_Event_Group_Information() – 查询组状态。
- NUSE_Event_Group_Count() – 获取配置组数量。
- 创建、删除、枚举组在SE中未实现。
无专用重置函数;可用NUSE_Event_Group_Set()配合零标志掩码的OR操作将组重置为全零。
设置与检索操作
因事件标志是位,最好用二进制值表达。Nucleus SE附带nuse_binary.h,定义如b01010101等所有8位模式宏。
设置事件标志
RTOS和SE暴露相似API。RTOS原型:
STATUS NU_Set_Events(NU_EVENT_GROUP *group, UNSIGNED event_flags, OPTION operation); 参数:
group– 事件标志控制块指针。event_flags– 要操作的标志位掩码。operation–NU_OR(设置)或NU_AND(清除)。
返回值:
NU_SUCCESSNU_INVALID_GROUPNU_INVALID_OPERATION
SE等价版:
STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP group, U8 event_flags, OPTION operation); 参数和返回码镜像RTOS版,含NUSE_SUCCESS、NUSE_INVALID_GROUP、NUSE_INVALID_OPERATION。
实现亮点
核心例程检查operation应用掩码:
NUSE_CS_Enter(); if (operation == NUSE_OR) { NUSE_Event_Group_Data[group] |= event_flags; } else { /* NUSE_AND */ NUSE_Event_Group_Data[group] &= event_flags; } 启用阻塞(NUSE_BLOCKING_ENABLE)时,函数遍历所有任务,唤醒挂起在此组的任务,更新阻塞计数器。之后若优先级调度器激活可发生重调度。
挂起任务在标志状态变化后恢复,允许其评估等待条件。
继续阅读第二页 >>
嵌入式