RT-Thread学习记录12 邮箱的使用

以下为看视频笔记..........

1. 邮箱的工作机制

RT-Thread操作系统的邮箱用于线程间通信(邮箱具有数据交互功能,但互斥量、信号量等IPC没有数据交互功能),特点是开销比较低,效率较高。邮箱中的每一封邮件只能容纳 固定的4字节内容  (针对32位处理系统,指针的大小即为4个字节,所以一封邮件恰好能够容纳一个指针)。

线程或中断服务例程把一封4 字节长度的邮件发送到邮箱中,而其他需要的线程可以从邮箱中接收这些邮件并进行处理。“
 

RT-Thread学习记录12 邮箱的使用_第1张图片

2. 邮箱控制块



在RT-Thread中,邮箱控制块是操作系统用于管理邮箱的-一个数据结构。
struct rt_ mailbox
{
    struct rt_ipc_object parent;/**< inherit from ipc_ object */

    rt_uint32_t        *msg_pool;/**< start address of message buffer */

    rt_uint16_t        size; /*< size of message pool */

    rt_uint16_t        entry;/**< index of messages in msg_ pool,邮件的数目 */

    rt_uint16_t        in_offset;/**< input offset of the message buffer */

    rt_uint16_t        out_offset;/**< output offset of the message buffer */
 
    rt_list_t          suspend_sender_thread; /**< sender thread suspended on this mailbox,若邮箱满了,在发送邮件时线程就会挂起,记录这个发送邮件的线程 */

};

typedef struct rt_ _mailbox *rt_ mailbox_ _t;

定义静态邮箱: struct rt_mailbox     static_mb

定义动态邮箱: rt_mailbox_t           dynamic_mb
3.  邮箱的操作API

初始化与脱离

这组API用于静态邮箱的操作

rt_err_t  rt_mb_init(rt_mailbox_t  mb,const  char *name,
                     void *msgpool,rt_size_t size,rt_uint8_t flag)
//调用这个函数,系统就会把邮箱加入到对象管理器中,第一个参数邮箱控制块的指针,指明初始化那个邮箱,第二个参数给邮箱起一个名字,第三个参数是给邮箱配置一个缓冲区用来保存邮箱中的邮件,即把缓冲区的地址传进来,第四个参数说明邮件能存多少个邮件(邮件是固定大小四个字节,若size是10,则邮箱大小为40),会后一个参数可为RT_IPC_FLAG_FIFO,RT_IPC_FLAG_PRIO,
若邮箱中没有邮件时,线程等待的方式

rt_err_t  rt_mb_detach(rt_mailbox_t  mb)
//当不用邮箱时,从对象管理器中移除

创建与删除

这组API用于动态邮箱的操作

rt_mailbox_t  rt_mb_create(const char *name,rt_size_t size,
                            rt_uint8_t  flag)
//动态创建邮箱的大小依据size参数,创建成功返回一个邮箱的指针,失败返回0
rt_err_t  rt_mb_delete(rt_mailbox_t  mb)

发送邮件

rt_err_t  rt_mb_send(rt_mailbox_t  mb,rt_uint32_t  value)
//value参数就是发送邮件的内容,邮件发送的两种方式:内容少于四个字节时可以传邮件内容,当邮件内容大于四个字节时可以把邮件内容指针传入(针对32bit处理器,一个指针四个字节)。
当邮箱已满,则返回一个邮箱满 的错误标志。可以在中断和线程中使用
rt_err_t  rt_mb_send_wait(rt_mailbox_t  mb,rt_uint32_t  value,rt_int32_t  timeout)
//与上一个发送函数多一个参数timeout,当邮箱已满时,发送函数可以等待timeout的时间,注意不可以在中断中使用

接受邮件

rt_err_t  rt_mb_recv(rt_mailbox_t  mb,rt_uint32_t  *value,rt_int32_t   timeout)

//value为接受邮件的地址或内容的指针。若接受时邮箱是空的,等待时间为timeout

4. 邮箱的示例示例使用

在mailbox_sample.c中

 这个程序会创建2个动态线程,一个静态的邮箱对象,其中一个线程往邮箱中发送邮件, 一个线程往邮箱中收取邮件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(rt_thread)