rt-thread学习笔记——12、创建消息队列

官网链接: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命令

效果:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值