嵌入式实时操作系统(第11课时).pptVIP

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式实时操作系统(第11课时)

嵌入式实时操作系统 第五章 信号量集 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结构来决定任务的运行方式。μc/os-II为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集。 信号量集所能管理的信号量都是一些二值信号。所有信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑,其示意图如图5-1所示。 在μc/os-II中,请求信号量集的任务得以继续运行的条件与所请求的信号量之间有两种逻辑关系,“与”(AND或ALL)关系和“或”(OR或ANY)关系。在“与”关系下,只有当任务所请求的信号量都有效时,任务才能继续运行;而在“或”关系下,只要在任务所请求信号量中有信号有效,任务就会继续运行。 本章的主要内容有: 信号量集的基本概念和信号量集的结构; 操作等待任务链表的函数; 任务可以调用的信号量集操作函数。 5.1 信号量集的结构 μc/os-II的信号量集由两部分组成: 第一部分叫做标志组,其中存放了信号量集中的所有信号; 第二部分叫做等待任务链表,链表中的每个节点都对应一个正在等待信号量集的等待任务,信号量集根据这个链表来管理等待任务。 5.1.1 信号量集的标志组 不同于信号量、消息邮箱和消息队列等事件, μc/os-II不使用事件控制块来描述信号量集,而使用了一个叫做标志组的结构OS_FIAG_GRP。 OS_FLAG_GRP结构如下: typedef struct{ INT8U OSFlagType; //识别是否为信号量集的标识 void *OSFlagWaitList; //指向等待任务链表的指针 OS_FLAGS OSFlagFlags; //所有信号列表 }OS_FLAG_GRP; 结构中,成员OSFlagType是信号量集的标识,该成员变量的值应该固定为OS_EVENT_TYPE_FLAG。 成员OSFlagFlags是OS_FAGS类型的变量,该变量用来存放信号量集所有信号的状态,每一个信号占据一个二进制位。信号量集中可以存放多少个信号,取决于OSFlagFlags的长度。这个长度可以根据应用程序需要信号的数目定义为8位、16位或32位(在文件OS_CFG.H中来定义,目前系统定义的是16位)。图5-2是把OS_FLAGS定义为INT8U类型时(信号量集最多可以描述8个事件的状态),信号量集标志组的结构示意图。 成员OSFlagWaitList是一个指针,当一个信号量集被创建后,这个指针指向了这个信号量集的等待任务链表。 在μc/os-II初始化时,系统会根据在文件OS_CFG.H中定义的常数OS_MAX_FLAGS来创建OS_MAX_FLAGS个标志组,并借用成员OSFlagWaitList作为指针把这些标志组链接成一个单向链表。由于这个链表中的各个标志组还未被真正创建,因此这个链表叫做空标志组链表。 空标志组链表的头指针存放在系统全局变量OSFlagList中,每当应用程序创建一个信号量集时,就从这个链表中取一个标志组,并移动头指针OSFlagList,使之指向下一个空标志组。 空标志组链表的结构如图5-3所示。 5.1.2 等待任务链表 信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点(Node)。标志组OS_FLAG_GRP的成员OSFlagWaitList就指向了信号量集的这个等待任务链表。 等待任务链表节点OS_FLAG_NODE的结构如下: typedef struct { void *OSFlagNodeNext; //指向下一个节点的指针 void *OSFlagNodePrev; //指向前一个节点的指针 void *OSFlagNodeTCB; //指向对应任务的任务控制块的指针 void *OSFlagNodeFlagGrp; //反向指向信号量集的指针 OS_FLAGS OSFlagNodeFlags; //信号过滤器 INT8U OSFlagNodeWaitType; //定义逻辑运算关系的数据 }OS_FLAG_NODE; 其中成员OSFlagNodeFlagGrp是一个反向指向信号量集标志组的指针,是在等待任务链表中删除一个节点或添加一个节点时用到的指针。 节点成员OSFlagNodeTCB是指向等待任务TCB(任务控制块)的指针,信号量集的等待任务链表通过这个指针把链表节点与等待任务关联了起来。 成员OSFlagNodeFlags相当于一个过滤器,利用它可在标志组成员OSFlag

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档