RT-Thread ****的 邮箱 用于 线程间通信,特点 是 开销 比较 低,效率 比较 高。
邮箱中的 每一封邮件 只能容纳 固定的 4字节 内容(针对 32 位处理系统,指针大小 即为 4 个字节,所以 一封邮件 恰好 能够 容纳 一个指针的地址)。
线程 或 中断 服务例程 把一封 4 字节长度 的 邮件 发送到 邮箱中,而 其他 需要的 线程 可以 从邮箱中 接收 这些邮件 并进行 处理。

在 RT-Thread 中,邮箱控制块 是 操作系统 用于 管理邮箱 的一个 数据结构。
/* 邮箱控制块结构体定义 */
struct rt_mailbox
{
struct rt_ipc_object parent; /**< 继承自IPC对象基类,包含:
- 等待队列(挂起的接收线程)
- 名称(调试用)
- 对象类型标志 */
rt_uint32_t *msg_pool; /**< **邮件池起始地址**(动态内存或静态数组),每个邮件槽固定存储4字节数据或指针 */
rt_uint16_t size; /**< **邮件池总容量**(单位:邮件数量),表示邮箱最多可缓存的邮件数 */
rt_uint16_t entry; /**< **当前邮箱**中**有效邮件数量**,entry=0 表示空,entry=size 表示满 */
rt_uint16_t in_offset; /**< **邮件写入偏移量**(环形缓冲区模式),指向**下一个可写入邮件**的位置 */
rt_uint16_t out_offset; /**< **邮件读取偏移量**(环形缓冲区模式),指向**下一个待读取邮件**的位置 */
rt_list_t suspend_sender_thread; /**< **发送线程挂起队列**(当邮箱满时,试图发送邮件的线程挂在此队列等待) */
};
typedef struct rt_mailbox *rt_mailbox_t; // **邮箱对象指针类型**
**// 定义静态邮箱**
struct rt_mailbox static_mb;
**// 定义动态邮箱**
rt_mailbox_t dynamic_mb;
初始化与脱离(针对于静态邮箱)
**// 决定了邮箱缓冲区为空的时候,多个线程等待接收邮件的排列方式
// 用于保存邮件 可存放的邮件数 |
// 静态邮箱初始化 邮箱指针 邮箱名称 邮箱缓冲区 邮箱容量大小 邮箱标志位————————————> RT_IPC_FLAG_FIFO—————先进先出,先进入线程等待队列的线程将优先获得邮件**
rt_err_t rt_mb_init(rt_mailbox_t mb, const char *name, void *msgpool,rt_size_t size,rt_uint8_t flag); // **|———>** **RT_IPC_FLAG_PRIO—————线程将按照优先级的方式排队等候邮件,优先级高的线程将优先获得邮件
// 通过这个函数,可以将静态邮箱,加入,系统的,对象管理器**
**// 静态邮箱脱离 邮箱指针**
rt_err_t rt_mb_detach(rt_mailbox_t mb); // **用于将静态邮箱从系统的,对象管理器,中移除**
创建与删除(针对于动态邮箱)
**// 动态邮箱创建 邮箱名称 邮箱大小 邮箱标志位————> 1.RT_IPC_FLAG_FIFO** 2.**RT_IPC_FLAG_PRIO**
rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag);
// **创建成功之后**,得到 rt_mailbox_t dynamic_mb 的**指针**,**需要进行判断**一下,如果 dynamic_mb **不为 NULL**,那么说明**创建成功**了,那么接下来就可以**对新创建的**这个**动态邮箱**进行**操作**
**// 动态邮箱删除 邮箱指针**
rt_err_t rt_mb_delete(rt_mailbox_t mb); // **不再使用**这个**动态邮箱**的**时**候,用于**将动态邮箱从系统的,对象管理器,中移除,释放系统资源**
发送邮件【线程发送(写入)邮件到邮箱中】
**// 这个API可以在线程中用,也可以在中断中用,因为它不会等待,所以可以在中断中用
// 发送邮件 邮箱指针 邮件的内容**
rt_err_t rt_mb_send(rt_mailbox_t mb, rt_uint32_t value); // 如果要发送的邮件在4字节以内,那么就可以直接将邮件的内容复制到value中发送出去
// 如果要发送的邮件大于4字节,这个时候我们就可以将邮件的指针的地址赋值给value,对于32位系统来说一个指针的地址就是32字节
// 对方的线程接收到指针的地址之后,就可以通过这个地址读取到这个邮件的内容
// 发送邮件的时候,如果邮箱已经满了,没有空间存放邮件了,那么调用这个函数以后就会直接返回一个邮箱已满的错误标志
// 当我们要发送邮件的时候,如果邮箱已经满了,这个函数可以等待
// 如果在timeout时间内,邮箱中又有空闲的空间了,那么它就可以成功的发送
// 如果超过timeout时间,邮箱还是没有空闲的空间,那么它就会返回等待超时
**// 这个API只能在线程中用,不能在中断中用,因为它会造成阻塞
// 发送邮件 邮箱指针 邮件的内容 等待超**
rt_err_t rt_mb_send_wait(rt_mailbox_t mb, rt_uint32_t value, rt_int32_t timeout);
接收邮件【线程接收(读出)邮箱中的邮件】
**// 接收邮件 邮箱指针 邮件的内容 等待超时时间**
rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout);