嵌入式实时操作系统RT-Thread原理与应用第6章 RT-Thread 线程间通信.docVIP

嵌入式实时操作系统RT-Thread原理与应用第6章 RT-Thread 线程间通信.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

PAGE18

PAGE17

第6章RT-Thread线程间通信

6.1RT-Thread邮箱

邮箱服务在实时操作系统中是一种非常典型的线程间通信方式。

以下是一个简单的使用示例:

假设我们有两个线程,线程1负责检测按键状态并将其发送出去,而线程2则负责读取这些按键状态,并根据按键的当前状态来控制LED的亮灭。

当使用邮箱进行通信时,线程1可以将按键的状态封装成一封邮件,然后将其发送到邮箱中。线程2则会从邮箱中读取这封邮件,从而获取按键的状态,并据此对LED执行相应的操作。

这个场景也可以很容易地扩展到多个线程之间的通信。例如,假设我们有三个线程:

(1)线程1:专门负责检测按键状态,并将其作为信息发送出去。

(2)线程2:负责检测ADC(模拟-数字转换器)的采样信息,并将其发送出去。

(3)线程3:根据接收到的信息类型来执行不同的操作。它可能会读取线程1发送的按键状态,也可能会读取线程2发送的ADC采样信息,并根据这些信息来执行相应的任务。

通过这样的方式,邮箱服务为实时操作系统中的线程间通信提供了一种灵活且高效的方法。

6.1.1 邮箱的工作机制

RT-Thread邮箱服务以低开销高效著称,32位系统中邮件大小4字节,刚好存指针,适合传递指针或小型数据,称为交换消息。

邮箱工作示意图如图6-1所示。

通过这样的设计,RT-Thread的邮箱服务为线程间提供了一种高效且紧凑的通信手段。

图6-1邮箱工作示意图

RT-Thread邮箱中,线程或中断发送4字节邮件,多个线程可接收处理,支持非阻塞和阻塞两种发送接收模式。

(1)非阻塞邮件发送。

非阻塞邮件发送适合中断、线程及定时器发送消息;邮件接收可阻塞,视邮箱中邮件和超时设置而定。

(2)邮件接收。

邮箱无邮件且有非零超时时,邮件接收阻塞,仅线程可收。发送线程若邮箱满,可挂起等待空位或返回错误,空位出现时唤醒继续发送。

6.1.2 邮箱控制块

在RT-Thread中,邮箱控制块是操作系统用于管理邮箱的一个数据结构,由结构体structrt_mailbox表示。

另外一种C表达方式rt_mailbox_t,表示的是邮箱的句柄,在C语言中的实现是邮箱控制块的指针。

邮箱控制块结构的详细定义请见以下代码:

structrt_mailbox

{

structrt_ipc_objectparent;

rt_uint32_t*msg_pool;/*邮箱缓冲区的开始地址*/

rt_uint16_tsize;/*邮箱缓冲区的大小*/

rt_uint16_tentry;/*邮箱中邮件的数目*/

rt_uint16_tin_offset,out_offset;/*邮箱缓冲的进出指针*/

rt_list_tsuspend_sender_thread;/*发送线程的挂起等待队列*/

};

typedefstructrt_mailbox*rt_mailbox_t;

rt_mailbox对象从rt_ipc_object中派生,由IPC容器所管理。

6.1.3 邮箱的管理方式

邮箱控制块是一个结构体,其中含有事件相关的重要参数,在邮箱的功能实现中起重要的作用。

邮箱的相关接口如图6-2所示,对一个邮箱的操作包含:创建/初始化邮箱、发送邮件、接收邮件、删除/脱离邮箱。

图6-2邮箱相关接口

创建和删除邮箱

动态创建一个邮箱对象可以调用如下的函数接口:

rt_mailbox_trt_mb_create(constchar*name,rt_size_tsize,rt_uint8_tflag);

创建邮箱时分配对象和邮件内存,大小为4字节乘容量,初始化接收数和发送偏移。

当用rt_mb_create()创建的邮箱不再被使用时,应该删除它来释放相应的系统资源,一旦操作完成,邮箱将被永久性的删除。删除邮箱的函数接口如下:

rt_err_trt_mb_delete(rt_mailbox_tmb);

删除邮箱时,如果有线程被挂起在该邮箱对象上,内核先唤醒挂起在该邮箱上的所有线程(线程返回值是-RT_ERROR),然后再释放邮箱使用的内存,最后删除邮箱对象。

初始化和脱离邮箱

初始化邮箱用于静态对象,内存编译时分配于数据段,初始化过程与创建邮箱类似,仅内存分配方式不同。

函数接口如下:

rt_err_trt_mb_init(rt_mailbox_tmb,

constchar*name,

void*msgpool,

rt_size_tsize,

rt_uint8_tflag)

初始化邮箱需提供对象控制块、缓冲区指针、名称和容量,容量为缓冲区字节

文档评论(0)

ning2021 + 关注
实名认证
文档贡献者

中医资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2023年05月10日上传了中医资格证

1亿VIP精品文档

相关文档