本文分享自中移OneOS公众号《任务间通信》。
上篇讲解了任务间同步,在本篇中主要讲解任务间通信机制,并对邮箱及消息队列进行详细介绍。通过对其概念、详细设计、接口设计等的讲解帮助开发者更好的理解其在操作系统中的应用。
任务间通信是指在不同任务之间传播或交换信息,操作系统实现的通信机制包含邮箱和消息队列。
邮箱
邮箱机制规定,一封邮件是固定的4字节大小,比较适合交换占用较小空间的信息,或者交换指针信息。
发送邮件实际是将发送缓存的4字节内容拷贝到邮箱,接收邮件是将邮箱中的4字节内容拷贝到接收缓存,如下图。
<邮箱通信示意图>
邮箱包含阻塞和非阻塞两种方式,其中,
阻塞方式:
1)如果邮箱为空时选择接收邮件,任务会被挂起,直到有新的邮件进入邮箱,挂起任务被唤醒接收邮件,或者设置的超时时间到达返回错误;
2)如果邮箱已满时选择发送邮件,任务也会被挂起,直到有其他任务接收邮件,邮箱有空间后挂起任务重新进入就绪态发送,或者设置的超时时间到达返回错误。
非阻塞方式:
1)如果邮箱为空时选择接收邮件,或者邮箱已满时选择发送邮件,都是直接返回错误。该方式适用于中断服务、定时器等不能阻塞的场景。
邮箱控制块结构的详细定义如下:
struct os_mailbox
{
os_ipc_object_t parent;
os_uint32_t *msg_pool; /* 邮箱缓冲区的开始地址*/
os_uint16_t size;