博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
μC/OS-II 信号量集
阅读量:5335 次
发布时间:2019-06-15

本文共 2141 字,大约阅读时间需要 7 分钟。

简介

在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式。μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集。

信号量集所能管理的信号量都是一些二值信号,所有信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑,其示意图如下图所示:

1319058-20180407144506451-81231891.png

信号量集的标志组

不同于信号量、消息邮箱、消息队列等事件,μC/OS-II 不使用事件控制块来描述信号量集,而使用了一个叫做标志组的结构 OS_FLAG_GRP。

OS_FLAG_GRP 结构如下:

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

成员 OSFlagWaitList 是一个指针,当一个信号量集被创建后,这个指针指向了这个信号量集的等待任务链表。

1319058-20180407144600583-1108796336.png

1319058-20180407144617552-1790900.png

等待任务链表

与其他事件不同,信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点(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;

1319058-20180407144711648-1969297478.png

1319058-20180407144719169-1607782381.png

1319058-20180407144733404-1219466862.png

添加任务结点

给等待任务链表添加节点的函数为 OS_FlagBlock( ),这个函数的原型为:

static  void  OS_FlagBlock (OS_FLAG_GRP *pgrp,   //信号量集指针OS_FLAG_NODE *pnode, //待添加的等待任务节点指针OS_FLAGS flags,      //指定等待信号的数据INT8U wait_type,     //信号与等待任务之间的逻辑INT16U timeout       //等待时限);

这个函数将在请求信号量集函数 OSFlagPend ( ) 中被调用。

删除任务结点

从等待任务链表中删除一个节点的函数为 OS_FlagUnlink( ),这个函数的原型为:

void  OS_FlagUnlink (OS_FLAG_NODE *pnode);

这个函数将在发送信号量集函数 OSFlagPost( ) 中被调用。

创建信号量集

任务可以通过调用函数 OSFlagCreate ( ) 来创建一个信号量集。OSFlagCreate ( ) 的函数原型为:

OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, //信号的初始值INT8U *err      //错误信息)

请求信号量集

任务可以通过调用函数 OSFlagPend( ) 请求一个信号量集,OSFlagPend( ) 函数的原型为:

OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp,  //所请求的信号量集指针OS_FLAGS flags,     //滤波器INT8U wait_type,    //逻辑运算类型INT16U timeout,     //等待时限INT8U *err          //错误信息);

向信号量集发送信号

任务可以通过调用函数 OSFlagPost ( ) 向信号量集发信号,OSFlagPost ( ) 函数的原型为:

OS_FLAGS  OSFlagPost (OS_FLAG_GRP *pgrp, //信号量集指针OS_FLAGS flags,    //选择所要发送的信号INT8U opt,         //信号有效的选项INT8U *err         //错误信息);

所谓任务向信号量集发信号,就是对信号量集标志组中的信号进行置“1”(置位)或置“0”(复位)的操作。至于对信号量集中的哪些信号进行操作,用函数中的参数flags来指定;对指定的信号是置“1”还是置“0”,用函数中的参数opt来指定(opt = OS_FLAG_SET 为置“1”操作;opt = OS_FLAG_CLR 为清“0”操作)。

参考自:《μC/OS-II 入门教程》

转载于:https://www.cnblogs.com/GyForever1004/p/8733297.html

你可能感兴趣的文章
Winform 菜单和工具栏控件
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
巧用Win+R
查看>>
浅析原生js模仿addclass和removeclass
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
深入理解jQuery框架-框架结构
查看>>
YUI3自动加载树实现
查看>>
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>