嵌入式开发学习日志52——二值与计数信号量

了解了消息队列之后,如果想要深入了解队列创建流程及其API函数(简单地看作帮助传递消息的工具),我们需要从源码开始读起,但是源码中涉及了信号量这一概念,因此必须先将信号量作为必备知识学习一下。

信号量是任务之间进行通信的一种机制(如果有交换机部分的知识的话也可以简单用信令的知识理解一下,两者在通信同步和协调上有点相通但是绝不能划等号),可以实现任务的同步或者资源的互斥访问。信号量有自己的数量限制,一旦数量归零,那么需要这个信号量的任务就会进入阻塞状态。

信号量自己也分很多种类,下面一个个看。

(一)二值信号量

二值信号量,顾名思义,只有两个值,要么1,要么0。也就是说,二值信号量完全可以看作一个只能包含一个消息的消息队列,不是空的,就是满的,但是并不需要知道这里面到底是什么消息,只要知道有没有消息即可。

二值信号量有自己的运行机制,当创建信号量,用户可自定义该信号量个数,二值信号量自然是最多1个。之后任何任务都可以从二值信号量资源中获取一个二值信号量,获取成功则返回正确,获取失败,任务就会按照之前讲过的阻塞时间等待信号量的释放。

注:图中提到的线程是一种基本调度单位,它只具备运行中必不可少的资源,任务可以是个线程。

这么说可能还是有些抽象,下面拿具体实例来说明一下。例如有一个温湿度传感器被设置为一秒钟采集一次数据,而需要用液晶屏去显示采集到的数据,每100ms刷新一次。此时液晶屏就会有多次无效刷新,浪费CPU资源,那么就可以在温湿度传感器采集到数据并发送给液晶屏,数据到达时发一个二值信号量给液晶屏,使它正式工作,而在其他时间使它处于阻塞状态,这样就完成了两个任务间的同步。

(二)计数信号量

计数信号量,肯定就是用来计数的,常用于事件计数或者资源的管理。如果二值信号量看作是一个长度为1的队列,那么计数信号量则是长度大于1的队列,同样,计数信号量也不用去关注队列里面的消息是什么,只要关注里面有没有消息即可。

计数信号量的运行机制也很简单,就是普通的加加减减。每个资源都可以设置一个最大任务数量,这些任务通过获取信号量来获取资源,而每取走一个信号量,计数减一,直到为0时,阻塞试图继续获取资源的任务,直到有其他任务释放信号量。

除了上述两种信号量外,其实还有互斥信号量递归信号量,其中互斥信号量更为重要且复杂,下一章会重点讲述。

相关推荐
Devlab3 小时前
LVGL设计大师——网页版anyui来了!!
嵌入式硬件·物联网·低代码·ui·iot
小席是个热心肠4 小时前
AI相关的自我学习
java·人工智能·学习
何事误红尘6 小时前
Mqtt学习笔记(一):Mosquitto服务器搭建、MQTTX安装测试
学习
青山是哪个青山6 小时前
LangChain 学习笔记(三):LangSmith 调试与监控
笔记·学习·langchain
Dr.kangder6 小时前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
那年窗外下的雪.8 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
蒸蒸yyyyzwd8 小时前
cpp选手备战后端学习笔记day6 秋招笔试题
笔记·学习
zlinear数据采集卡8 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛139246256738 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
weixin_4462608510 小时前
AVA-Encoder:面向智能体原生视频表征学习框架
学习·音视频