概述
在实时系统中,任务通常需要共享数据或触发事件,因此必须依赖可控通信机制完成协作。
HRTOS 支持多种通信方式,包括消息队列、信号量、事件等,每种机制都有其适用场景和性能特点。
在 HRTOS 中,一次通信不仅完成数据传递,还可能直接触发任务状态变化与调度行为,因此通信流程本质上属于执行路径的一部分。
工作原理
发送任务通过通信接口写入消息或事件,接收任务根据同步机制进行读取、等待或唤醒。 数据传递过程中,调度器保证任务按优先级获得 CPU,确保系统的确定性和实时响应。
发送任务通过通信接口更新通信对象状态,如果存在等待该对象的任务,则将其唤醒并进入就绪队列。系统随后根据优先级决定是否立即发生任务切换。
通信机制不仅负责数据传递,还负责执行顺序协调与同步控制,避免竞态条件和死锁。
关键接口 / 结构
/* ===== Event ===== */
os_event_init(u8 id) // 事件初始化
os_event_write(u8 id) // 置位事件(ISR / Task)
os_event_wait(u8 id, u16 tick) // 等待事件(阻塞)
os_event_query(u8 id) // 查询事件状态
os_event_delete(u8 id) // 删除事件
/* ===== Mailbox ===== */
os_mailbox_init(u8 mid) // 邮箱初始化
os_mailbox_send(u8 mid, u8 data) // 发送数据
os_mailbox_receive(u8 mid) // 接收数据
os_mailbox_query(u8 mid) // 非阻塞查询
os_mailbox_clear(u8 mid) // 清空邮箱
/* ===== Message Queue ===== */
os_msgq_init(q, buf, size) // 消息队列初始化
os_msgq_send(q, obj, data, nb) // 发送消息
os_msgq_recv(q, obj, data, nb) // 接收消息
os_msgq_clear(q) // 清空队列
/* ===== Semaphore ===== */
os_sem_init(sid, init) // 信号量初始化
os_sem_wait(sid) // P操作(获取)
os_sem_post(sid) // V操作(释放)
/* ===== Mutex ===== */
os_mutex_init(mid) // 互斥锁初始化
os_mutex_lock(mid) // 加锁(支持优先级继承)
os_mutex_unlock(mid) // 解锁
/* ===== Wait Core ===== */
os_wait(type, obj, tick) // 统一阻塞等待
wake_task(tid, flag) // 唤醒任务
os_event_init(u8 id) // 事件初始化
os_event_write(u8 id) // 置位事件(ISR / Task)
os_event_wait(u8 id, u16 tick) // 等待事件(阻塞)
os_event_query(u8 id) // 查询事件状态
os_event_delete(u8 id) // 删除事件
/* ===== Mailbox ===== */
os_mailbox_init(u8 mid) // 邮箱初始化
os_mailbox_send(u8 mid, u8 data) // 发送数据
os_mailbox_receive(u8 mid) // 接收数据
os_mailbox_query(u8 mid) // 非阻塞查询
os_mailbox_clear(u8 mid) // 清空邮箱
/* ===== Message Queue ===== */
os_msgq_init(q, buf, size) // 消息队列初始化
os_msgq_send(q, obj, data, nb) // 发送消息
os_msgq_recv(q, obj, data, nb) // 接收消息
os_msgq_clear(q) // 清空队列
/* ===== Semaphore ===== */
os_sem_init(sid, init) // 信号量初始化
os_sem_wait(sid) // P操作(获取)
os_sem_post(sid) // V操作(释放)
/* ===== Mutex ===== */
os_mutex_init(mid) // 互斥锁初始化
os_mutex_lock(mid) // 加锁(支持优先级继承)
os_mutex_unlock(mid) // 解锁
/* ===== Wait Core ===== */
os_wait(type, obj, tick) // 统一阻塞等待
wake_task(tid, flag) // 唤醒任务
HRTOS 通信系统由事件、邮箱、消息队列、信号量与互斥锁组成, 所有对象统一遵循“资源状态变化 → 唤醒等待任务 → 调度检查”的执行模型。
- Event:轻量状态通知
- Mailbox:固定单值通信
- MsgQ:结构化数据流
- Semaphore:计数同步
- Mutex:互斥与优先级继承
运行流程
任务 / ISR 发起通信
│
▼
调用对应 IPC 接口(Event / Mailbox / MsgQ / Semaphore / Mutex)
│
▼
更新资源状态(写入 / 计数 / 缓冲区变更)
│
▼
检查等待队列(os_wait 统一阻塞链)
│
▼
唤醒目标任务(wake_task)
│
▼
标记调度请求(os_schedule_request)
│
▼
返回调度点(由调度器决定是否切换任务)
│
▼
调用对应 IPC 接口(Event / Mailbox / MsgQ / Semaphore / Mutex)
│
▼
更新资源状态(写入 / 计数 / 缓冲区变更)
│
▼
检查等待队列(os_wait 统一阻塞链)
│
▼
唤醒目标任务(wake_task)
│
▼
标记调度请求(os_schedule_request)
│
▼
返回调度点(由调度器决定是否切换任务)
通信操作不仅改变数据状态,同时会影响任务阻塞链与就绪队列。 是否发生任务切换取决于优先级与调度策略。
注意事项与最佳实践
- 避免在 ISR 中直接操作复杂队列,使用事件或信号量通知任务处理。
- 队列容量需根据任务生产速度和处理速度合理配置,防止溢出。
- 合理设置超时等待,防止任务长时间阻塞。
- 高优先级任务可抢占低优先级任务,保证关键通信及时处理。
- 对于共享资源,结合互斥锁和信号量确保数据安全。
队列深度和超时值最好依据最坏生产速率来计算。