第六章 信号量集
6.1 信号量集的结构
6.1.1 基本概念
信号量集:
信号量集实质上就是一个多输入、多输出的组合逻辑,输入为其他任务发出的多个信号,输出为这多个输入逻辑运算的结果。
6.1.2 信号量集的结构
信号量集由一个标志组和多个等待任务控制块组成
信号量集的功能:标志组、等待任务链表
标志组:信号量集的所有信号
等待任务链表:每个节点都对应着一个OS_FLAG_NODE的结构
1. 信号量集的标志组
二进制数OSFlagFlags,位图:用来接收并保存其他任务所发送来的信号量集(输入信号暂存器)
2. 等待任务
已经向信号量集发出了请求操作的任务
操作:
在多个信号量的输入中挑选等待任务感兴趣的输入(OSFlagNodeFlags标志列表);
把挑选出来的输入按照等待任务所希望的逻辑来运算,以得出输出(OSFlagNodeWaitType变量)。
3. 等待任务链表
6.1.3 对等待任务链表的操作
1. 添加节点
static void OS_FlagBlock(OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode,OS_FLAGS flags, INT8U wait_type, INT16U timeout);
2. 删除节点
void OS_FlagUnlink(OS_FLAG_NODE *pnode);
6.1.4 空标志组链表
6.2 信号量集的操作
6.2.1 创建信号量集
OS_FLAG_GRP *OSFlagCreate(OS_FLAGSflags, INT8U *err);
函数做了两个工作:从空任务组链表中取下一个标志组,给成员OSFlagType和OSFlagFlags赋初值;令指向等待任务链表的指针OSFlagWaitList为空指针。
6.2.2 请求信号量集
OS_FLAGS OSFlagPend(OS_FLAG_GRP*pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err);
OS_FLAGS OSFlagAccept(OS_FLAG_GRP*pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err);无等待请求信号量集
6.2.3 向信号量集发送信号
OS_FLAGS OSFlagPost(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U*err);
6.2.4 查询信号量集的状态
OS_FLAGS OSFlagQuery(OS_FLAG_GRP *pgrp, INT8U *err);
6.2.5 删除信号量集
OS_FLAGS OSFlagDel(OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)