RT-Thread API参考手册  3.1.1
嵌入式实时操作系统

邮箱接口 更多...

结构体

struct  rt_mailbox
 邮箱控制块 更多...
 

类型定义

typedef struct rt_mailboxrt_mailbox_t
 邮箱类型指针定义
 

函数

rt_err_t rt_mb_init (rt_mailbox_t mb, const char *name, void *msgpool, rt_size_t size, rt_uint8_t flag)
 初始化邮箱 更多...
 
rt_err_t rt_mb_detach (rt_mailbox_t mb)
 脱离邮箱 更多...
 
rt_mailbox_t rt_mb_create (const char *name, rt_size_t size, rt_uint8_t flag)
 创建邮箱 更多...
 
rt_err_t rt_mb_delete (rt_mailbox_t mb)
 删除邮箱 更多...
 
rt_err_t rt_mb_send_wait (rt_mailbox_t mb, rt_uint32_t value, rt_int32_t timeout)
 等待方式发送邮件 更多...
 
rt_err_t rt_mb_send (rt_mailbox_t mb, rt_uint32_t value)
 发送邮件 更多...
 
rt_err_t rt_mb_recv (rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout)
 接收邮件 更多...
 

详细描述

邮箱接口

邮箱是一种简单的线程间消息传递方式,在 RT-Thread 操作系统的实现中能够一次传递 4 字节邮件, 并且邮箱具备一定的存储功能,能够缓存一定数量的邮件数 (邮件数由创建、初始化邮箱时指定的 容量决定)。邮箱中一封邮件的最大长度是 4 字节,所以邮箱能够用于不超过 4 字节的消息传递, 当传送的消息长度大于这个数目时就不能再采用邮箱的方式。

函数说明

rt_err_t rt_mb_init ( rt_mailbox_t  mb,
const char *  name,
void *  msgpool,
rt_size_t  size,
rt_uint8_t  flag 
)

初始化邮箱

该函数将初始化邮箱并将其置于内核管理器的控制之下。

参数
mb邮箱对象的句柄
name邮箱的名称
msgpool缓冲区指针
size邮箱容量
flag邮箱标志,它可以取数值:RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO
返回
RT_EOK
示例:
mailbox_sample.c.
rt_err_t rt_mb_detach ( rt_mailbox_t  mb)

脱离邮箱

该函数将将把静态初始化的邮箱对象从内核对象管理器中删除。使用该函数接口后, 内核先唤醒所有挂在该邮箱上的线程(线程获得返回值是 - RT_ERROR ),然后将 该邮箱对象从内核对象管理器中删除。

参数
mb邮箱对象的句柄
返回
RT_EOK
示例:
mailbox_sample.c.
rt_mailbox_t rt_mb_create ( const char *  name,
rt_size_t  size,
rt_uint8_t  flag 
)

创建邮箱

调用该函数创建邮箱对象时会先从对象管理器中分配一个邮箱对象,然后给邮箱动态分配 一块内存空间用来存放邮件,这块内存的大小等于邮件大小(4 字节)与邮箱容量的乘积, 接着初始化接收邮件数目和发送邮件在邮箱中的偏移量。

参数
name邮箱的名称
size邮箱容量
flag邮箱标志,它可以取值:RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回
返回创建的邮箱对象,创建失败时返回 RT_NULL
rt_err_t rt_mb_delete ( rt_mailbox_t  mb)

删除邮箱

当用rt_mb_create()创建的邮箱不再被使用时,应该调用该函数删除它来释放相应的系统资源, 一旦操作完成,邮箱将被永久性的删除。删除邮箱时,如果有线程被挂起在该邮箱对象上, 内核先唤醒挂起在该邮箱上的所有线程(线程返回值是- RT_ERROR),然后再释放邮箱使用的 内存,最后删除邮箱对象。

参数
mb邮箱对象的句柄
返回
错误代码
rt_err_t rt_mb_send_wait ( rt_mailbox_t  mb,
rt_uint32_t  value,
rt_int32_t  timeout 
)

等待方式发送邮件

用户也可以通过调用该函数接口向指定邮箱发送邮件。它与 rt_mb_send()的区别在于, 如果邮箱已经满了,那么发送线程将根据设定的timeout参数等待邮箱中因为收取邮件 而空出空间。如果设置的超时时间到达依然没有空出空间,这时发送线程将被唤醒返回 错误码。

参数
mb邮箱对象的句柄
value邮件内容
timeout超时时间
返回
RT_EOK 发送成功;-RT_ETIMEOUT 超时;-RT_ERROR 失败,返回错误号
rt_err_t rt_mb_send ( rt_mailbox_t  mb,
rt_uint32_t  value 
)

发送邮件

线程或者中断服务程序可以通过调用该函数给其他线程发送邮件。发送的邮件可以是 32 位 任意格式的数据,一个整型值或者一个指向缓冲区的指针。当邮箱中的邮件已经满时,发送 邮件的线程或者中断程序会收到- RT_EFULL 的返回值。

参数
mb邮箱对象的句柄
value邮件内容
返回
RT_EOK 发送成功;-RT_EFULL 邮箱已经满了
示例:
mailbox_sample.c.
rt_err_t rt_mb_recv ( rt_mailbox_t  mb,
rt_uint32_t value,
rt_int32_t  timeout 
)

接收邮件

只有当接收者接收的邮箱中有邮件时,接收者才能立即取到邮件并返回 RT_EOK 的返回值, 否则接收线程会根据超时时间设置,或挂起在邮箱的等待线程队列上,或直接返回。

参数
mb邮箱对象的句柄
value邮件内容
timeout超时时间
返回
RT_EOK 发送成功;-RT_ETIMEOUT 超时;-RT_ERROR 失败,返回错误号
示例:
mailbox_sample.c.