μC/OS-II 信号量集

任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式。μC/OS-II为了实现多个信号量组合的功能定义了一种特殊的数据结构---信号量集。信号量集所能管理的信号量都是一些二值信号。信号量集实质上就是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑。在μC/OS-II中,请求信号量集的任务得以继续运行的条件与所请求的信号量之间有两种逻辑关系;

  1. 与关系:只有当任务所请求的信号量都有效时,任务才能继续运行
  2. 或关系:只要在任务所请求信号量中有信号有效,任务就会继续运行。

一、信号量集的结构

 1.信号量集的标志组

μC/OS-II使用标志组OS_FLAG_GRP来描述信号量集。

typedef struct
{
    INT8U OSFlagType;        //识别是否为信号量集的标识
    void *OSFlagWaitList;    //指向等待任务链表的指针
    OS_FLAGS OSFlagFlags;    //所有信号列表
}OS_FLAG_GRP;

 OS_FlagFlags用来存放信号量集的所有信号的状态,每个信号占据一个二进制位。信号量集中可以存放多少信号,取决于OSFlagFlags的长度。可以定义为8位,16位,32位,目前系统定义为16位。图中OS_FLAGS定义为INT8U,信号量集最多可以描述8个事件的状态。

OSFlagWaitList是一个指针,当一个信号量集被创建之后,这个指针指向了信号量集的等待任务链表。在系统初始化时,利用OSFlagWaitList指针将这些标志组连接成一个单向链表。空标志组链表的头指针存放在系统全局变量OSFlagList中。

2.等待任务链表

信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点。等待任务链表节点OS_FLAG_NODE的结构如下:

 OSFlagNodeFlagGrp是反向指向信号量集标志组的指针,是在等待任务链表中删除或者添加一个节点时用到的指针。

OSFlagNodeFlags相当于一个过滤器,通过它可以获得信号量集信号的子集。利用它可以只把请求任务需要的信号筛选出来,把其余的屏蔽掉。一个请求信号量集的任务究竟需要哪些信号,要通过在成员OSFlagNodeFlags中与所等待的信号对应的二进制位进行置1来指定,人物不需要的信号置0.

OSFlagNodeWaitType赋值,指定逻辑关系,同时也制定了信号的有效状态。

 

 3.对等待任务链表的操作

1.添加节点

 

2.删除节点

 二、信号量集的操作

1.创建信号量集

OS_FLAG_GRP  *OSFlagCreate(OS_FLAGS flags,INT8U *err);参数是信号的初始值,错误值

此函数主要做两项工作:1.从空标志组链表中取下一个标志组,并同时给OSFlagTpye和OSFlagFlags赋初值;2.令指向等待任务链表的指针OSFlagWaitList为空指针。

2.请求信号量集

参数flags是给等待任务链表节点成员OSFlagNodeFlags赋值的。函数调用成功之后,返回标志组成员OSFlagFlags的值。

无等待地请求一个信号量集:OSFlagAccept(),参数除了少了一个等待时限之外,其余和OSFlagPend()的参数相同,返回值也相同。

3.向信号量集发信号

 任务项信号量集发信号实际上就是对信号量集标志组中的信号进行置1或者置0的操作。至于对信号量集的哪些信号进行操作,由参数flags决定。对指定的信号置0还是置1,由opt决定。opt=OS_FLAG_SET就是置1操作;为OS_FLAG_CLR就是置0操作。

4.查询信号量集的状态

 返回值是被查询信号量集标志组的成员OSFlagFlags,应用程序可以用它来完成一些更为复杂的控制。

5.删除信号量集

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值