欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    嵌入式实时操作系统μCOS原理与实践5.ppt

    • 资源ID:2592484       资源大小:682.51KB        全文页数:24页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式实时操作系统μCOS原理与实践5.ppt

    嵌入式实时操作系统C/OS原理与实践,教材 :嵌入式实时操作系统C/OS原理与实践 电子工业出版社 作者:卢有亮 luyluestc.edu.cn 电子科技大学能源科学与工程学院,第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消息队列应用举例 习题,在信号量、互斥信号量和事件标志组的内容结束后,读者对事件之间如何同步,如何根据不同需要设计同步程序,应该有了深入的理解和提高。本章的消息管理中包括消息邮箱和消息队列两方面的内容,适用于任务之间的信息交流和同步。从原理上讲,消息管理也应该属于事件管理的范畴 。,5.1 消息邮箱,消息邮箱是C/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个消息。传递这个消息的媒体是一个指针型变量,该指针指向一个包含了“消息”的某种数据结构。,5.1.1 建立消息邮箱,在系统初始化之后,并不存在一个消息邮箱。这时操作系统中的事件管理数据结构事件控制块ECB为全空,所有的事件控制块都在ECB空闲链表中排队。消息邮箱的建立函数OSMboxCreate将使用一个并配置一个ECB,使其具备消息邮箱的属性。 表5.2创建信号量函数OSMboxCreate解析 1.检查是否这中断服务程序中创建消息邮箱。 同不允许在中断服务程序中创建信号量一样,操作系统C/OS-II同样不允许在中断服务程序中创建消息邮箱。 2.检查是否有空闲的事件控制块。 将OSEventFreeList赋值给pevent,如果pevent为空指针,表示没有空闲的事件控制块,函数返回。 3.在事件控制块空闲链表中取下表头。 因为pevent现在已经是用于邮箱的事件控制块,读者可以直接把他理解为一个邮箱。那么,需要执行的操作显然就是在事件控制块空闲链表中将他删除,这时候OSEventFreeList应该指向第二个ECB。 4.对事件控制块赋值 假设信号量值为5,则赋值后的ECB应该如图5-1所示 5.返回ECB地址。,5.1.2等消息,等消息也称为请求消息。含义是当消息存在的时候获取消息,当消息不存在的时候就放弃对CPU的占有,直到有消息的时候才被唤醒。当任务后续的操作离不开消息,这时任务就不该死死占着CPU不让其他的任务运行,就应该去休息,而当消息到来的时候系统会将消息唤醒回就绪态,任务获得消息后继续运行。 表5.3等待消息邮箱函数OSMboxPend解析,5.1.3 发消息,当一个任务因为等待消息而被阻塞的时候,只有当其他任务发出了消息,被阻塞的任务才能被恢复到就绪态,从而获得消息后继续运行。阻塞的函数在前一节分析过了,发消息的函数为OSMboxPost,参数是消息类型的ECB的指针,以及消息的地址。 表5.4发消息函数OSMboxPost解析,5.1.4 删除消息邮箱,当消息邮箱不再使用了,就应该尽快归还给系统,即将消息占用的ECB归还给ECB空闲链表以备它用。消息邮箱的删除函数是OSMboxDel。删除一个消息也要涉及方方面面,因为可能有任务正在等待这个邮箱中的消息。 表5.5删除消息邮箱的函数OSMboxDel解析,5.1.5放弃邮箱等待,同放弃对信号量的等待类似,放弃等待邮箱也绝对不会是放弃本任务对邮箱的等待。放弃等待邮箱函数将放弃的是所有等待某邮箱的任务对该邮箱的等待或等待某邮箱的优先级最高的任务对邮箱的等待。 表5.6放弃等待邮箱函数OSMboxPendAbort解析 流程如下: 1.检查事件控制块指针是否有效及事件控制块类型是否有效。 2.如果pevent-OSEventGrp为0说明没有任务等待消息邮箱,取消等待的任务数是0,返回0。 3.否则根据参数opt(选项)进行分支转移,如为OS_PEND_OPT_BROADCAST,使用while语句循环地将等待该邮箱的每个任务用OS_EventTaskRdy来取消等待并使其就绪(除非任务还被挂起);如果为其他值则只将最高优先级的任务取消等待并就绪之。 4.返回取消等待信号量的任务数。,5.1.6 无等待请求消息,在中断服务程序和有些用户任务中,需要无等待的请求消息邮箱。也就是说,到邮箱中取邮件,如果有邮件就获得邮件,如果没有并不阻塞自己,而是继续执行其他代码。 OSMboxAccept就是无等待的请求消息邮箱函数,参数是请求的消息邮箱的ECB指针。该函数的返回值是指向邮箱的指针,如果没有取得消息,那么就返回空指针。 表5.7无等待地请求消息邮箱函数OSMboxAccept解析 首先参数检查ECB是否有效,如果有效,将消息邮箱中邮件的地址OSEventPtr赋值给pmsg,然后清邮箱内容,返回获得的邮件的地址pmsg。这样,如果邮箱中有邮件,那么返回邮件的地址,如果没有,返回值就是空地址。,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从时间1开始,做的事情就是查看邮箱,然后把邮件打印出来。 现在我们采用邮件管理完成这两个任务的设计。,5.2 消息队列,消息邮箱中只能存放一则消息,太少了,能不能像电子邮件一样,管理多条消息呢? C/OS为实现这一目的,设计了消息队列管理。使用消息队列管理,就允许使用可以容纳多条信息的大邮箱,按照先进先出(FIFO)的原则,发送和接收邮件。需要注意的是,这样的邮箱不是操作系统提供的,而是要由用户任务来提供。操作系统提供的是对其进行管理的程序。另外,邮箱中的内容仍然是邮件的地址。 消息队列的代码单独存放在os_q.c中,5.2.1 消息队列数据结构,1消息队列及其控制块 typedef struct os_q /* 队列控制块QCB*/ struct os_q *OSQPtr; /*在空闲QCB链表中,指示下一个QCB*/ void *OSQStart; /*队列数据的首地址*/ void *OSQEnd; /*队列数据的末地址*/ void *OSQIn; /*指示下次插入消息的位置 */ void *OSQOut; /* 指示下次提取消息的位置*/ INT16U OSQSize; /*队列的最大容量*/ INT16U OSQEntries; /*队列中当前的消息量*/ OS_Q; 2消息控制块实体 OS_Q OSQTblOS_MAX_QS; 3空闲消息队列链表 消息控制块QCB中OSQWaitList用来指示空闲消息控制块QCB链表中的下一个消息控制块QCB。,5.2.2 初始化消息队列,消息队列初始化函数在操作系统初始化时被调用,主要用于初始化消息队列使用的数据结构。消息队列初始化函数的名称为OS_QInit 表5.13消息队列初始化函数OS_QInit解析 1. 将所有QCB全部清为全0。 2. 使用for循环将除最后一个消息控制块OSQTblOS_MAX_QS - 1之外的所有消息控制块初始化,构建了单向的消息队列空闲链表。 3.初始化最后一个QCB,将消息队列空闲链表完善。,5.2.3 建立消息队列,创建消息队列就是将从ECB空闲链表中取下一个事件控制块ECB来,将其用于消息队列管理。并从QCB空闲链表的表头取下一个消息控制块QCB,将其各种属性进行设置,用于指示消息的位置以及提取和插入消息的位置。 创建消息队列的函数名称为OSQCreate。 表5.14消息队列创建函数OSQCreate分析 1. 判断是否在中断服务程序中调用本函数,如果是就返回。 2. 取得消息队列的链表首地址送pevent。 3. 判断pevent是否为空指针,如果是则说明是系统已经没有空闲的ECB可供使用,填写错误信息,返回空指针。 4. 从空闲ECB链表取下表头。 5. 空闲QCB链表首地址送pq。 6. 如果没有有效的空闲QCB链表,恢复空闲ECB链表,返回空ECB指针。 7. 在空闲QCB链表中取一个pq指向的QCB,对其进行初始化。设置OSQStart为消息指针数组的首地址start。OSQEnd值为&startsize即消息指针数组(消息队列)中最后一个指针后面的一个地址。OSQIn和OSQOut也设置为start。OSQSize的值为size。OSQEntries为0表示该队列中还没有消息。 8. 接下来对pevent指向的ECB进行初始化。OSEventType为OS_EVENT_TYPE_Q表示用于消息队列管理。OSEventCnt在这里没有用,设置为0。OSEventPtr指向QCB,即设置为pq。调用OS_EventWaitListInit初始化ECB中的事件等待表和事件等待组。 9.返回ECB指针。,5.2.4发消息到消息队列,发消息到消息队列的函数名称为OSQPost。参数是事件控制块ECB的地址pevent和消息的地址pmsg。 表5.15发消息到消息对列函数OSQPost分析 1.首先进行参数检查,如果参数检查失败则返回。 2. 如果有任务等待消息队列中的消息,那么消息队列现在必然是空的。不需要将消息存入队列,而直接将消息给在等待的优先级最高的消息,并将其就绪。执行一次任务调度然后返回。 3. 如果没有任务等待消息队列中的消息,那么就需要将该消息加入消息队列。如果消息队列是满的,不能容纳更多的消息,返回出错信息。否则,在消息控制块QCB的OSQIn所指示的消息指针数组位置存入该消息,然后将OSQIn 指向下一个单元以便下次使用。判断OSQIn是否到超过了表尾,如果超过了,将其指向队首。然后返回。,5.2.5等待消息队列中的消息,等待消息队列的消息是消息队列管理中的又一核心函数。如果消息队列中有消息,那么就取出消息,然后返回;如果没有消息,只有在ECB中标记自己的等待,然后阻塞。 等待消息队列的函数的名称为OSQPend,参数是ECB的指针、等待超时时间和返回函数执行信息的指针的perr。函数的返回值是指向消息的指针。 表5.16消息队列等待函数OSQPend分析 1.首先进行参数、ECB类型、中断、调度锁检查,失败则返回。 2. 取得ECB中的QCB指针,查询消息队列中是否有消息。如果有消息,那么请求直接成功,取得消息队列中OSQOut所指的消息,将OSQOut指向消息队列中的下一个元素以备下一次的消息提取。如果OSQOut指向了消息队列之外,就指向消息队列的首地址。将OSQEntries减1表示消息数量减少了一个。然后返回消息的指针。 3. 如果没有消息,那么任务就只有被阻塞。首先在TCB中的STCBStat中添加消息队列等待标志,任务延时时间,初始化等待状态,然后调用OS_EventTaskWait 添加等待标志和取消就绪标志,接着调用OS_Sched执行一次任务调度。 4. 任务恢复运行后,根据TCB中的等待状态OSTCBStatPend决定程序走向。如果获得了消息,进行一些处理后返回该消息。如果是退出等待,或是等待超时,分别填写没有取得消息的原因,然后返回空指针。,5.2.6删除消息队列,当消息队列不再使用了,就应该尽快归还给系统,即将消息占用的ECB归还给ECB空闲链表以备它用,将QCB也归还给空闲QCB链表。 删除消息队列的函数的名称为OSQDel,参数是ECB的指针、删除操作的选项opt和返回函数执行信息的指针的perr。 其中opt的值为 OS_DEL_NO_PEND 表示只有当没有任务等待该消息队列的时候才允许删除,opt的值为OS_DEL_ALWAYS 表示无论如何都删除。 如果成功删除,返回空指针;否则返回ECB的指针。 表5.17消息队列删除函数OSQDel解析 1.首先进行参数的检查。 2. 根据选项opt决定程序的分支 3. 如果opt不是这两个值当中的一个,那就是说明是错误的选项,也属于参数检查失败。因此,标记错误信息perr为OS_ERR_INVALID_OPT后,直接返回原来ECB指针pevent。,5.2.7取得消息队列的状态,消息队列数据OS_Q_DATA是为返回消息队列信息而提供的,因此用户程序如果想了解消息队列的信息,要先创建OS_Q_DATA的实例。然后以消息队列所在ECB地址及该实例的地址为指针为参数调用获取消息队列的状态函数OSQQuery 表5.19获取消息队列的状态函数OSQQuery解析,5.2.8消息队列应用举例,假设有任务TaskQSen和TaskQRec, TaskQSen在时间片1创建一个消息队列,然后每秒向消息队列中发邮件,其余时间延时。TaskQRec每2秒从消息队列中取邮件,然后延时。 表5.20消息邮箱的例子,习题 1. 比较消息管理和信号量管理,指出他们的区别和共同点。 2. 消息队列管理使用了哪些数据结构,请描述他们之间的关系。 3. 请分析等待消息的过程都涉及了哪些数据结构,画出消息等待的流程。 4. 请分析发消息的过程都涉及了哪些数据结构,画出发消息的流程。 5. 请分析删除消息队列的过程都涉及了哪些数据结构,画出删除消息队列的流程。 6. 请分析提取消息队列信息的过程都涉及了哪些数据结构,画出提取消息队列信息的流程。 7. 有任务A、任务B。任务A接收屏幕上输入的数据,然后将该数据送给任务B,任务B能立刻打印出该数据。请采用消息管理编程实现任务A和任务B并上机实践。 8. 有任务A、任务B。任务A接收屏幕上输入的数据,然后将该数据送给任务B,任务B每20秒打印一次这20秒内接收到的数据。请采用消息队列管理编程实现任务A和任务B并上机实践。,

    注意事项

    本文(嵌入式实时操作系统μCOS原理与实践5.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开