[工学]第4章 任务间的同步与通信.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第4章 任务间的同步与通信

1 同步与通信概述 同步:多个任务相互协作共同完成一件事情时,其间存在的直接制约关系称为任务间的同步。 互斥:任务之间由于共享临界资源而存在的间接制约关系称为任务间的互斥。 通信:任务间信息的交换称为任务间的通讯 事件:任务间通信所使用的信息载体统称为事件,主要有 信号量、互斥型信号量、消息邮箱、消息队列、信号量集。 2 事件控制块ECB 事件控制块数据结构 事件控制块等待任务表操作 将任务置于等待任务表中 使任务脱离等待状态 在等待任务表中查找优先级最高的任务 空事件控制块链表 事件控制块操作函数 事件控制块初始化 使一个任务进入等待状态 使一个等待任务进入就绪态 使一个超时任务进入就绪态 1)事件控制块数据结构 .OSEventType定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、消息邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。 .OSEventPtr指针,只有在所定义的事件是消息邮箱或者消息队列时才使用。当所定义的事件是消息邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。 1)事件控制块数据结构 .OSEventTbl[] 和 .OSEventGrp 很像前面讲到的OSRdyTbl[]和OSRdyGrp,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。 .OSEventCnt 当事件是一个信号量时,该量是用于信号量的计数器。 2) 等待任务表的操作 将任务置于等待任务表中 任务优先级的最低3位决定了该任务在相应的.OSEventTbl[]中的位置,紧接着的3位则决定了该任务优先级在.OSEventTbl[]中的字节索引。 2) 等待任务表的操作 使任务脱离等待状态 清除任务在.OSEventTbl[]中的相应位,如果其所在的组中不再有处于等待该事件的任务时,将.OSEventGrp中的相应位也清除。 2) 等待任务表的操作 在等待任务表中查找优先级最高的任务 3) 空事件控制块链表 空事件控制块链表 uCOS初始化时(调用OSInit()时),产生空事件控制块,且所有事件控制块被链接成一个单向链表——空闲事件控制块链表。 3) 空事件控制块链表 空闲事件控制块链表的大小由OS_CFG.H 中定义的OS_MAX_EVENTS决定。 每当建立一个信号量、互斥型信号量、消息邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化。 调用删除信号量、互斥型信号量、消息邮箱和消息队列的函数时,可将事件控制块放回到空闲事件控制块链表中。 4) 事件控制块操作函数 事件控制块等待任务表初始化OS_EventWaitListInit(); 使一个任务进入就绪态OS_EventTaskRdy(); 使一个任务进入等待状态OS_EventTaskWait(); 使一个超时任务进入就绪态OS_EventTO()。 事件控制块等待任务表初始化 OSEventWaitListInit() 当建立一个信号量、消息邮箱或者消息队列时,相应的建立函数OSSemCreate(),OSMboxCreate(),或者OSQCreate()调用该函数对事件控制块中的等待任务列表进行初始化。 该函数初始化一个空的等待任务表,其中没有任何任务。 该函数的调用参数只有一个,就是指向需要初始化的事件控制块的指针pevent。 使一个任务进入就绪态 OSEventTaskRdy() 当某个事件发生了,要将等待该事件的任务表中的最高优先级任务(Highest Priority Task – HPT)置于就绪态时,信号量、互斥型信号量、消息邮箱或者消息队列所对应的POST函数调用该函数来完成此项工作。 该函数从等待任务表中删除HPT任务,并把该任务置于就绪态。 使一个任务进入等待状态 OSEventTaskWait() 当某个任务要等待一个事件的发生时,信号量、互斥型信号量、消息邮箱或者消息队列通过相应的PEND函数调用该函数使当前任务从就绪任务表中脱离就绪态,并放到相应事件的事件控制块ECB的等待任务表中。 使一个超时任务进入就绪状态 OSEventTO() 如果在预先指定的等待时限内,任务等待的事件没有发生,OSTimeTick()函数会因为等待超时而将任务的状态置为就绪态。在这种情况下,信号量、互斥型信号量、消息邮箱及消息队列调用该函数从事件控制块的等待任务表中将任务删除,并把它置成就绪状态,接着将指向事件控制块的指针删除 3信号量及其操作 1)信号量概述 2)信号量操作 1) 信号量(semaphore)概述 信号量在多任务系统中用于控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。 uC/OS系统

文档评论(0)

skvdnd51 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档