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

效果:

rt-thread学习笔记——11、创建邮箱相关推荐

  1. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)--依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  2. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  3. HALCON 20.11:深度学习笔记(11)---目标检测

    HALCON 20.11:深度学习笔记(11)---目标检测 HALCON 20.11.0.0中,实现了深度学习方法. 本章讲解了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在图像中找到不 ...

  4. 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!

    从零写一个具有IOC-AOP-MVC功能的框架-学习笔记 专栏往期文章链接: IOC功能相关章节: 从零写一个具有IOC-AOP-MVC功能的框架-学习笔记-01.项目初始化 从零写一个具有IOC-A ...

  5. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

  6. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  7. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  8. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  9. Python学习笔记:创建分数类

    Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...

  10. oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,

    [学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...

最新文章

  1. 牛客题霸 NC5 二叉树根节点到叶子节点的所有路径和
  2. Linux下怎么确定Nginx安装目录
  3. 函数求值需要运行所有线程_JavaScript函数式编程(二)
  4. 【转】继承过程中 父类子类的 字段方法 内存分配 (非java语言)
  5. 被马云逼上绝路,睡了12年宾馆!中国最狠会计,拿下4600亿
  6. ubuntu 12.04 mysql_Ubuntu 12.04 mysql 源码安装--mysql.5.5.x
  7. 关于updatepanel回传之后JS失效问题
  8. ASP.NET---动态生成Word文档
  9. 条款40:慎重的选择多重继承
  10. 【原创】Mapped Statements collection does not contain value for DaoImpl.method
  11. 华为云服务器手机密码找回,忘记华为账号密码怎么办?两招就能帮你解决
  12. 新能源车牌识别算法,助力车牌识别核心升级
  13. 全功能开源的企业级安全主动攻击型蜜罐钓鱼系统 HFish,你很有必要部署一套!...
  14. 脑机接口:互联网遥远的疆界
  15. Axure RP9 制作平台界面
  16. 以昂扬的斗志,书写青春的热血
  17. 无法创建文件夹或文件问题的解决的方法
  18. 医学图像分割UNet
  19. SpringCloud Alibaba实战第八课 缓存设计、网关认证、重构策略
  20. (二 以及全部) 蓝眼睛ServiceMix教程 第一版

热门文章

  1. 酷炫背景粒子插件particles.js星空背景使用示例源码 - 附演示及下载地址
  2. python毕业设计作品基于django框架 电影院购票选座系统毕设成品(4)开题报告
  3. Selenium如何在谷歌浏览器模拟H5页面
  4. 项目1: 波士顿房价预测
  5. NLP基础(五):CopyNet和PGN模型
  6. tx2 1804 soure list
  7. ubuntu自带游戏_腾讯IEG开源GAME AI SDK:自动化测试吃鸡、MOBA类游戏
  8. Matplotlib饼图显示部分数据标签
  9. GEE例子分析_植被覆盖度计算
  10. 计算机毕设(附源码)JAVA-SSM隆庆祥企业服装销售管理系统