官网链接: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命令
讯享网
效果:


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/125984.html