邮箱工作机制

RT-Thread ****的 邮箱 用于 线程间通信特点开销 比较 效率 比较

邮箱中每一封邮件 只能容纳 固定4字节 内容(针对 32 位处理系统指针大小 即为 4 个字节,所以 一封邮件 恰好 能够 容纳 一个指针的地址)。

线程中断 服务例程 把一封 4 字节长度邮件 发送到 邮箱中,而 其他 需要的 线程 可以 从邮箱接收 这些邮件 并进行 处理

image.png

邮箱控制块

在 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;

邮箱的操作

邮箱使用示例