官网链接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_23
代码:
#define THREAD_PRORTIY 6 //优先级
#define THREAD_STACK_SIZE 512 //栈大小
#define THREAD_TIMESLICE 5 //线程时间片
static struct rt_messagequeue mq;
static rt_uint8_t msg_pool[2048]; //消息队列中用到的放置消息的内存池
//消息队列应用示例,一个线程会从消息队列中收取消息;另一个线程会定时给消息队列发送普通消息和紧急消息
/******************************************************************************************
*** 函数名称: thread1_messageQueue_recv
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程1,接收消息队列
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_23
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
static void thread1_messageQueue_recv(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("thrad1: recv msg queue, thread:%c\n", buf);
if(cnt ==19)
{
break;
}
}
cnt++;
rt_thread_mdelay(50);
}
rt_kprintf("thread1: detach mq \n");
rt_mq_detach(&mq); //脱离消息队列
}
/******************************************************************************************
*** 函数名称: thread1_messageQueue_send
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程1,发送消息队列
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_23
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
static void thread1_messageQueue_send(void *parameter)
{
int result;
char buf ='A';
rt_uint8_t cnt =0;
while(1)
{
if(cnt == 8)
{
//发送紧急消息到消息队列
result = rt_mq_urgent(&mq, &buf, 1);
if(result != RT_EOK)
{
rt_kprintf("rt_mq_urgent err\n");
}
else
{
rt_kprintf("thread2: send urgent message- %c\n", buf);
}
}
else if(cnt >20) //发送20次消息之后退出
{
rt_kprintf("message queue stop send, thread2 quit\n");
break;
}
else
{
//发送消息到消息队列中
result = rt_mq_send(&mq, &buf, 1);
if(result != RT_EOK)
{
rt_kprintf("rt_mq_send err\n");
}
rt_kprintf("thread2: send message - %c\n", buf);
}
buf++;
cnt++;
rt_thread_mdelay(5);
}
}
/******************************************************************************************
*** 函数名称: messageQueue_sample
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:消息队列和线程创建初始化函数
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_23
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
int msgQueue_sample(void)
{
rt_err_t result;
rt_thread_t tid = RT_NULL;
result = rt_mq_init(&mq,
"mqt",
&msg_pool[0], //内存池指向 msg_pool
1, //每个消息的大小是 1 字节
sizeof(msg_pool), //内存池的大小是 msg_pool 的大小
RT_IPC_FLAG_FIFO); //如果有多个线程等待,按照先来先得到的方法分配消息
if (result != RT_EOK)
{
rt_kprintf("init message queue failed.\n");
return -1;
}
tid = rt_thread_create("thread msgQueue1", //线程名称
thread1_messageQueue_recv, //线程函数
RT_NULL, //线程入口函数参数
THREAD_STACK_SIZE, //栈大小
THREAD_PRORTIY, //优先级
THREAD_TIMESLICE); //线程时间片
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
tid = rt_thread_create("thread msgQueue2", //线程名称
thread1_messageQueue_send, //线程函数
RT_NULL, //线程入口函数参数
THREAD_STACK_SIZE, //栈大小
THREAD_PRORTIY, //优先级
THREAD_TIMESLICE); //线程时间片
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
return 0;
}
MSH_CMD_EXPORT(msgQueue_sample, messageQueue sample); //导出 msh命令
效果: