第五讲信号量集_第1页
第五讲信号量集_第2页
第五讲信号量集_第3页
第五讲信号量集_第4页
第五讲信号量集_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

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

文档简介

信号量集王华斌

简介在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式!Uc/os-ii为了实现多个信号量组合的功能定义了一个特殊的数组结构——信号量集信号量集所能管理的信号都是一些二值信号。所以信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑。一、信号量集的结构组成:标志组:存放信号量集中的所有信号。 等待任务链表:链表中的每个节点都对应一个正在等待信号量集的等待任务,信号量集根据这个链表来管理等待任务。信号量集标志组等待任务链表信号量集标志组等待任务链表1、信号量集的标志组利用标志组OS_FLAG_GRP来描述信号量集;而不是用事件控制块来描述。OS_FLAG_GRP的结构:

typedefstruct{ INT8UOSFlagType;//信号量集的标识

void*OSFlagWaitList;//指向等待任务链表的指针

OS_FLAGSOSFlagFlags;//所有信号列表

}OS_FLAG_GRP;各变量的含义:OSFlagType:信号量集的标识,该成员变量的值应该固定为OS_EVENT_TYPE_FLAG。OSFlagFlags:OS_FLAGS类型的变量,该变量用来存放信号量集所有信号的状态,每个信号占据一个二进制位。信号量集中可以存放多少个信号,取决于OSFlagFlags的长度。这个长度可以根据应用程序需要信号的数目定义为8位、16位、32位。OSFlagWaitList:当一个信号量集被创建后,这个指针指向了这个信号量集的等待任务链表。在UC/OS-II初始化时,系统会根据在文件OS_CFG.H中定义的常数0S_MAX_FLAGS,来创建0S_MAX_FLAGS个标志组(信号量集),并借用成员OSFlagWaitList作为指针把这些标志组链接成一个单向链表。由于这个链表中的各个标志组还未被真正创建,因此叫做空标志组链表!空标志组链表的头指针存放在系统全局变量OSFlagList中,每当应用程序创建一个信号量集时,就从这个链表中取一个标志组,并移动头指针OSFlagList,使之指向下一个空标志组。2、等待任务链表信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表的一个节点(Node)。标志组OS_FLAG_GRP的成员OSFlagWaitList就指向了信号量集的这个等待任务链表。等待任务链表节点OS_FLAG_NODE的结构:

typedefstruct{ void*OSFlagNodeNext;//指向下一个节点的指针

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

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

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

OS_FLAGSOSFlagNodeFlags;//信号过滤器

INT8UOSFlagNodeWaitType;//定义逻辑运算关

//系的数据}各个变量的定义OSFlagNodeFlagGrp:反向指向信号量集标志组的指针,是在等待任务链表中删除一个节点或添加一个节点时用到的指针。OSFlagNodeTCB:指向等待任务TCB的指针,信号量集的等待任务链表通过这个指针把链表节点与等待任务关联起来。OSFlagNodeFlags:利用它可在标志组成员OSFlagNodeFlags的信号中只把请求任务需要的信号筛选出来,而把其它的信号屏蔽掉。也就是说,一个请求信号量集的任务可以需要信号集的所有信号,也可以只需要其中的部分信号,它究竟需要那些信号,要通过在成员OSFlagNodeFlags中与所等待信号对应的二进制位进行置1来指定,而任务不需要的信号的位置0.OSFlagNodeWaitType:指定逻辑关系,它有四个常数可以选择。它们既指定了逻辑关系,也指定了信号的有效状态。定义信号的有效状态及等待任务与信号之间的逻辑关系常数常数信号有效状态等待任务的就绪条件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)OSFlagNodeFlags中的值表明等待任务所等待的信号是标志组成员OSFlagFlags中的第0、4、7个信号。OSFlagNodeWaitType的值表明:信号的有效状态是0,即当任务所等待的第0、4、7个信号的状态都为0时,任务才可以结束等待状态而进入就绪状态。信号用OSFlagFlags来记录信号,用OSFlagNodeFlags来筛选信号,用OSFlagNodeWaitType来控制信号的有效状态和信号量集有效之间的逻辑关系。把等待任务链表的节点链接起来就形成了等待任务链表。在等待任务链表的基础上,再加上标志组和各个节点对应的任务控制块就形成了整个信号量集。3、对等待任务链表的操作添加节点和删除节点添加节点:给等待任务链表添加节点的函数OS_FlagBlock()staticvoidOS_FlagBlock( OS_FLAG_GRP*pgrp,//信号量集指针

OS_FLAG_NODE*pnode,//待添加等待任务节点指针

OS_FLAGSflags,//指定等待信号的数据

INT8Uwait_type,//信号与等待任务之间的逻辑

INT16Utimeout//等待时限

);

这个函数将在请求信号量集函数OSFlagPend()中被调用。删除节点:OS_FlagUnlink()VoidOS_FlagUnlink(OS_FLAG_NODE*pnode);二、信号量集的操作创建信号量集OSFlagCreate()请求信号量集OSFlagPend()向信号量集发信号OSFlagPost()查询信号量集的状态OSFlagQuery()删除信号量集OSFlagDel()1、创建信号量集OS_FLAG_GRP*OSFlagCreate( OS_FLAGSflags,//信号的初始值

INT8U*err//错误信息

)主要的工作:(1)从空标志组链表中取下一个标志组,并同时给成员OSFlagType和OSFlagFlags赋初值;(2)令指向等待任务链表的指针OSFlagWaitList为空指针创建一个信号量集分两步:首先定义一个全局的OS_FLAG_GRP类型的指针,然后再应用程序需要创建信号量集的位置调用函数OSFlagCreate()。调用创建信号量集OSFlagCreate()成功后,该函数返回的是这个信号量集的标志组的指针,应用程序可以用这个指针对信号量集进行相应的操作。2、请求信号量集函数:OSFlagPend()原型:

OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp,//请求信号量集指针

OS_FLAGSflags,//滤波器

INT8Uwait_type,//逻辑运算类型

INT16Utimeout,//等待时限

INT8U*err//错误信息);返回值:调用成功后返回标志组成员OSFlagFlags的值。也就是信号的状态任务也可以通过调用函数OSFlagAccept()无等待地请求一个信号量集。原型:

OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp,//请求信号量集指针

OS_FLAGSflags,//滤波器

INT8Uwait_type,//逻辑运算类型

INTv*err//错误信息

);3、向信号量集发信号任务可以通过调用函数OSFlagPost()向信号量集发信号。函数原型:

OS_FLAGSOSFlagPost( OS_FLAG_GRP*pgrp,//请求信号量集指针

OS_FLAGSflags,//选择所要发送的信号

INT8Uopt,//信号有效的选项

INTv*err//错误信息

);说明:所谓任务向信号量集发信号,就是对信号量集标志组中的信号进行置1或者置0的操作。至于对信号量集中的那些信号进行操作,由函数的参数flags决定;对指定的信号是置1还是置0,有参数opt决定(opt=OS_FLAG_SET为置1;opt=OS_FLAG_CLR为置0操作)。4、查询信号量集的状态函数OSFlagQuery()查询一个信号量集的状态。原型:

OS_FLAGSOSFlagQuery( OS_FLAG_GRP*pgrp,//待查询的信号量集的指针

INTv*err//错误信息

);返回值:被查询信号量集标志组的成员OSFlagFlags,应用程序可以用它来完成一些更为复杂的操作。5、删除信号量集函数:OSFlagDel()原型:

OS_FLAGSOSFlagDel( OS_FLAG_GRP*pgrp,//待删除的信

温馨提示

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

评论

0/150

提交评论