嵌入式操作系统原理:第5章 信号量集_第1页
嵌入式操作系统原理:第5章 信号量集_第2页
嵌入式操作系统原理:第5章 信号量集_第3页
嵌入式操作系统原理:第5章 信号量集_第4页
嵌入式操作系统原理:第5章 信号量集_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

信号量集5.1信号量集的结构在实际应用中,任务常常需要于多个事件同步,即根据多个信号量组合作用的结果来决定任务的运行方式。信号量集所能管理的信号量一般都是二值信号。请求信号量集的任务得以继续运行的条件与所请求的信号量之间有两种逻辑关系:AND和OR。uC/OS-II的信号量集由两部分组成:标识组:其中存放了信号量集中的所有信号。等待任务链表:表中的每个节点都对应一个正在等待信号量集的等待任务。AND/OR发信号的任务请求信号的任务…………图5-1信号量集示意图5.1.2等待任务链表信号量集采用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点(OS_FLAG_NODE)。标志组OS_FLAG_GRP的成员OSFlagWaitList就指向了信号量集的这个等待任务链表。typedefstruct{ void*OSFlagNodeNext; //指向下一个节点的指针

void*OSFlagNodePrev; //指向前一个节点的指针

void*OSFlagNodeTCB; //指向对应任务的任务控制块的指针

void*OSFlagNodeFlagGrp; //反向指向信号量集的指针

OS_FLAGSOSFlagNodeFlags; //信号过滤器

INT8UOSFlagNodeWaitType; //定义逻辑运算关系的数据}OS_FLAG_NODE;5.1.2等待任务链表(续)常数信号有效状态等待任务的就绪条件OS_FLAG_WAIT_CLR_ALL或OS_FLAG_WAIT_CLR_AND0信号全部有效(全0)OS_FLAG_WAIT_CLR_ANY或OS_FLAG_WAIT_CLR_OR0信号有1个或1个以上有效(有0)OS_FLAG_WAIT_SET_ALL或OS_FLAG_WAIT_SET_AND1信号全部有效(全1)OS_FLAG_WAIT_SET_ANY或OS_FLAG_WAIT_SET_OR1信号有1个或1个以上有效(有1)表5-1定义信号的有效状态及等待任务与信号之间的逻辑关系的常数OSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagGrp10010001OS_FLAG_WAIT_CLR_ALL指向下一个节点指向前一个节点OSFlagNodeFlags回指OS_FLAG_GRP结构指向等待任务的TCBOSFlagNodeWaitType图6-4信号量集等待任务链表的一个节点成员OSFlagNodeFlags相当于一个过滤器,利用它可把请求任务需要的信号筛选出来,而把其余信号屏蔽掉。节点成员OSFlagNodeTCB是指向等待任务TCB的指针,信号量集的等待任务链表通过这个指针把链表结点与等待任务关联了起来。节点成员OSFlagNodeFlagGrp是一个反向指向信号量集标志组的指针,是在等待任务链表中删除一个节点或添加一个节点时用到的指针。等待的任务,只有在所需要的信号有效且满足指定的逻辑关系时,才能由等待状态进入就绪状态。这个逻辑关系可以通过给结构OS_FLAG_NODE中的成员OSFlagNodeWaitType赋值的方法来制定,这个值可以是表6-1所例举的4个常数之一。5.1.2等待任务链表(续)AND/OR?0/1?1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0发送信号量集的任务OSFlagFlags请求信号量集的任务OSFlagNodeFlagsOSFlagNodeWaitType图5-5信号量集对信号的逻辑运算及控制信号量集用OSFlagFlags来记录信号用OSFlagNodeFlags来筛选信号用OSFlagNodeWaitType来控制信号的有效状态和信号量集有效之间的逻辑关系5.1.2等待任务链表(续)OSFlagNodeFlagGrpOSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagsOSFlagNodeWaiteTypeOSFlagNodeFlagGrpOSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagsOSFlagNodeWaiteTypeOSFlagNodeFlagGrpOSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagsOSFlagNodeWaiteTypeOSTCBFlagNode……OSTCBFlagNode……OSTCBFlagNode……OS_TCBOS_TCBOS_TCB图5-6信号量集结构图OSFlagTypeOSFlagWaitListOSFlagFlags00等待任务链表标志组把等待任务链表的节点链接起来就形成了等待任务链表。在等待任务链表的基础上,再加上标志组和各个节点对应的任务控制块就形成了整个的信号量集。5.1.3对等待任务链表的操作uC/OS-II定义了两个对等待任务链表的基本操作:添加节点和删除节点,以供对信号量集操作的函数调用。给等待任务链表添加节点的函数为OS_FlagBlock(),这个函数将在请求信号量集函数OSFlagPend()中被调用。原型如下:staticvoidOS_FlagBlock( OS_FLAG_GRP*pgrp, //信号量集指针 OS_FLAG_NODE*pnode, //待添加的等待任务结点指针 OS_FLAGSflags, //指定等待信号的数据 INT8Uwait_type, //信号与等待任务之间的逻辑 INT16Utimeout //等待时限);从等待任务链表中删除节点的函数为OS_FlagUnlink(),个函数将在发送信号量集函数OSFlagPost()中被调用。原型如下:

voidOS_FlagUnlink(OS_FLAG_NODE*pnode);5.2.2请求信号量集任务可以通过调用函数OSFlagPend()来请求一个信号量集,该函数原型如下:OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp, //所请求的信号量集指针 OS_FLAGSflags, //滤波器 INT8Uwait_type, //逻辑运算类型 INT16Utimeout, //等待时限 INT8U*err //错误信息 );任务也可以通过调用函数OSFlagAccept()无等待的请求一个信号量集:OS_FLAGSOSFlagAccept( OS_FLAG_GRP*pgrp, //所请求的信号量集指针 OS_FLAGSflags, //请求的信号 INT8Uwait_type, //任务就绪与信号之间的逻辑关系 INT8U*err //错误信息);函数参数flags是用来给等待任务链表节点成员OSFlagNodeFlags赋值的,参数wait_type应该是表6-2所例举的4个常数之一。函数调用成功后,将返回标志组成员OSFlagFlags的值。5.2.3向信号量集发信号任务可以通过调用函数OSFlagPost()向信号量集发信号,该函数原型如下:OS_FLAGSOSFlagPost( OS_FLAG_GRP*pgrp, //信号量集指针 OS_FLAGSflags, //选择所要发送的信号 INT8Uwait_type, //信号有效的选项 INT8U*err //错误信息 );例如,要对信号量集FlagPtr发信号,待发送的信号为OSFlagFlags中的第0位和第3位,并且是要把他们置1,则调用时的代码如下:OS_FLAGSOSFlagPost( FlagPtr, //信号量集指针 (OS_FLAGS)9, //选择所要发送的信号 OS_FLAG_SET, //信号有效的选项 &err //错误信息 );所谓任务向信号量集发信号,就是对信号量集标志组中的信号进行设置1或0的操作。至于对信号量集的哪些信号进行操作,由函数中的参数flags来指定,对指定的信号置1还是置0,由函数中的参数opt来指定。例程5-1:设计一个有3个任务的应用程序,这3个任务分别叫做MyTask、YouTask和HerTask。要求任务YouTask发送一个信号,任务HerTask发送一个信号,当这两个任务都发了信号之后,MyTask才能运行。例程5-2:把例5-1中的任务MyTask调用的请求信号量集函数OSFlagPend()改为无等待请求函数OSFlagAccept(),运行该程序,观察运行结果并与例6-1的运行结果进行比较。5.2.4查询信号量集的状态任务可以通过调用函数OSFlagQuery()可以查询信号量集的状态,函数返回值为被查询信号量集标志组的成员OSFlagFlags。该函数原型如下:OS_FLAGSOSFlagQuery( OS_FLAG_GRP*pgrp, //待查询的信号量集的指针 INT8U*err //错误信息 );例程5-3:修改例5-2应用程序,使任务MyTask可以根据信号的不同状态实现不同的功能。5.2.5删除信号量集任务可以通过调用函数OSFlagDel()可以删除信号量集。该函数原型如下:OS_FLAGS*OSFlagDel( OS_

温馨提示

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

评论

0/150

提交评论