浅析嵌入式实时系统中信号量的概念

news2025/1/17 22:00:26

目录

概述

1. 认识信号量

1.1 定义信号量

1.2 信号量的类型

1.2.1 二值信号量

1.2.2 计数信号量

1.2.3 互斥信号量

1.2.3.1 认识互斥信号量

1.2.3.2 互斥信号量的其他特性

2 典型信号量的使用

2.1 等待和信号同步

2.2 多任务等待和信号同步

2.3 信用跟踪同步 

2.4 单一共享资源访问同步

2.5 递归共享资源访问同步

2.6 多个共享资源访问同步 

3 总结 


概述

本文主要介绍嵌入式实时操作系统信号量的相关知识点和实现原理,以及一些典型信号量的使用的方法和技巧,并对各类信号量的特点做了简要的分析。引入信号量,主要是为了解决多个任务之间能够同步它们的运行和协调对共享资源的互斥访问。

1. 认识信号量

1.1 定义信号量

信号量是一个内核对象,一个或者多个task可以获取或者释放它,从而达到同步或者相互排斥的目的。当一个信号量首次建立是,内核会分配给它一个控制块,一个唯一的ID、一个值和一个任务等候列表。

信号量的特点:

1)一个信号量就像一把钥匙,允许任务执行多次操作或访问一个资源。

2)获取到信号量之后,才能操作和访问相应的资源,没有获取到信号量就不能操作和访问该资源

3)一个单个信号量可以被访问多次。

4)信号量可分为不同的类型:包括而知,计数和相互排斥信号量

5)多个任务访问同一个信号量资源是,如果该信号量已经被占用,只能等它被释放之后才能重新被Task抢占

令牌计数器作用:

1)信号量创立时对计数器设定初值, 初值value = 0, 表示不可用, value = 1, 表示可用

2)当一个task获取信号量时,令牌计数被减一

3)当一个Task释放信号量时,令牌计数被加一

4)当令牌计数value = 0,表示此时没有令牌可用。此时,如果一个任务等待获取可用的令牌,该任务此时处于阻塞状态

任务等待列表的作用:

1)追踪所有等待信号量而被阻塞的任务

2)这些任务在等待列表中的排序方式:先进先出(FIFO)或者最高优先权优先

3)当有可用信号量时,内核允许等待列表中的第一个任务使用它。如果它是最高优先级任务,内核会使该任务从阻塞态------->运行态或者就绪态。

1.2 信号量的类型

1.2.1 二值信号量

二值信号灯的要点:

1)二值信号量只能取值0或1,

2)二值信号量为0时,该信号量不可用,当信号量为1时,该信号量可用。

3)二值信号量创立时,可以被初始化为可用或者不可用

4)二值信号量被当做全局资源。它们可以被需要信号量的所有Task共享

1.2.2 计数信号量

计数信号量特点:

1)一个信号使用一个计数,允许多次获取或者释放

2)当创立一个计数信号量时,赋予信号量一个数,表示已经初始化的信号量令牌的个数。

初始值 value = 0,创立时处于不可用状态

初始值 value > 0, 创立时处于可用状态

3)一个或者多个任务可以连续获取计数信号灯的一个令牌,直到没有令牌被留下。

4)当所有令牌被耗尽时,计数等于0,此时信号量处于不可用状态。

5)要使信号量从不可用状态跳转到可用状态,必须有任务释放一个令牌。

6)计数信号量时全局变量,可被所有需要信号量的Task共享

7)其允许任何一个Task释放一个计数令牌,即使是它没有获取到令牌,每次释放也会把计数递增一次

信号计数的分类

1)有界计数: 当信号量初次创立时,为计数信号量设置初始数,作为信号量的最大计数

2)无界计数:允许信号量计数超过初始数,直到达到数据类型的最大数。举例:计数类型为uint8_t,其最大计数为255

1.2.3 互斥信号量

1.2.3.1 认识互斥信号量

互斥信号量时一个特殊的二值信号量,它有如下特征:

1)支持所有权访问

2)支持递归访问

3)任务删除安全

3)一个或者多个协议

互斥信号量的特点:

1)互斥信号量的状态是开锁或者闭锁。

2)互斥信号量最初建立为开锁状态,可以被一个task获取,获取后,互斥信号量转到闭锁状态。

3)反之,当任务释放互斥信号量时,互斥信号量又返回到开锁状态。

4)互斥信号量使用: lock 或者 unlock操作

1.2.3.2 互斥信号量的其他特性

1 互斥信号量的所有权

1)当一个任务获取到信号量首次被锁住,得到互斥信号量的所有权

2)当一个任务释放互斥信号量将其开启,将失去互斥信号量的所有权

3)当一个任务拥有该信号量时,其他任何任务都不能开启或者锁住该互斥信号量

2 递归的闭锁

1)允许拥有互斥信号量的任务在闭锁的状态下多次获取它

2)带有递归闭锁的互斥信号量被称为递归互斥信号量

3)递归闭锁的互斥信号量用于一个共享资源进行排他性访问,它需要调用一个或者多个例程,而这些例程也需要访问这些共享资源

4)一个递归的互斥信号量允许嵌套这样的一个操作:此时如果其他任务也打算获取互斥锁,递归互斥锁会记录下来这个操作。但不会引起死锁。

注释:死锁指的是,两个或者多个任务阻塞并且等待相互锁住的资源

3 任务删除安全

当一个任务拥有该互斥信号灯时,该任务不能被删除

4 优先权倒置避免 

优先权倒置的概念:当一个较高的优先权Task被阻塞,并且等待一个较低优先级的Task使用的资源,而此资源又被其他中等优先级的Task所占用。

解决这个问题的方法:

1)优先权继承协议

保证Task-1的优先权  > Task-2的优先权

Task-1的特点:

a. 已经获取到互斥信号量

b. 任务优先级低

Task-2的特点:

a. 已经请求互斥信号量

b. 任务优先级高

2)天花板优先权协议

1)设置获取到互斥信号量的Task的优先级是所有请求互斥信号Task中最高的

2)释放互斥信号量后,恢复到原来的优先级

2 典型信号量的使用

2.1 等待和信号同步

其主要指两个任务没有数据交换,只是为了同步通信

2.2 多任务等待和信号同步

二值信号量最初是不可用的,较高优先权的tWait-Task 1、2、3全在做某些处理。当它们完成时,企图获取不可用的信号量,结果阻塞。此时tSignalTask完成它的处理,而且信号量运行一个Flush命令。信号灯不在阻塞,其他3个Task可以获取信号量。

2.3 信用跟踪同步 

背景: 发送信号任务执行的速率高于接收任务的速率

使用信号量解决该问题的步骤:

step -1: 发信号任务可以执行,并且按他自己的步调将技术递增一次,同时等待任务

step - 2: 当不阻塞时,按他自己的速率执行

2.4 单一共享资源访问同步

信号量创立数 value = 1, 说明此时可用,用来保护共享资源,并且保护共享资源,为了访问共享资源,task-1和task-2在读写共享资源之前,需要首先成功获取二值信号量,此种情况一般采用互斥信号量来控制不同task访问同一个资源。

 

2.5 递归共享资源访问同步

 

2.6 多个共享资源访问同步 

使用方法:给每一个共享资源分配一个单独的互斥信号灯

3 总结 

1)使用信号量允许多个任务或者ISR与任务同步运行,或者协调对一个共享资源的互斥访问

2)信号量有一个相关的信号量控制块,唯一的ID,一个用户分配的值和一个任务等待列表

3)三个通常类型的信号量是二值,计数和互斥信号量,每个都可以获取或者释放

4)二值信号量: 1表示可用,0表示不可用

5)除信号量的追已经是0,获取一个二值,在此情况下,它选择等候信号灯,则请求的任务阻塞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32MP135裸机编程:使用USB/UART烧录程序到SD卡并从SD卡启动点亮一颗LED灯

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf STM32CubeProgrammer v2.16.0 烧录需要的二进制文件1 烧录到SD卡需要哪些文件 参考《轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序》,烧录需要的SD卡文件如下: &a…

多模态大模型思路

最近看了一篇苏神的文章,对多模态LLM的设计思考很有启发,总结如下,原文可参考“闭门造车”之多模态模型方案浅谈 - 科学空间|Scientific Spaces 多模态模型要解决什么问题 视频生成、文生图这些内容,图文混合的双模态输入输出&a…

CTF-PWN-kernel-UAF

文章目录 参考slub 分配器kmem_cache_cpukmem_cache_node[ ]冻结和解冻分配释放 fork绑核Kmalloc flag和slub隔离CISCN - 2017 - babydriver检查babtdriver_initstruct cdevalloc_chrdev_regioncdev_initownercdev_add_class_createdevice_create babyopenbabyreleasebabyreadb…

机器视觉系统-同轴光源大小选择技巧

同轴光源多用于检测光滑平面产品上的缺陷,同样利用上述的方法计算得出光源尺寸。 实际上,同轴光源可理解为没有孔的开孔面光,因此可等效为发光面相等的面光源,如下图: 如图所示,同轴光源的效果与开孔面光的…

LeetCode 算法:缺失的第一个正数c++

原题链接🔗:缺失的第一个正数 难度:困难⭐️⭐️⭐️ 题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输…

Gradio.NET 的简单入门使用

1、最近在网络上由发现了一个好完的东西。 2、Gradio.NET通过简单的C# Web API几行代码就可以实现一网页界面。 3、Python中也有一个Gradio,功能好像都差不多哦,不废话了,我们来开始实操。 4、在Visual Studio 2022 中创建一个 ASP.NET Cro…

Seq2seq、编码器解码器神经网络

目录 一、Seq2seq 简介二、编码器三、解码器四、编码器-解码器的训练 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 需掌握的前提知识: LSTM、词嵌入 本文参考:【官方双语】编码、解码神经网…

《软件定义安全》之五:软件定义的安全架构

第5章 软件定义的安全架构 1.软件定义安全架构 安全控制平台,主要负责安全设备的资源池化管理、各类安全信息源的收集和分析、与客户业务系统对接,以及相应安全应用的策略解析和执行。 安全应用是根据特定的安全需求所开发的程序,它利用安全…

Mysql的InnoDB介绍

目录 show engines查看搜索殷勤,默认InnoDB。 Mysql为什么使用InnoDB作为默认存储引擎 InnoDB主要包括内存结构和磁盘结构 内存结构包含: 磁盘结构中包括: 为什么设计成内存结构和磁盘结构两部分 使用InnoDB存储引擎创建的表,对应的数据文件在哪里…

堆排序经典问题【TopK】

前言 在上文我们讲了堆排序的实现(点此调整),我们先简单回顾一下。 在进行堆排序之前,需要建一个堆,由于排序是将堆顶数据与堆底交换,所以排升序建大堆,降序建小堆。 堆排序的代码 //向下调整…

Nginx+Tomcat负载均衡、动静分离群集方案

一、Tomcat简介 在现代 Web 服务架构中,Tomcat 和 Nginx 是两个至关重要的组件,负责处理用户请求并实现高性能的服务。本篇博客将深入探讨这些技术的原理和部署配置方法。 最初是由Sun的软件构架师詹姆斯邓肯戴维森开发。安装Tomcat后,安装…

一文细谈SNN的基本数学原理,LIF模型,STDP与STBP学习方法

首先本文是读完 如何看待第三代神经网络SNN?详解脉冲神经网络的架构原理、数据集和训练方法 原创-CSDN博客 一文通俗入门脉冲神经网络(SNN)第三代神经网络-CSDN博客 两篇文章的总结,文章仅用于学习。 本文主要讨论STDP和STBP方法。 我们都知道&…

Zynq学习笔记--AXI4-Stream到视频输出IP是如何工作的?

目录 1. 简介 2. 原理详解 2.1 示例工程 2.2 AXI4-Stream to Video Out 3. Master/Slave Timing Mode 3.1 Slave Timing Mode 3.2 Master Timing Mode 4. 总结 1. 简介 本文主要介绍了 AXI4-Stream 到视频输出 的内容。其中,示例工程展示了一个具体的设计&…

CSS id选择器

目录 任务描述 相关知识 id选择器 id选择器语法 类选择器与id选择器的区别 编程要求 任务描述 在本关中,你将通过id选择器的方式完成页面菜单栏样式布局,栏目导航等任务。 完成任务之后,基本页面效果如下: 动态效果如下&am…

瑞昱半导体AMB82 MINI SD卡加载模型RTSP视频流AI识别图像和声音分类

AMB82 MINI Arduino的方法迭代更新十分及时,github维护也十分频繁。最新推出的4.0.7版本开始支持SD卡加载模型。有的网友装了4.0.6版本是看不到摄像头和模型加载选项的。 用这个实例来呈现RTSP视频流AI识别图像,同时展示对声音进行分类效果。 SDK升级到…

XUbuntu24.04之制作ISO镜像启动盘(二百四十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【数据结构与算法 经典例题】括号匹配问题

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 ​​ 目录 一、问题描述 二、解题思路 🍃破解之道 🍃…

基于大模型的360度全景图像生成技术:L-MAGIC

在数字技术的浪潮中,我们迎来了一项革命性的创新——L-MAGIC,一个能够基于一张普通照片和简单文字描述,快速生成360度全方位全景画面的系统。L-MAGIC不仅提供了沉浸式的视觉体验,还融合了多种素材和技术手段,让全景图像的生成变得更加丰富和真实。 技术亮点 1. 多角度视…

小熊家务帮day19-day21 订单模块2(取消订单,退款功能等)

目录 1 订单退款功能1.1 需求分析1.2 接口分析1.3 退款流程分析1.4 表结构设计1.5 取消未支付订单实现1.5.1 接口开发Controller层开发Service层开发 1.5.2 接口测试 1.5 取消已支付订单实现 1 订单退款功能 1.1 需求分析 用户下单成功可以取消订单,在订单的不同状…

【网络编程开发】11.IO模型 12.IO多路复用

11.IO模型 什么是IO: IO 是 Input/Output 的缩写,指的是输入和输出。在计算机当中,IO 操作通常指将数据从一个设备或文件中读取到计算机内存中,或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。 通常用…