RT-Thread是一个开源的实时嵌入式操作系统,广泛应用于各种嵌入式系统和物联网设备。在RT-Thread中,邮箱是一种常用的线程间通信机制,用于实现不同线程之间的消息传递。本教程将介绍如何在RT-Thread中使用邮箱,以便开发者更好地利用这一功能。
邮箱的本质是环形缓冲区:
邮箱中的每一封邮件,只能容纳 4 字节内容(对于 32 位系统,指针大小刚好为 4 字节);
- 邮件的发送通常是非阻塞的,线程、中断都可以发送邮件;也可使用阻塞方式发送;
- 邮件的接收通常是阻塞的,取决于邮箱中是否有邮件;
- 当一个线程向邮箱发送邮件时:
- 如果邮箱没满,就把数值写入邮箱中
- 如果邮箱满了:
- 发送线程可以直接返回RT_EFULL
- 也可以挂起一段时间,在挂起的期间,别的线程或中断服务程序读了邮箱,会唤醒挂起的线程。
- 当一个线程从邮箱接收邮件时:
- 如果邮箱不为空,就读取邮箱中的数值
- 如果邮箱为空:
- 接收线可以直接返回RT_ETIMOUT
- 也可以挂起一段时间,在挂起的期间,别的线程或中断服务程序写了邮箱,会唤醒挂起的线程。
邮箱由邮箱控制块管理,由结构体 rt_mailbox 表示。 使用邮箱的流程:创建/初始化邮箱、发送邮件、接收邮件、删除/脱离邮箱
创建动态邮箱
我们可以使用下面这个函数创建动态邮箱:
参数说明: name 邮箱名称 size 邮箱容量 flag 邮箱采用的等待方式: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO 返回值 邮箱对象的句柄:成功,返回句柄,以后使用句柄来操作邮箱,RT_NULL:失败
创建静态邮箱
我们可以使用下面这个函数创建静态邮箱:
参数说明: mb 邮箱对象的句柄 name 邮箱的名字 msgpool 缓冲区指针 size 邮箱容量 flag 邮箱采用的等待方式: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO 返回值 RT_EOK:成功
我们可以使用下面这个函数删除函数创建的邮箱:
参数为邮箱的handle
我们可以使用下面这个函数删除创建的邮箱:
参数为邮箱的handle
他们的返回值为时,表示出错了
- 我们可以使用下面这个函数来发送邮件:
参数1为邮箱的handle 参数2为要发送的值
- 我们可以使用下面这个函数来发送邮件,并等待一定的tick:
参数1为邮箱的handle 参数2为要发送的值 参数3为等待的tick
- 我们可以使用下面这个函数来发送紧急邮件:
参数1为邮箱的handle 参数2为要发送的值
2.4 取邮件
我们可以使用下面这个函数来收邮件:
参数1为邮箱的handle 参数2为存储的地址 参数3为等待时间