1. 示例代码
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-02-07 冷月枫 the first version
*/
/* 初始化2个静态线程 ,一个线程会从消息队列中读取消息,
* 另一个线程会定时给消息队列发送普通信息和紧急信息*/
#include <rtthread.h>
/* 消息队列控制块 */
static struct rt_messagequeue mq;
/* 消息队列中用到的放置消息的内存池 */
static rt_uint8_t msg_pool[2048];
ALIGN(RT_ALIGN_SIZE)
static char thread1_stack[1024];
static struct rt_thread thread1;
ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
/* 线程1入口函数 */
static void thread1_entry(void* parameter)
{
char buf = 0;
rt_uint8_t cnt = 0;
while(1)
{
/* 从消息队列中接收消息 */
if(rt_mq_recv(&mq, &buf, sizeof(buf), RT_WAITING_FOREVER) == RT_EOK)
{
rt_kprintf("thread1 recv from msg queue, the content is %c\n",buf);
if(cnt == 19)
{
break;
}
}
cnt ++;
rt_thread_mdelay(50);
}
/* 脱离队列 */
rt_kprintf("thread1 detach! \n");
rt_mq_detach(&mq);
}
/* 线程2入口函数 */
static void thread2_entry(void* parameter)
{
int re;
char buf = 'A';
rt_uint8_t cnt = 0;
while(1)
{
if(cnt == 8)
{
/* 发送紧急消息到消息队列中 */
re = rt_mq_urgent(&mq, &buf, sizeof(buf));
if(re != RT_EOK)
{
rt_kprintf("rt_mq_urget failed!\n");
}else {
rt_kprintf("thread2 send urgent message: %c\n",buf);
}
}else if(cnt >= 20)
{
rt_kprintf("message queue stop send, thread2 quit'n");
break;
}else {
/* 发送普通消息到消息队列 */
re = rt_mq_send(&mq, &buf, sizeof(buf));
if(re != RT_EOK)
{
rt_kprintf("rt_mq_send failed!\n");
}else {
rt_kprintf("thread2 send message: %c\n",buf);
}
}
buf ++; // 消息数据改变
cnt ++;
rt_thread_mdelay(5);
}
}
/* 消息队列初始化 */
int msgq_sample(void)
{
rt_err_t re;
/* 初始化消息队列 */
re = rt_mq_init(&mq, // 消息队列控制块
"mq1", // 消息队列名
&msg_pool[0], // 消息队列内存池
1, // 每个消息的大小
sizeof(msg_pool), // 存放消息的数目
RT_IPC_FLAG_FIFO); // 分配消息的策略
if(re != RT_EOK)
{
rt_kprintf("init message queue failed!\n");
return -1;
}
/* 线程1 */
rt_thread_init(&thread1,
"thread1",
thread1_entry,
RT_NULL,
&thread1_stack[0],
sizeof(thread1_stack),
25,
5);
rt_thread_startup(&thread1);
/* 线程2 */
rt_thread_init(&thread2,
"thread2",
thread2_entry,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
25,
5);
rt_thread_startup(&thread2);
return 0;
}
MSH_CMD_EXPORT(msgq_sample,message queue sample);
2. 测试结果
详细文档
链接