第六章 信号量集

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);

函数做了两个工作:从空任务组链表中取下一个标志组,给成员OSFlagTypeOSFlagFlags赋初值;令指向等待任务链表的指针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);

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐