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