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
,静态邮箱需用户预分配缓冲区。
- 动态邮箱通过