核心接口
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上报任务、日志系统、生产者消费者模型。