消息队列(Message Queue)
消息队列用于实现任务间FIFO顺序通信,支持多消息缓存与异步解耦, 是高频事件与数据流传输的核心机制之一。
机制定义
Message Queue = 入队(Send) + FIFO缓存 + 出队(Recv) + 顺序消费
触发场景
高频事件缓存
传感器数据、按键事件、通信帧缓存
任务解耦
生产者与消费者运行节奏解耦
异步通信
避免阻塞式等待,提高系统吞吐
批量数据传输
按顺序处理多条连续数据流
执行流程
1. 初始化队列
创建 FIFO 缓冲区
2. 发送消息
生产者写入队列
3. 队列缓存
按顺序存储消息
4. 接收消息
消费者读取 FIFO 数据
5. 任务调度
释放阻塞或继续运行
演示代码
#include "hrtos.h"
static os_msgq_t g_msgq;
static u8 g_msgq_buf[16];
sbit LED_P = P1^0;
sbit LED_C = P1^1;
sbit LED_Q = P1^2;
/* Producer */
void producer(void)
{
u8 data = 0x10;
while(1)
{
os_msgq_send(&g_msgq, 0, data, 0);
LED_P = ~LED_P;
LED_Q = 1; // queue active
data++;
os_delay(3);
}
}
/* Consumer */
void consumer(void)
{
u8 data;
while(1)
{
if(os_msgq_recv(&g_msgq, 0, &data, 0))
{
LED_C = ~LED_C;
P1 = (P1 & 0xF0) | (data & 0x0F);
LED_Q = 0;
}
os_delay(2);
}
}
void hrtos_main(void)
{
os_msgq_init(&g_msgq, g_msgq_buf, sizeof(g_msgq_buf));
os_task_create((unsigned int)producer, 1, 3, 5);
os_task_create((unsigned int)consumer, 2, 2, 5);
}
API 参考
初始化
os_msgq_init()
发送
os_msgq_send()
接收
os_msgq_recv()
Message Queue vs Event
Message Queue
携带数据,FIFO顺序缓存
Event
只传状态,不携带数据
系统意义
消息队列是RTOS中最重要的通信机制之一, 用于提升吞吐能力、解耦任务结构,并保证数据顺序一致性。