嵌入式实时操作系统μCOS原理与实践5.ppt
《嵌入式实时操作系统μCOS原理与实践5.ppt》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统μCOS原理与实践5.ppt(24页珍藏版)》请在三一办公上搜索。
1、嵌入式实时操作系统C/OS原理与实践,教材:嵌入式实时操作系统C/OS原理与实践电子工业出版社 作者:卢有亮 电子科技大学能源科学与工程学院,第5章 消息管理,5.1 消息邮箱5.1.1 建立消息邮箱5.1.2等消息5.1.3 发消息5.1.4 删除消息邮箱5.1.5放弃邮箱等待5.1.6 无等待请求消息5.1.7查询邮箱状态5.1.8 消息邮箱的例子5.2 消息队列5.2.1 消息队列数据结构5.2.2 初始化消息队列5.2.3 建立消息队列5.2.4发消息到消息队列5.2.5等待消息队列中的消息5.2.6删除消息队列5.2.7取得消息队列的状态5.2.8消息队列应用举例习题,在信号量、互斥
2、信号量和事件标志组的内容结束后,读者对事件之间如何同步,如何根据不同需要设计同步程序,应该有了深入的理解和提高。本章的消息管理中包括消息邮箱和消息队列两方面的内容,适用于任务之间的信息交流和同步。从原理上讲,消息管理也应该属于事件管理的范畴。,5.1 消息邮箱,消息邮箱是C/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个消息。传递这个消息的媒体是一个指针型变量,该指针指向一个包含了“消息”的某种数据结构。,5.1.1 建立消息邮箱,在系统初始化之后,并不存在一个消息邮箱。这时操作系统中的事件管理数据结构事件控制块ECB为全空,所有的事件控制块都在ECB空闲链
3、表中排队。消息邮箱的建立函数OSMboxCreate将使用一个并配置一个ECB,使其具备消息邮箱的属性。表5.2创建信号量函数OSMboxCreate解析 1.检查是否这中断服务程序中创建消息邮箱。同不允许在中断服务程序中创建信号量一样,操作系统C/OS-II同样不允许在中断服务程序中创建消息邮箱。2.检查是否有空闲的事件控制块。将OSEventFreeList赋值给pevent,如果pevent为空指针,表示没有空闲的事件控制块,函数返回。3.在事件控制块空闲链表中取下表头。因为pevent现在已经是用于邮箱的事件控制块,读者可以直接把他理解为一个邮箱。那么,需要执行的操作显然就是在事件控制
4、块空闲链表中将他删除,这时候OSEventFreeList应该指向第二个ECB。4.对事件控制块赋值假设信号量值为5,则赋值后的ECB应该如图5-1所示 5.返回ECB地址。,5.1.2等消息,等消息也称为请求消息。含义是当消息存在的时候获取消息,当消息不存在的时候就放弃对CPU的占有,直到有消息的时候才被唤醒。当任务后续的操作离不开消息,这时任务就不该死死占着CPU不让其他的任务运行,就应该去休息,而当消息到来的时候系统会将消息唤醒回就绪态,任务获得消息后继续运行。表5.3等待消息邮箱函数OSMboxPend解析,5.1.3 发消息,当一个任务因为等待消息而被阻塞的时候,只有当其他任务发出了
5、消息,被阻塞的任务才能被恢复到就绪态,从而获得消息后继续运行。阻塞的函数在前一节分析过了,发消息的函数为OSMboxPost,参数是消息类型的ECB的指针,以及消息的地址。表5.4发消息函数OSMboxPost解析,5.1.4 删除消息邮箱,当消息邮箱不再使用了,就应该尽快归还给系统,即将消息占用的ECB归还给ECB空闲链表以备它用。消息邮箱的删除函数是OSMboxDel。删除一个消息也要涉及方方面面,因为可能有任务正在等待这个邮箱中的消息。表5.5删除消息邮箱的函数OSMboxDel解析,5.1.5放弃邮箱等待,同放弃对信号量的等待类似,放弃等待邮箱也绝对不会是放弃本任务对邮箱的等待。放弃等
6、待邮箱函数将放弃的是所有等待某邮箱的任务对该邮箱的等待或等待某邮箱的优先级最高的任务对邮箱的等待。表5.6放弃等待邮箱函数OSMboxPendAbort解析流程如下:1.检查事件控制块指针是否有效及事件控制块类型是否有效。2.如果pevent-OSEventGrp为0说明没有任务等待消息邮箱,取消等待的任务数是0,返回0。3.否则根据参数opt(选项)进行分支转移,如为OS_PEND_OPT_BROADCAST,使用while语句循环地将等待该邮箱的每个任务用OS_EventTaskRdy来取消等待并使其就绪(除非任务还被挂起);如果为其他值则只将最高优先级的任务取消等待并就绪之。4.返回取消
7、等待信号量的任务数。,5.1.6 无等待请求消息,在中断服务程序和有些用户任务中,需要无等待的请求消息邮箱。也就是说,到邮箱中取邮件,如果有邮件就获得邮件,如果没有并不阻塞自己,而是继续执行其他代码。OSMboxAccept就是无等待的请求消息邮箱函数,参数是请求的消息邮箱的ECB指针。该函数的返回值是指向邮箱的指针,如果没有取得消息,那么就返回空指针。表5.7无等待地请求消息邮箱函数OSMboxAccept解析首先参数检查ECB是否有效,如果有效,将消息邮箱中邮件的地址OSEventPtr赋值给pmsg,然后清邮箱内容,返回获得的邮件的地址pmsg。这样,如果邮箱中有邮件,那么返回邮件的地址
8、,如果没有,返回值就是空地址。,5.1.7查询邮箱状态,消息邮箱状态查询函数OSMboxQuery的参数是ECB地址和一个指向OS_MBOX_DATA类型的地址。ECB地址指向邮箱,OS_MBOX_DATA类型的地址指向返回结果的一个S_MBOX_DATA类型的对象。表5.9查询消息邮箱状态函数OSMboxQuery解析,5.1.8 消息邮箱的例子,假设有任务TaskMessageSen和TaskMessageRec,TaskMessageSen在事件片1创建一个邮箱,如果邮箱中已没有邮件,每秒向邮箱发送一个消息,消息内容为从0开始的计数值,该计数值每秒加1。任务TaskMessageRec从
9、时间1开始,做的事情就是查看邮箱,然后把邮件打印出来。现在我们采用邮件管理完成这两个任务的设计。,5.2 消息队列,消息邮箱中只能存放一则消息,太少了,能不能像电子邮件一样,管理多条消息呢?C/OS为实现这一目的,设计了消息队列管理。使用消息队列管理,就允许使用可以容纳多条信息的大邮箱,按照先进先出(FIFO)的原则,发送和接收邮件。需要注意的是,这样的邮箱不是操作系统提供的,而是要由用户任务来提供。操作系统提供的是对其进行管理的程序。另外,邮箱中的内容仍然是邮件的地址。消息队列的代码单独存放在os_q.c中,5.2.1 消息队列数据结构,1消息队列及其控制块typedef struct os
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实时 操作系统 COS 原理 实践
链接地址:https://www.31ppt.com/p-5712196.html