返回 IPC 通信机制 核心模块 / 任务间通信
HRTOS / 任务间通信

事件机制(Event)

事件机制用于表达和通知系统中的特定状态。 任务可以等待某个事件发生,由其他任务或符合接口调用条件的中断处理程序触发事件, 从而完成异步通知与任务同步。 与消息队列不同,事件的核心是状态通知,而不是传递一段数据。

状态同步 任务唤醒 事件通知 IPC

一、机制定义

Event 是一种用于任务间状态通知的同步机制。 事件触发方负责报告某个条件已经发生,等待方则在需要时等待该条件, 并在事件满足等待条件后继续执行。

根据当前 HRTOS 实现说明,事件使用资源结构 OS_RES 中的状态字段与等待信息组织事件状态和等待任务。 具体实现涉及 value、 wait_mask 和 wait_cnt 等字段。

理解重点: 事件表达的是条件或状态通知。它不应被直接理解为消息队列, 也不应在没有确认实现细节的情况下,假设每次事件触发都会对应一次独立的数据传递。

二、核心接口

当前事件机制涉及以下接口。它们的具体返回值、参数约束、 资源编号规则及失败处理方式,应以 HRTOS 对应版本的头文件和实现为准。

os_event_init(u8 id) os_event_delete(u8 id) os_event_query(u8 id) os_event_write(u8 id) os_event_wait(u8 id, u16 tick)

接口职责概览

  • 初始化: os_event_init() 用于事件资源的初始化。
  • 删除: os_event_delete() 用于执行事件资源相关的删除操作。是否同时清除事件状态, 需要以实际实现为准。
  • 查询: os_event_query() 用于查询事件相关状态,具体返回语义以接口定义为准。
  • 触发: os_event_write() 用于写入或触发事件。
  • 等待: os_event_wait() 用于等待事件,并通过 tick 参数表达等待时间约束;具体超时语义以实现为准。
注意: 不要将事件删除与事件状态复位直接视为同一操作。 如果当前版本没有独立的复位接口,应根据实际源码确认事件状态的清除方式。

三、内部实现机制

根据当前提供的实现描述,事件机制通过资源结构保存事件状态, 并记录正在等待该事件的任务信息。

OS_RES[obj].value OS_RES[obj].wait_mask OS_RES[obj].wait_cnt
  • value: 事件状态标志。具体取值与状态转换规则以实现为准。
  • wait_mask: 等待任务位图,用于记录与该事件关联的等待任务。
  • wait_cnt: 等待数量相关字段,用于维护等待任务的统计信息。

事件触发

根据现有实现说明,触发事件时会进入临界区,更新事件状态, 检查等待任务位图,并调用相应的任务唤醒处理逻辑。 完成相关处理后,再恢复中断状态。

事件等待

等待方调用事件等待接口后,需要根据事件当前状态决定后续行为。 如果条件已经满足,可以按接口定义直接返回; 如果条件尚未满足,则进入等待机制,等待事件触发或等待条件结束。

这里描述的是事件机制的总体执行思路。 临界区的具体实现、中断状态的保存与恢复方式、 唤醒任务后的调度时机,应结合 HRTOS 对应版本源码阅读。

四、执行流程

等待流程

01 任务调用事件等待接口
02 检查事件状态及等待条件
03A 条件满足:按照接口定义返回
03B 条件不满足:进入等待机制
04 事件触发、等待结束或发生超时
05 任务根据实际返回结果继续处理

触发流程

01 调用事件触发接口
02 进入必要的临界区
03 更新事件状态
04 检查等待任务并执行相应唤醒处理
05 完成临界区处理,恢复相应执行状态
上述流程用于说明机制,不代表所有分支都必然依次执行。 实际返回路径、超时竞争处理以及是否立即发生任务切换, 需要以对应版本的事件实现与调度器代码为准。

五、机制特性与使用边界

状态通知

适合表达某个条件发生、操作完成或状态发生变化, 而不是传输具体的数据内容。

等待与唤醒

可以将任务等待条件与事件触发联系起来, 减少任务仅为检查条件而反复轮询的需要。

多任务协调

实际可唤醒的任务数量、唤醒规则与调度行为, 由事件实现和等待机制共同决定。

超时约束

等待接口提供 tick 参数。超时单位、边界条件与返回结果 应以当前版本接口定义为准。

关于事件状态保持: 是否保持已触发状态、是否自动清除、多个等待任务如何处理, 都属于具体实现语义。使用前应确认事件状态更新与复位规则, 不宜仅凭 Event 这一名称推断行为。

六、典型应用场景

  • 外设操作完成通知: 在满足相应调用约束的情况下,由操作完成处理路径通知等待任务。
  • 中断与任务协作: 将事件作为通知手段,使任务在需要时等待某个中断相关条件。
  • 状态机推进: 当某个条件满足后通知任务继续执行下一阶段逻辑。
  • 多个任务的状态协调: 当多个任务需要关注同一个状态时,可评估使用事件进行同步。
中断服务程序能否直接调用事件接口,取决于该接口的实现、 临界区策略及内核规定。使用前应确认接口的中断调用约束, 不应默认所有事件接口均可在中断中安全调用。

七、事件与其他通信机制的区别

事件与信号量

事件通常用于表达某种状态或条件; 信号量通常用于同步操作或表达可用资源数量。 两者的具体行为仍取决于 HRTOS 的实际实现。

事件与消息队列

事件侧重于通知某个条件发生, 消息队列则用于在发送方与接收方之间传递消息内容。 如果任务必须获取数据本身,仅有事件通知通常并不足够, 还需要相应的数据传递或共享机制。

事件与互斥锁

事件侧重状态通知与等待; 互斥锁侧重对共享资源的互斥访问。 如果需要保护共享数据,不应将事件通知本身当作互斥保护。

八、总结

事件机制是 HRTOS 任务间通信体系中的一种同步手段。 理解它时,重点不只是记住接口名称,还应明确事件状态如何变化、 等待任务如何登记、触发后如何唤醒,以及超时与调度如何配合。

阅读实现时,建议优先核对事件资源初始化与删除、 状态更新、等待队列维护、任务唤醒及临界区处理, 从而把接口行为与内核执行路径联系起来。