外观
消息队列示例
2026-05-15
概述
本文介绍如何在 睿擎工业开发平台 中创建并运行 消息队列 示例工程,通过初始化一个消息队列和两个线程,实现线程间的异步数据通信。发送线程周期性地向队列发送消息,接收线程实时从队列中获取数据并打印,帮助读者快速掌握消息队列这一线程间通信机制的使用方法。
消息队列简介
消息队列(message queue)是一种重要的线程间通信机制,用于实现线程间的数据交换。它允许一个或多个线程向队列发送消息,同时允许一个或多个线程从队列中接收消息,实现了解耦的异步数据传输。消息队列常用于处理需要传递数据的异步场景,例如传感器数据采集、网络数据包传输、任务间指令传递等。
构建与烧录
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化驱动

固化 APP

核心示例代码
消息队列示例相关 API
rt_mq_init:初始化静态消息队列,指定控制块、名称、缓冲区等参数,初始化后可用于线程通信rt_mq_send:发送普通消息,将消息添加到队尾,队列满时可选择等待或报错rt_mq_recv:从队首接收消息,队列为空时可选择等待或立即返回错误rt_snprintf:RT-Thread提供的安全字符串格式化函数,功能与标准 Csnprintf一致,但专为嵌入式优化,占用 ROM 更小、更适合 RTOS 环境
msg_example.c
static void _msg_thread1_entry(void *param)
{
char buf[64];
while (1)
{
if (rt_mq_recv(&_mq, &buf[0], sizeof(buf), RT_WAITING_FOREVER) ==
RT_EOK)// 接收消息
{
rt_kprintf("message queue: receive message %s\n", buf);
rt_thread_mdelay(100);
}
}
}
static void _msg_thread2_entry(void *param)
{
int count = 0;
char buf[64];
while (1)
{
rt_snprintf(buf, sizeof(buf), "message %d", count++);
rt_mq_send(&_mq, &buf[0], sizeof(buf));// 发送消息
rt_thread_mdelay(200);
}
}
int msg_example(void)
{
rt_mq_init(&_mq, MSG_NAME, &_msg_pool[0], 64, sizeof(_msg_pool),
RT_IPC_FLAG_PRIO);// 初始化消息队列
rt_thread_init(&_msg_thread1, THREAD1_NAME, _msg_thread1_entry, RT_NULL,
&_msg_thread1_stack[0], sizeof(_msg_thread1_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&_msg_thread1);
rt_thread_init(&_msg_thread2, THREAD2_NAME, _msg_thread2_entry, RT_NULL,
&_msg_thread2_stack[0], sizeof(_msg_thread2_stack),
THREAD_PRIORITY, THREAD_TIMESLICE);
rt_thread_startup(&_msg_thread2);
return 0;
}运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
msg_example命令
预期结果
- 线程 2 周期性地构造包含递增计数的消息字符串,并发送至消息队列
- 线程 1 以永久等待方式接收消息,并通过串口打印收到的字符串内容
- 线程 1 接收成功后延时 100 毫秒,线程 2 每发送一次后延时 200 毫秒
- 最终两个线程在各自的 while(1) 循环中持续运行,不主动退出
RT-Thread 终端
msh />msg_example
msh />message queue: receive message message 0
message queue: receive message message 1
message queue: receive message message 2
message queue: receive message message 3
message queue: receive message message 4
message queue: receive message message 5
message queue: receive message message 6
message queue: receive message message 7
message queue: receive message message 8
message queue: receive message message 9
message queue: receive message message 10
...