RT-Thread 邮箱控制块

1. ​继承关系与IPC对象管理
  • struct rt_ipc_object parent
    邮箱控制块继承自IPC基类 rt_ipc_object,提供线程挂起队列、对象名称等通用IPC特性。
    • 通过 parent.suspend_thread 管理接收邮件的等待线程队列。
    • 对象名称(parent.parent.name)用于调试和标识。
    • 标志位 flag 决定等待线程的调度策略(FIFO或优先级)。

2. ​消息缓冲区与容量管理
  • rt_ubase_t *msg_pool
    指向动态分配的环形缓冲区起始地址,用于存储邮件(每个邮件固定为4字节)。
  • rt_uint16_t size
    邮箱容量,即缓冲区可容纳的邮件总数(计算方式:msg_pool 总字节数 / 4)。
  • rt_uint16_t entry
    当前邮箱中有效邮件的数量,用于快速判断邮箱是否满/空。

3. ​环形缓冲区读写指针
  • in_offset 与 out_offset
    • in_offset:写入邮件的偏移量,指向下一个可写入的位置。
    • out_offset:读取邮件的偏移量,指向下一个待读取的位置。
    • 采用循环队列机制,当指针到达缓冲区末尾时自动回绕,保证高效利用内存。

4. ​发送线程挂起队列
  • rt_list_t suspend_sender_thread
    当邮箱已满时,发送邮件的线程会被挂起并加入此队列。当邮件被接收后,队列中的线程会被唤醒继续发送。
    • 与接收线程的挂起队列(parent.suspend_thread)分离,避免操作冲突。

5. ​关键操作与设计特点
  • 邮件发送(rt_mb_send)​
    • 若邮箱未满(entry < size),将邮件写入 msg_pool[in_offset],并更新 in_offset 和 entry
    • 若邮箱已满,发送线程根据超时策略挂起或返回错误码 -RT_EFULL
  • 邮件接收(rt_mb_recv)​
    • 若邮箱非空(entry > 0),从 msg_pool[out_offset] 读取邮件,更新 out_offset 和 entry
    • 若邮箱为空,接收线程根据超时策略挂起或返回错误码 -RT_ETIMEOUT
  • 动态内存管理
    • 动态邮箱通过 rt_mb_create 从堆分配 msg_pool,静态邮箱需用户预分配缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值