rt-thread学习笔记——11、创建邮箱

官网链接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11

注意:1、邮箱中的每一封邮件只能容纳固定的 4 字节内容(针对 32 位处理系统,指针的大小即为 4 个字节,所以一封邮件恰好能够容纳一个指针),所以我们传递大量的数据可以通过传递数组指针的方式,来传递数据;2、msgpool 指向的缓冲区的字节数是 N,那么邮箱容量应该是 N/4。

代码:

#define THREAD_PRIORTY		6		//优先级
#define	THREAD_STACK_SIZE	512	//栈大小
#define	THREAD_TIMESLICE	5		//线程时间片


static struct rt_mailbox mb;	//邮箱控制块
static char mb_pool[128];			//邮箱内存池

static char mb_str1[] = "I'm a mail!";
static char mb_str2[] = "this is another mail!";
static char mb_str3[] = "over";


//邮箱使用示例,其中一个线程往邮箱中发送邮件,一个线程往邮箱中收取邮件
/******************************************************************************************
*** 函数名称: mailbox_thread1_recv
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:线程1,接收邮箱
***	链		接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
***	编者										时间										版本
***	wagnlu									2020/11/16							V0.1
******************************************************************************************/ 
static void mailbox_thread1_recv(void* parameter)
{
	char *str;
	while(1)
	{
		rt_kprintf("thread1: try to recv mail\n");
		
		//从邮箱中收取邮件
		if(rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
		{
			rt_kprintf("thread1: get a mail from mailbox, the content:%s\n", str);
			if(str == mb_str3)
			{
				break;	//退出接收邮箱
			}
			rt_thread_mdelay(1000);	//延迟1s
		}			
	}
	
	rt_kprintf("thread1 mailbox over\n");
	rt_mb_detach(&mb);	//执行邮箱对象脱离
	
}

/******************************************************************************************
*** 函数名称: mailbox_thread2_send
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:线程2,发送邮箱
***	链		接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
***	编者										时间										版本
***	wagnlu									2020/11/16							V0.1
******************************************************************************************/ 
static void mailbox_thread2_send(void* parameter)
{
	rt_uint8_t count =0;
	
	while(count <10)
	{
		count ++;
		if(count &0x1)
		{
			rt_mb_send(&mb, (rt_uint32_t)&mb_str1);		//发送mb_str1 地址到邮箱中
		}
		else
		{
			rt_mb_send(&mb, (rt_uint32_t)&mb_str2);		//发送mb_str2 地址到邮箱中
		}
		rt_thread_mdelay(1000);
	}
	
	rt_mb_send(&mb, (rt_uint32_t)&mb_str3);	//发送邮箱告诉线程1,2 已经运行结束	
}

/******************************************************************************************
*** 函数名称: mailbox_thread2_send
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:线程2,发送邮箱
***	链		接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
***	编者										时间										版本
***	wagnlu									2020/11/16							V0.1
******************************************************************************************/ 
int mailbox_sample(void)
{
	rt_err_t result;
	rt_thread_t tid = RT_NULL;	//创建一个线程句柄
	
	//初始化一个邮箱
	result = rt_mb_init(	&mb,									//邮箱控制块
												"mbt",								//名称是 mbt 
												&mb_pool[0],					//邮箱用到的内存池是 mb_pool 
												sizeof(mb_pool)/4,		//邮箱中的邮件数目,因为一封邮件占 4 字节 
												RT_IPC_FLAG_FIFO);		//采用 FIFO 方式进行线程等待 
	if(result != RT_EOK)
	{
		rt_kprintf("init mailbox failed\n");
		return -1;
	}
							
	tid = rt_thread_create( "mailobx thread1",			//线程名称
													mailbox_thread1_recv,		//线程函数
													RT_NULL,								//线程入口函数参数
													THREAD_STACK_SIZE,			//栈大小
													THREAD_PRIORTY,					//优先级
													THREAD_TIMESLICE);			//线程时间片
	
	if(tid != RT_NULL)														//获得线程控制块,启动这个线程
	{
		rt_thread_startup(tid);
	}
	
	tid = rt_thread_create( "mailobx thread2",			//线程名称
													mailbox_thread2_send,		//线程函数
													RT_NULL,								//线程入口函数参数
													THREAD_STACK_SIZE,			//栈大小
													THREAD_PRIORTY,					//优先级
													THREAD_TIMESLICE);			//线程时间片
	
	if(tid != RT_NULL)														//获得线程控制块,启动这个线程
	{
		rt_thread_startup(tid);
	}
	
	return 0;
	
}
	
MSH_CMD_EXPORT(mailbox_sample, mailbox sample)	//导出 msh命令
	

 

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值