一、机制定义
Event 是一种用于任务间状态通知的同步机制。 事件触发方负责报告某个条件已经发生,等待方则在需要时等待该条件, 并在事件满足等待条件后继续执行。
根据当前 HRTOS 实现说明,事件使用资源结构 OS_RES 中的状态字段与等待信息组织事件状态和等待任务。 具体实现涉及 value、 wait_mask 和 wait_cnt 等字段。
二、核心接口
当前事件机制涉及以下接口。它们的具体返回值、参数约束、 资源编号规则及失败处理方式,应以 HRTOS 对应版本的头文件和实现为准。
接口职责概览
- 初始化: os_event_init() 用于事件资源的初始化。
- 删除: os_event_delete() 用于执行事件资源相关的删除操作。是否同时清除事件状态, 需要以实际实现为准。
- 查询: os_event_query() 用于查询事件相关状态,具体返回语义以接口定义为准。
- 触发: os_event_write() 用于写入或触发事件。
- 等待: os_event_wait() 用于等待事件,并通过 tick 参数表达等待时间约束;具体超时语义以实现为准。
三、内部实现机制
根据当前提供的实现描述,事件机制通过资源结构保存事件状态, 并记录正在等待该事件的任务信息。
- value: 事件状态标志。具体取值与状态转换规则以实现为准。
- wait_mask: 等待任务位图,用于记录与该事件关联的等待任务。
- wait_cnt: 等待数量相关字段,用于维护等待任务的统计信息。
事件触发
根据现有实现说明,触发事件时会进入临界区,更新事件状态, 检查等待任务位图,并调用相应的任务唤醒处理逻辑。 完成相关处理后,再恢复中断状态。
事件等待
等待方调用事件等待接口后,需要根据事件当前状态决定后续行为。 如果条件已经满足,可以按接口定义直接返回; 如果条件尚未满足,则进入等待机制,等待事件触发或等待条件结束。
四、执行流程
等待流程
触发流程
五、机制特性与使用边界
状态通知
适合表达某个条件发生、操作完成或状态发生变化, 而不是传输具体的数据内容。
等待与唤醒
可以将任务等待条件与事件触发联系起来, 减少任务仅为检查条件而反复轮询的需要。
多任务协调
实际可唤醒的任务数量、唤醒规则与调度行为, 由事件实现和等待机制共同决定。
超时约束
等待接口提供 tick 参数。超时单位、边界条件与返回结果 应以当前版本接口定义为准。
六、典型应用场景
- 外设操作完成通知: 在满足相应调用约束的情况下,由操作完成处理路径通知等待任务。
- 中断与任务协作: 将事件作为通知手段,使任务在需要时等待某个中断相关条件。
- 状态机推进: 当某个条件满足后通知任务继续执行下一阶段逻辑。
- 多个任务的状态协调: 当多个任务需要关注同一个状态时,可评估使用事件进行同步。
七、事件与其他通信机制的区别
事件与信号量
事件通常用于表达某种状态或条件; 信号量通常用于同步操作或表达可用资源数量。 两者的具体行为仍取决于 HRTOS 的实际实现。
事件与消息队列
事件侧重于通知某个条件发生, 消息队列则用于在发送方与接收方之间传递消息内容。 如果任务必须获取数据本身,仅有事件通知通常并不足够, 还需要相应的数据传递或共享机制。
事件与互斥锁
事件侧重状态通知与等待; 互斥锁侧重对共享资源的互斥访问。 如果需要保护共享数据,不应将事件通知本身当作互斥保护。
八、总结
事件机制是 HRTOS 任务间通信体系中的一种同步手段。 理解它时,重点不只是记住接口名称,还应明确事件状态如何变化、 等待任务如何登记、触发后如何唤醒,以及超时与调度如何配合。
阅读实现时,建议优先核对事件资源初始化与删除、 状态更新、等待队列维护、任务唤醒及临界区处理, 从而把接口行为与内核执行路径联系起来。