12.2. 邮箱的运作机制¶
创建邮箱对象时会先创建一个邮箱对象控制块,然后给邮箱分配一块内存空间用来存放邮件,这块内存的大小
等于邮件大小(4字节)与邮箱容量的乘积,接着初始化接收邮件和发送邮件在邮箱中的偏移量,接着再初始化
消息队列,此时消息队列为空。
RT-Thread操作系统的邮箱对象由多个元素组成,当邮箱被创建时,它就被分配了邮箱控制块:邮箱名称、邮
箱缓冲区起始地址、邮箱大小等。同时每个邮箱对象中包含着多个邮件框,每个邮件框可以存放一封邮件;所
有邮箱中的邮件框总数即是邮箱的大小,这个大小可在邮箱创建时指定。
线程或者中断服务程序都可以给邮箱发送邮件,非阻塞方式的邮件发送过程能够安全的应用于中断服务中,中
断服务函数、定时器向线程发送消息的有效手段,而阻塞方式的邮件发送只能应用于线程中。当发送邮件时,
当且仅当邮箱还没满邮件的时候才能进行发送,如果邮箱已满,可以根据用户设定的等待时间进行等待,当邮
箱中的邮件被收取而空出空间来时,等待挂起的发送线程将被唤醒继续发送的过程,当等待时间到了还未完成
发送邮件,或者未设置等待时间,此时发送邮件失败,发送邮件的线程或者中断程序会收到一个错误码(-RT_EFULL)。
线程发送邮件可以带阻塞,但在中断中不能采用任何带阻塞的方式发送邮件。
接收邮件时,根据邮箱控制块中的entry判断队列是否有邮件,如果邮箱的邮件非空,那么可以根据out_offset
找到最先发送到邮箱中的邮件进行接收。在接收时如果邮箱为空,如果用户设置了等待超时时间,系统会将当
前线程挂起,当达到设置的超时时间,邮箱依然未收到邮件时,那么线程将被唤醒并返回-RT_ETIMEOUT。如果
邮箱中存在邮件,那么接收线程将复制邮箱中的4个字节邮件到接收线程中。通常来说,邮件收取过程可能是阻
塞的,这取决于邮箱中是否有邮件,以及收取邮件时设置的超时时间。
当消邮箱不再被使用时,应该删除它以释放系统资源,一旦操作完成,邮箱将被永久性的删除。
邮箱的运作机制具体见 邮箱的发送接收示意图。