嵌入式实时操作系统μcos原理与实践5_第1页
嵌入式实时操作系统μcos原理与实践5_第2页
嵌入式实时操作系统μcos原理与实践5_第3页
嵌入式实时操作系统μcos原理与实践5_第4页
嵌入式实时操作系统μcos原理与实践5_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、作者卢有亮 图书PPT和全部代码下载/15441嵌入式实时操作系统C/OS原理与实践教材 :嵌入式实时操作系统C/OS原理与实践电子工业作者:卢有亮电子科技大学能源科学与工程学院作者卢有亮 图书PPT和全部代码下载/15441PPT和全部代码下载 /15441说明面世来受到欢迎,除不能免费的书之外本书籍2012年2月在电子工业人提供了1.教学PPT2.15个学时实验教学PPT3.示例代码(含UCOSV2.91

2、全部源码,用于实验和源码学习,可在 VC下单步运行,直观方便)4.29个视频5.交流微群(人数无限制)这些全部免费,最新的以上内容下载地址不清楚可以到本人博客留言!代码的下载地址也在博客提供(因为经常会更新会变化)!配套代码请查看本人博客(另外微博昵称 90):/u/2630123921在 网 上 观 看 视 频 ( 土 豆 、 优 酷 ) /playlist/id/15295771/ /playlist_show/id_17137380.html新浪交流微群:PPT和全部代

3、码下载 /15441第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 消息队列应用举例习题新浪交流微群:PPT和全部代码下载 http:/www.broadvie

4、/15441在信号量、互斥信号量和标志组的内容结束后,读者对之间如何同步,如何根据不同需要设计同步程序,应该有了深入的理解和提高。本章的消息管理中包括消息邮箱和消息队列两方面的内容,适用于任务之间的信息交流和同步。从原理上讲,消息管理也应该属于畴 。管理的范新浪交流微群:PPT5和.1全部消代码息下邮载 h箱ttp://15441消息邮箱是C/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个消息。传递这个消息的媒体是一个指针型变量,该指针指向一个包含了“消息”的某种数据结构。新浪交流微群:PPT在系统初始

5、化之后,并不存在一个消息邮箱。这时操数据结构控制块ECB为全空,所有的控表中排队。消息邮箱的建立函数OSMboxCreate将个ECB,使其具备消息邮箱的属性。表5.2创建信号量函数OSMboxCreate解析1.检查是否这中断服务程序中创建消息邮箱。同不允许在中断服务程序中创建信号量一样,操作系许在中断服务程序中创建消息邮箱。2.检查是否有空闲的控制块。将OSEventFreeList赋值给pevent,如果pevent为空控制块,函数返回。3.在控制块空闲链表中取下表头。因为pevent现在已经是用于邮箱的控制块,读者一个邮箱。那么,需要执行的操作显然就是在 将他删除,这时候OSEvent

6、FreeList应该指向第二4.对控制块赋值和全部代码下载 /154415.1.1 建立消息邮箱作系统中的管理制块都在ECB空闲链使用一个并配置一统C/OS-II同样不允 指针,表示没有空闲的可以直接把他理解为控制块空闲链表中个ECB。假设信号量值为5,则赋值后的ECB应该如图5-1所示5.返回ECB地址。新浪交流微群:PPT/15441和全部代码下载新浪交流微群:PPT新浪交流表5.3等待消息邮箱函数OSMboxPend解和.1.2全部等消息代码下载 http:/www.broadview

7、./1等消息也称为请求消息。含义是当消息存在的时候在的时候就放弃对CPU的占有,直到有消息的时候的操作离不开消息,这时任务就不该死死占着CPU就应该去休息,而当消息到来的时候系统会将消息得消息后继续运行。析54415开始参数检查是否通过是pmsg是否否不为空否获取消息,当消息不存才被唤醒。当任务后续不让其他的任务运行,perr中填写对应的出错信息唤醒回就绪态,任务获是是 这里任务被执行一次任务调度了CPU! 进入阻塞态!等待标志是否有效 这里任务 又一次被调度 了!从阻塞态回到就绪态又被调度是否是否是等待超时是否返回值设置为OS_NO_ERR任务可使用资源清除任务块相关等待标志返回

8、值设置为OS_ERR_PEND_ABORT任务仍不能使用资源返回值设置为OS_TIMEOUT任务仍不能使用资源微群:返回调用OS_EventTaskRemove 清除任务块相关等待标志和任务块OSTCBStat如果是资源满足而结束等待,只需要设置任务块的ECB 指针为空调用OS_EventTaskWait终止当前任务,ECB表中添加当前任务存储超时时间到OSTCBDly 及等待状况OSTCBStatPend置位OSTCBStat中等待消息标志将邮箱中的消息地址送pmsgPPT和全部代码下载 /154415.1.3 发消息当一个任务因为等待消息

9、而被阻塞的时候,只有当其他任务被阻塞的任务才能被恢复到就绪态,从而获得消息后继续运数在前一节分析过了,发消息的函数为OSMboxPost,参数ECB的指针,以及消息的地址。表5.4发消息函数OSMboxPost解析开始参数检查是否通过是是否有任务等待是该信号量发出了消息, 行。阻塞的函是消息类型的否返回值进行相应设置,提示出错否调 用 OS_EventTaskRdy 使等待该消息的最高优先级任务就绪邮箱是否是满的是否将消息放入邮箱返回新浪交流微群:返回值设置为OS_ERR_MBOX_FULL返回值设置为OS_NO_ERR返回值设置为或OS_NO_ERR执行一次任务调度PPT和全部代码下载 ht

10、tp://15.1.4 删除消息邮箱当消息邮箱不再使用了,就应该尽快归还给系统, 空闲链表以备它用。消息邮箱的删除函数是OSMbo 方方面面,因为可能有任务正在等待这个邮箱中的表5.5删除消息邮箱的函数OSMboxDel解析新浪交开始参数检查是是否通过即将消息占用的ECB归还给ECB xDel。删除一个消息也要涉及 消息。OS_DEL_ALWAYS根据opt值进行分支转移OS_DEL_NO_PEND否无任务等待该邮箱?其他值是设置该ECB属性为否未用空闲ECB链表表头插入该ECB流微群:返回5441若有任务等待该信号量执行一次任务调度设置该ECB属性为未

11、用空闲ECB链表表头插入该ECB使所有的等待该信号量的任务就绪若有任务等待该邮箱Tasks_waiting=TRUE 否则为FALSEPPT和全部代码下载 /154415.1.5放弃邮箱等待同放弃对信号量的等待类似,放弃等待邮箱也绝对不会是放弃本任务对邮箱的等待。放弃等待邮箱函数将放弃的是所有等待某邮箱的任务对该邮箱的等待或等待某邮箱的优先级最高的任务对邮箱的等待。表5.6放弃等待邮箱函数OSMboxPendAbort解析流程如下: 1.检查控制块指针是否有效及控制块类型是否有效。2. 如果pevent-OSEventGrp为0说明没有任务等

12、待消息邮箱,取消等待的任务数是0,返回0。3. 否则根据参数opt(选项)进行分支转移,如为OS_PEND_OPT_BROADCAST,使用while语句循环地将等待该邮箱的每个任务用OS_EventTaskRdy来取消等待并使其就绪(除非任务还被挂起);如果为其他值则只将最高优先级的任务取消等待并就绪之。4. 返回取消等待信号量的任务数。新浪交流微群:PPT和全部代码下载 /154415.1.6 无等待请求消息新浪交流微群:在中断服务程序和有些用户任务中,需要无等待的请求消息邮箱。也就是说,到邮箱中取邮件,如果有邮件就获得邮件,如果没有并不

13、阻塞自己,而是继续执行其他代码。OSMboxAccept就是无等待的请求消息邮箱函数,参数是请求的消息邮箱的ECB指针。该函数的返回值是指向邮箱的指针,如果没有取得消息,那么就返回空指针。表5.7无等待地请求消息邮箱函数OSMboxAccept解析首先参数检查ECB是否有效,如果有效,将消息邮箱中邮件的地址OSEventPtr赋值给pmsg,然后清邮箱内容,返回获得的邮件的地址pmsg。这样,如果邮箱中有邮件,那么返回邮件的地址,如果没有,返回值就是空地址。PPT和全部代码下载 /154415.1.7查询邮箱状态新浪交流微群:消息邮箱状态查询

14、函数OSMboxQuery的参数是ECB地址和一个指向OS_MBOX_DATA类型的地址。ECB地址指向邮箱,OS_MBOX_DATA类型的地址指向返回结果的一个S_MBOX_DATA类型的对象。表5.9查询消息邮箱状态函数OSMboxQuery解析PPT5.1.8 消息邮箱的例子假设有任务TaskMessageSen和TaskMessageRec, TaskMessageSen在 片1创建一个邮箱,如果邮箱中已没有邮件,每秒向邮箱发送一个消息,消息内容为从0 开始的计数值,该计数值每秒加1。任务TaskMessageRec从时间1开始,做的事情就是查看邮箱,然后把邮件打印出来。现在我们采用邮

15、件管理完成这两个任务的设计。新浪交流微群:和全部代码下载 /15441PPT新浪交流微群:和全部代码下载 /154415.2 消息队列消息邮箱中只能存放一则消息,太少了,能不能像电子邮件一样,管理多条消息呢?C/OS为实现这一目的,设计了消息队列管理。使用消息队列管理,就允许使用可以容纳多条信息的大邮箱,按照先进先出(FIFO)的原则,发送和接收邮件。需要注意的是,这样的邮箱不是操作系统提供的,而是要由用户任务来提供。操作系统提供的是对其进行管理的程序。另外,邮箱中的内容仍然是邮件的地址。消

16、息队列的代码单独存放在os_q.c中PPT和全部代码下载 /154415.2.1 消息队列数据结构1消息队列及其控制块typedef struct os_q struct os_q*OSQPtr;/* 队列控制块QCB*/*在空闲QCB链表中,指示下一个QCB*/*队列数据的首地址*/*队列数据的末地址*/*指示下次插入消息的位置 */* 指示下次提取消息的位置*/*队列的最大容量*/*队列中当前的消息量*/void void void void*OSQStart;*OSQEnd;*OSQIn;*OSQOut;INT16U INT16U OS

17、_Q;OSQSize; OSQEntries;2消息控制块实体OS_QOSQTblOS_MAX_QS;3空闲消息队列链表消息控制块QCB中OSQWaitList用来指示空闲消息控制块QCB链表中的下一个消息控制块QCB。新浪交流微群:PPT和全部代码下载 /15441新浪交流微群:PPT和全部代码下载 /154415.2.2 初始化消息队列消息队列初始化函数在操作系统初始化时被调用,主要用于初始化消息队列使用的数据结构。消息队列初始化函数的名称为OS_QInit表5.13消息队列初始化函数O

18、S_QInit解析1. 将所有QCB全部清为全0。2. 使用for循环将除最后一个消息控制块OSQTblOS_MAX_QS - 1之外的所有消息控制块初始化,构建了单向的消息队列空闲链表。3. 初始化最后一个QCB,将消息队列空闲链表完善。新浪交流微群:PPT5.2.和3 建全立部消代息码队下列载 /15441创建消息队列就是将从ECB空闲链表中取下一个控制块ECB来,将其用于消息队列管理。并从QCB空闲链表的表头取下一个消息控制块QCB,将其各种属性进行设置,用于指示消息的位置以及提取和插入消息的位置。创建消息队列的函数名称为OSQCrea

19、te。表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即消息指针数组(消息队列)中最后一个指

20、针后面的一个地址。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指针。新浪交流微群:PPT和全部代码下载 /154415.2.4发消息到消息队列发消息到消息队列的函数

21、名称为OSQPost。参数是和消息的地址pmsg。控制块ECB的地址pevent表5.15发消息到消息对列函数OSQPost分析1. 首先进行参数检查,如果参数检查失败则返回。2. 如果有任务等待消息队列中的消息,那么消息队列现在必然是空的。不需要将消息存入队列,而直接将消息给在等待的优先级最高的消息,并将其就绪。执行一次任务调度然后返回。3. 如果没有任务等待消息队列中的消息,那么就需要将该消息加入消息队列。如果消息队列是满的,不能容纳更多的消息,返回出错信息。否则,在消息控制块QCB 的OSQIn所指示的消息指针数组位置存入该消息,然后将OSQIn 指向下一个单元以便下次使用。判断OSQI

22、n是否到超过了表尾,如果超过了,将其指向队首。然后返回。新浪交流微群:PPT和全部代码下载 /154415.2.5等待消息队列中的消息等待消息队列的消息是消息队列管理中的又一核心函数。如果消息队列中有消息, 那么就取出消息,然后返回;如果没有消息,只有在ECB中标记自己的等待,然后阻塞。等待消息队列的函数的名称为OSQPend,参数是ECB的指针、等待超时时间和返回函数执行信息的指针的perr。函数的返回值是指向消息的指针。表5.16消息队列等待函数OSQPend分析1. 首先进行参数、ECB类型、中断、调度锁检查,失败则返回。2. 取得EC

23、B中的QCB指针,查询消息队列中是否有消息。如果有消息,那么请求直接成功,取得消息队列中OSQOut所指的消息,将OSQOut指向消息队列中的下一个元素以备下一次的消息提取。如果OSQOut指向了消息队列之外,就指向消息队列的首地址。将OSQEntries减1表示消息数量减少了一个。然后返回消息的指针。3. 如果没有消息,那么任务就只有被阻塞。首先在TCB中的STCBStat中添加消息队列等待标志,任务延时时间,初始化等待状态,然后调用OS_EventTaskWait 添加等待标志和取消就绪标志,接着调用OS_Sched执行一次任务调度。4. 任务恢复运行后,根据TCB中的等待状态OSTCBS

24、tatPend决定程序走向。如果获得了消息,进行一些处理后返回该消息。如果是退出等待,或是等待超时,分别填写没有取得消息的原因,然后返回空指针。新浪交流微群:PPT和全部代码下载 /154415.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_IN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论