消息队列(Message Queue)

基于 os_msgq_t 的环形FIFO通信机制,用于任务间结构化数据传递, 支持阻塞/非阻塞模式与 ISR/Task 解耦。

FIFO通信 环形缓冲区 阻塞唤醒

定义

Message Queue 是基于 buf/head/tail/count 构建的环形队列结构, 用于任务间按字节单位传递数据。

核心接口

void os_msgq_init(os_msgq_t *q, u8 *buf, u8 size); char os_msgq_send(os_msgq_t *q, u8 obj, u8 data, char nonblock); char os_msgq_recv(os_msgq_t *q, u8 obj, u8 *data, char nonblock); void os_msgq_clear(os_msgq_t *q);

数据结构

os_msgq_t { u8 *buf; // 环形缓冲区 u8 _size; // 队列容量 u8 head; // 读索引 u8 tail; // 写索引 u8 count; // 当前数据量 }
所有操作均在 EA=0 临界区执行,保证中断安全。

发送流程(os_msgq_send)

检查 count 是否达到 _size:

if(count == size) → WAIT_MSG_SEND else write tail → tail++ → count++

发送成功后: 唤醒 WAIT_MSG_RECV 等待任务

接收流程(os_msgq_recv)

检查 count 是否为 0:

if(count == 0) → WAIT_MSG_RECV else read head → head++ → count--

接收成功后: 唤醒 WAIT_MSG_SEND 等待任务

阻塞机制

nonblock = 1 → 直接返回 nonblock = 0 → os_wait(WAIT_MSG_SEND / WAIT_MSG_RECV)
阻塞本质:任务挂入 OS_RES[obj].wait_mask 等待队列,由调度器唤醒。

返回值

1 成功 0 阻塞/非阻塞失败 -1 等待失败

关键特性

• FIFO顺序通信
• 环形缓冲区 O(1)
• 支持阻塞/非阻塞
• ISR安全(EA保护)
• wait_mask 唤醒机制
• 多任务竞争访问

典型用途

驱动数据传递、ISR上报任务、日志系统、生产者消费者模型。