RT-Thread的邮箱服务,包括邮箱工作机制、工作管理方式以及应用示例.doc
《RT-Thread的邮箱服务,包括邮箱工作机制、工作管理方式以及应用示例.doc》由会员分享,可在线阅读,更多相关《RT-Thread的邮箱服务,包括邮箱工作机制、工作管理方式以及应用示例.doc(7页珍藏版)》请在三一文库上搜索。
1、RT-Thread的邮箱服务,包括邮箱工作机制、工作管理方式以及应用示例前言前面讲了RT-Thread的信号量、互斥量以及事件集这些都是线程间的同步方式。在我们进行实际的项目开发的时候,经常会涉及到一个线程更新某个全局变量值,然后另外一个线程去读取这个全局变量值,根据这个全局变量值的不同而去执行不同的操作,在RT-Thread 中则提供了更多的工具帮助在不同的线程中间传递信息,包括邮箱、消息队列、信号用于线程间的通信方式。本文将RT-Thread的邮箱服务,包括邮箱工作机制、工作管理方式以及应用示例,基于潘多拉开发板进行实验,单片机为STM32L475VET6。一、邮箱的工作机制RT-Thre
2、ad 操作系统的邮箱用于线程间通信,特点是开销比较低,效率较高。邮箱中的每一封邮件只能容纳固定的 4 字节内容(针对 32 位处理系统,指针的大小即为 4 个字节,所以一封邮件恰好能够容纳一个指针)。典型的邮箱也称作交换消息,如下图所示,线程或中断服务例程把一封 4 字节长度的邮件发送到邮箱中,而一个或多个线程可以从邮箱中接收这些邮件并进行处理。邮箱工作示意图(来源RT-Thread编程指南)(1)非阻塞方式的邮件发送过程能够安全的应用于中断服务中,是线程、中断服务、定时器向线程发送消息的有效手段。通常来说,邮件收取过程可能是阻塞的,这取决于邮箱中是否有邮件,以及收取邮件时设置的超时时间。当邮
3、箱中不存在邮件且超时时间不为 0 时,邮件收取过程将变成阻塞方式。在这类情况下,只能由线程进行邮件的收取。(2)当一个线程向邮箱发送邮件时,如果邮箱没满,将把邮件复制到邮箱中。如果邮箱已经满了,发送线程可以设置超时时间,选择等待挂起或直接返回 RT_EFULL。如果发送线程选择挂起等待,那么当邮箱中的邮件被收取而空出空间来时,等待挂起的发送线程将被唤醒继续发送。(3)当一个线程从邮箱中接收邮件时,如果邮箱是空的,接收线程可以选择是否等待挂起直到收到新的邮件而唤醒,或可以设置超时时间。当达到设置的超时时间,邮箱依然未收到邮件时,这个选择超时等待的线程将被唤醒并返回 RT_ETIMEOUT。如果邮
4、箱中存在邮件,那么接收线程将复制邮箱中的 4 个字节邮件到接收缓存中。二、邮箱的相关函数1、创建动态邮箱函数:创建邮箱对象时会先从对象管理器中分配一个邮箱对象,然后给邮箱动态分配一块内存空间用来存放邮件,这块内存的大小等于邮件大小(4 字节)与邮箱容量的乘积,接着初始化接收邮件数目和发送邮件在邮箱中的偏移量,动态创建一个邮箱对象可以调用如下的函数接口:1rt_mailbox_trt_mb_create(constchar*name,rt_size_tsize,rt_uint8_tflag);(1)入口参数:name:邮箱名称。size:邮箱容量。flag:邮箱标志,它可以取如下数值:RT_IP
5、C_FLAG_FIFO 或RT_IPC_FLAG_PRIO(2)返回值:RT_NULL:创建失败。邮箱对象的句柄:创建成功。2、删除动态邮箱函数:当用 rt_mb_create() 创建的邮箱不再被使用时,应该删除它来释放相应的系统资源,一旦操作完成,邮箱将被永久性的删除。删除邮箱时,如果有线程被挂起在该邮箱对象上,内核先唤醒挂起在该邮箱上的所有线程(线程返回值是 RT_ERROR),然后再释放邮箱使用的内存,最后删除邮箱对象。删除邮箱的函数接口如下:1rt_err_trt_mb_delete(rt_mailbox_tmb);(1)入口参数:mb:要删除的邮箱对象的句柄。(2)返回值:RT_E
6、OK:成功。3、创建静态邮箱函数:这里所说的创建静态邮箱和RT-Thread编程指南所讲的初始化邮箱是一样的,跟动态创建邮箱类似,只是初始化邮箱用于静态邮箱对象的初始化。与创建邮箱不同的是,静态邮箱对象的内存是在系统编译时由编译器分配的,一般放于读写数据段或未初始化数据段中,其余的初始化工作与创建邮箱时相同。初始化邮箱时,该函数接口需要获得用户已经申请获得的邮箱对象控制块,缓冲区的指针,以及邮箱名称和邮箱容量(能够存储的邮件数)。函数接口如下:1rt_err_trt_mb_init(rt_mailbox_tmb,2constchar*name,3void*msgpool,4rt_size_ts
7、ize,5rt_uint8_tflag);(1)入口参数:mb:邮箱对象的句柄。name:邮箱名称。msgpool:缓冲区指针。size:邮箱容量。flag:邮箱标志,它可以取如下数值:RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO(2)返回值:RT_EOK:成功。注意:这里的 size 参数指定的是邮箱的容量,即如果 msgpool 指向的缓冲区的字节数是 N,那么邮箱容量应该是 N/4。4、删除静态邮箱函数:这里所说的删除静态邮箱和RT-Thread编程指南所讲的脱离邮箱是一样的,脱离邮箱将把静态初始化的邮箱对象从内核对象管理器中脱离,内核先唤醒所有挂在该邮箱上的线
8、程(线程获得返回值是 RT_ERROR),然后将该邮箱对象从内核对象管理器中脱离。脱离邮箱使用下面的接口:1rt_err_trt_mb_detach(rt_mailbox_tmb);(1)入口参数:mb:邮箱对象的句柄。(2)返回值:RT_EOK:成功。5、发送邮件函数:线程或者中断服务程序可以通过邮箱给其他线程发送邮件,发送的邮件可以是 32 位任意格式的数据,一个整型值或者一个指向缓冲区的指针。当邮箱中的邮件已经满时,发送邮件的线程或者中断程序会收到 RT_EFULL的返回值。函数接口如下:1rt_err_trt_mb_send(rt_mailbox_tmb,rt_uint32_tvalu
9、e);(1)入口参数:mb:邮箱对象的句柄。value:邮件内容。(2)返回值:RT_EOK:发送成功。RT_EFULL:邮箱已经满了。6、等待方式发送邮件函数:用户也可以通过如下的函数接口向指定邮箱发送邮件:1rt_err_trt_mb_send_wait(rt_mailbox_tmb,2rt_uint32_tvalue,3rt_int32_ttimeout);rt_mb_send_wait()与 rt_mb_send() 的区别在于有等待时间,如果邮箱已经满了,那么发送线程将根据设定的 timeout 参数等待邮箱中因为收取邮件而空出空间。如果设置的超时时间到达依然没有空出空间,这时发送线
10、程将被唤醒并返回错误码。(1)入口参数:mb:邮箱对象的句柄。value:邮件内容。timeout:超时时间。(2)返回值:RT_EOK:发送成功。RT_ETIMEOUT:超时。RT_ERROR:失败,返回错误。7、接收邮件函数:接收邮件时,接收者需指定接收邮件的邮箱句柄,并指定接收到的邮件存放位置以及最多能够等待的超时时间。接收邮件函数接口如下:1rt_err_trt_mb_recv(rt_mailbox_tmb,rt_uint32_t*value,rt_int32_ttimeout);(1)入口参数:mb:邮箱对象的句柄。value:邮件内容。timeout:超时时间。(2)返回值:RT_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RT Thread 邮箱 服务 包括 工作 机制 管理 方式 以及 应用 示例
链接地址:https://www.31doc.com/p-3272776.html