首页 > 其他分享 >浅析嵌入式实时系统中信号量的概念

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

时间:2024-06-11 12:05:04浏览次数:23  
标签:共享资源 Task 计数 嵌入式 信号量 互斥 任务 浅析

目录

概述

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,获取一个二值,在此情况下,它选择等候信号灯,则请求的任务阻塞

标签:共享资源,Task,计数,嵌入式,信号量,互斥,任务,浅析
From: https://blog.csdn.net/mftang/article/details/137522477

相关文章

  • 嵌入式开发-基于物联网的智能农场项目
    项目的github地址:https://github.com/zhangruyi3906/smartFarm/总结:第一天实训总体十分的轻松每天坚持写技术日志认真写好工程实践报告M0开发板的控制命令的格式:环境:十六进制36字节BBID2400命令格式:十六进制----36个字节DD id2400 00---开灯DD i......
  • 500BIO01 1MRB150005R1J嵌入式数字模块
    500BIO011MRB150005R1J嵌入式数字模块是指在嵌入式系统中用于处理和转换数字信号的硬件或软件组件。这些模块广泛应用于各种电子设备和系统中,包括单片机、ARM处理器、DSP等。嵌入式数字模。 这类模块通过RS232接口将数字信号调制成音频模拟信号进行传输。它在无线通信和数......
  • 分享几个嵌入式相关的高星开源项目
    目录1前言2开源嵌入式项目举例2.1Avem2.2Awesome-Embedded2.3soft-and-hard《软硬结合——从零打造物联网》2.4机械臂2.5焊台2.6智能锁2.7智能电表2.8智能家居3嵌入式相关学习交流网站1前言(1)快速提高嵌入式技术的方法就是完成实际项目中一个或几个......
  • 嵌入式浅谈之CANopen
    在工业控制和汽车领域,CAN是一种流行的现场总线,到处都可以看到它的身影。而CAN协议本身只定义了物理层和链路层,对应用层没有规定。各家都可以自定义自己的应用层协议内容,但是这样一来各家协议就不能兼容,大家各自搞一套,似乎是有点重复造轮子的意思,而且协议稳定需要较长的验证,这样......
  • 嵌入式浅谈之“梯形”加减速MCU算法实现
    书接上回,上章我们讲到原理,本章我们来聊聊实现。在笔者的实际项目经历中,梯形加减速运用的比较广泛,主要以其优秀的加减速能力、对算法实现资源的需求较小、实现难度适中而被广泛应用。下面就简单介绍一下基于MCU的算法实现过程,以STM32为例。采用“梯形”加减速算法,在运动过......
  • 嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属
    目录1文件的时间属性简介2utime()函数2.1 utime()函数简介2.2示例程序3 utimes()函数3.1 utimes()函数简介3.2示例程序 4  futimens()函数4.1 futimens()函数简介4.2示例程序5 utimensat()函数5.1 utimensat()函数简介5.2 示例程序1文件的时间......
  • 【转载】ARM嵌入式系统为什么要做内存对齐
    做嵌入式系统软件开发,经常在代码中看到各种各样的对齐,很多时候我们都是知其然不知其所以然,知道要做好各种对齐,但是不明白为什么要对齐,不对齐会有哪些后果,这篇文章大概总结了内存对齐的理由。CPU体系结构和MMU的要求目前有一些RISC指令集的CPU不支持非对齐的内存变量访问操作,比......
  • 嵌入式Linux中驱动程序的基本框架
    在“嵌入式Linux中内核模块的基本框架”一文中,已经构建好了内核模块的基本框架结构,现在在该框架的基础上进一步扩展,就可以形成Linux下的字符型设备驱动基本框架,下面就详细进行讨论。在Linux系统中,设备驱动共分为三种类型,即字符型、块型和网络型。字符型设备以字节为最小操作单位,......
  • 【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化
    目录一、嵌入式系统简介二、C++在嵌入式系统中的优势三、机器学习在嵌入式系统中的挑战四、C++实现机器学习模型的基本步骤五、实例分析:使用C++在嵌入式系统中实现手写数字识别1.数据准备2.模型训练与压缩3.模型部署六、优化与分析1.模型优化模型量化模型剪枝......
  • 作为嵌入式/软件开发工程师你需要知道的东西
    大型软件开发的基本素养中国科学技术大学软件开发规范软件开发规范(试行版)(ustc.edu.cn) 清华软件工程样张标题(tup.com.cn)软件工程这个概念,并将其定义为“为了经济地获得可靠的和能在实际机器上高效运行的软件,而建立和使用的健全的工程规则”(1)将系统化的、严格约......