- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
备注页 第七讲 任务同步与通信 主要内容 1. 事件控制块ECB 2. 信号量 3. 邮箱 4. 消息队列 1. 事件控制块ECB 事件控制块ECB 初始化一个ECB块 OSEVENTWAITLISTINIT() 使一个任务进入就绪状态 OSEVENTTASKRDY() 使一个任务进入等待状态 OSEVENTTASKWAIT() 由于等待超时将一个任务置为就绪状态 OSEVENTTO() 事件控制块ECB μC/OS-II通过定义的OS_EVENT数据结构(事件控制块ECB)来维护一个事件控制块的所有信息; 该结构中除了包含了: 事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等; 等待该事件的所有任务的列表; OSEventType定义了事件的具体类型,可以是: 信号量(OS_EVENT_SEM); 邮箱(OS_EVENT_TYPE_MBOX); 或消息队列(OS_EVENT_TYPE_Q)中的一种; 与任务就绪列表类似! 当一个事件发生后,等待事件列表中优先级最高的任务(即在OSEventTbl[] OSEventGrp中所有被置1的位中优先级数值最小的任务)得到该事件 事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定; 该值由OS_CFG.H 中的#define OS_MAX_EVENTS定义; 在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表; 每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化; 因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中; 对于事件控制块进行的一些通用操作包括: 初始化一个事件控制块 使一个任务进入就绪态 使一个任务进入等待该事件的状态 因为等待超时而使一个任务进入就绪态 μC/OS-II将上面的操作用4个系统函数实现,它们是: OSEventWaitListInit() OSEventTaskRdy() OSEventWait() OSEventTO() 初始化一个事件控制块OSEventWaitListInit() 当建立一个信号量、邮箱或者消息队列时,相应的建立函数OSSemCreate(),OSMboxCreate(),或者OSQCreate()通过调用OSEventWaitListInit()对事件控制块中的等待任务列表进行初始化; 该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。 使一个任务进入就绪态OSEventTaskRdy() 当发生了某个事件,该事件对应的OSSemPost(),OSMboxPost(),OSQPost(),和OSQPostFront()函数调用OSEventTaskRdy(); 该函数从等待任务队列中删除HPT任务(Highest Priority Task),并把该任务置于就绪态; 使一个任务进入等待某事件发生状态 OSEventTaskWait() 当某个任务要等待一个事件的发生时,相应事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用该函数OSEventTaskWait(); 该函数将当前任务从就绪任务表中删除,并放到相应事件的事件控制块的等待任务表中; 等待超时而将任务置为就绪态 OSEventTO() 当在预先指定的时间内任务等待的事件没有发生时,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪; 在这种情况下,事件的OSSemPend(),OSMboxPend()或者OSQPend()函数会调用OSEventTO()来完成这项工作; 该函数负责从事件控制块中的等待任务列表里将任务删除,并把它置成就绪状态; 2. 信号量 信号量 建立信号量OSSemCreate() 等待信号量 OSSemPend() 发送信号量 OSSemPost() 无等待地请求信号量 OSSemAccept() 查询信号量的当前状态 OSSemQuery() μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表 ; 如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。最后,如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用; μC/OS-II提供了5个对信号量进行操作的函数:OSSemCreate(),OSSemPend(),OSSemPost(
文档评论(0)