RT-Thread 体验教程:6.RT-Thread的邮箱,你知道吗??

RT-Thread 邮箱使用教程

RT-Thread 中的邮箱是一种常用的线程间通信机制。邮箱默认是开启的,如果需要关闭,可以在 rtconfig.h 文件中注释掉或删除相应的宏定义。

#define RT_USING_MAILBOX

image.png

动态创建邮箱及相关线程
1. 创建邮箱及相关线程

首先,我们需要创建一个邮箱和几个线程。邮箱用于存储消息,线程用于发送和接收消息。

rt_mailbox_t samplemail_create = RT_NLL;
rt_thread_t sendmailThread, recvmailThread;

image.png

2. 接收和发送邮件示例说明

发送线程和接收线程的实现如下:
image.png

在这个示例中,发送线程每隔 3 秒发送一个邮件,接收线程在无限循环中等待接收邮件。需要注意的是,接收函数并没有延时函数,而是一直在 while(1) 无限循环中执行。但是实际输出不会一直猛刷屏,而是有固定输出间隔。
烧写验证:
image.png

由此可以得出,邮箱接收是被动式触发的,有两种情况:

  1. 超时被动式:如果在规定时间内没收到邮件,则跳出阻塞,重新循环进入下一轮等待接收。
  2. 接收到邮件被唤醒:线程一直阻塞在等待状态,处于挂起状态,直到接收到邮件后被唤醒进行处理。

需要注意的是,如果没有创建邮箱,但触发了邮箱接收,不会提示邮箱不存在或者编译报错,而是会报邮箱满(-3)的错误。

静态初始化邮箱及相关线程

除了动态创建邮箱和线程,还可以使用静态方式进行初始化和创建:

1. 声明静态邮箱和线程
struct rt_mailbox samplemail_init;
char mailbox[256] = {0x00};
struct rt_thread sendmailThread1;
struct rt_thread recvmailThread1;
static char sendmailStack[256];
static char recvmailStack[256];
2. 初始化邮箱和线程

在系统初始化阶段,静态初始化邮箱和创建线程:
image.png

3. 线程中的邮件发送和接收

代码与动态创建的示例相同,发送线程和接收线程的实现保持不变。
image.png

4. 执行验证结果

编译代码并将其烧写到设备中,通过串口观察输出,确认邮箱和线程之间的通信功能正常工作。
image.png

通过上述方法,我们成功地使用邮箱实现了线程之间的消息传递和同步通信。希望这个教程对你的 RT-Thread 开发有所帮助。如果有任何问题或建议,欢迎在评论区留言。

对应的 demo 源码, 请点击 RtosExPro at rtt_communication_mailbox

也可扫码关注博主同名公众号"不解之榬",回复 “RTT” 获取
不解之榬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值