本帖最后由 643757107 于 2016-3-20 14:31 编辑
邮箱服务是实时操作系统中一种典型的任务间通信方法,通常开销比较低,效率较高,每一封邮件只能容纳固定的4字节内容(针对32位处理系统,刚好能够容纳一个指针). 如下图所示,线程或中断服务例程把一则4字节长度(典型的是一个指针)的邮件发送到邮箱中。而一个或多个线程可以从邮箱中接收这些邮件进行处理。 
RT-Thread采用的邮箱通信机制有点类型传统意义上的管道,用于线程间通讯。它是线程,中断服务,定时器向线程发送消息的有效手段。邮箱与线程对象等之间是相互独立的。线程,中断服务和定时器都可以向邮箱发送消息,但是只有线程能够接收消息(因为当邮箱为空时,线程将有可能被挂起)。RT-Thread的邮箱中共可存放固定条数的邮件,邮箱容量在创建邮箱时设定,每个邮件大小为4字节,正好是一个指针的大小。当需要在线程间传递比较大的消息时,可以传递指向一个缓冲区的指针。当邮箱满时,线程等不再发送新邮件,返回-RT EFULL。当邮箱空时,将可能挂起正在试图接收邮件的线程,使其等待,当邮箱中有新邮件时,再唤醒等待在邮箱上的线程,使其能够接收新邮件并继续后续的处理。 1 邮箱控制块- /**
- * mailbox structure
- */
- struct rt_mailbox
- {
- struct rt_ipc_object parent; //继承自IPC对象
- rt_uint32_t *msg_pool;//消息缓冲地址
- rt_uint16_t size; //可存放的消息最大条数
- rt_uint16_t entry; //当前邮箱中存放的消息条数
- rt_uint16_t in_offset; //消息存入的偏移位置
- rt_uint16_t out_offset; //消息取出时的偏移位置
- rt_list_t suspend_sender_thread; //发送邮件的线程(当没有取走时,发送线程会被挂起)
- };
- typedef struct rt_mailbox *rt_mailbox_t;
|