目录
一、信号量的概念
二、二值信号量
1、二值信号量的定义
2、二值信号量的作用
3、二值信号量的操作
4、二值信号量操作实验
5、二值信号量会导致优先级翻转问题
三、互斥信号量
1、互斥信号量的引入
2、注意:互斥信号量不能用于中断服务函数中!!!
3、互斥信号量的操作
四、计数型信号量
1、创建计数型信号量
2、释放和获取计数型信号量
3、计数型信号量操作实验
五、递归互斥信号量
一、信号量的概念
1、信号量(semaphore)可以实现任务与任务或任务与中断间的同步功能(二值信号量)、资源管理(计数信号量)、临界资源的互斥访问(互斥信号量)等。
2、信号量是一个非负数,二值信号量与互斥信号量取值范围为0-1,计数信号量取值范围是0-N(N>1):
(1)0:信号量为空,所有试图获取它的任务都将处于阻塞状态,直到超时退 出或其他任务释放信号量;
(2)正数:表示有一个或多个信号量供获取;
二、二值信号量
1、二值信号量的定义
(1)当信号量被获取了,信号量值变为0;当信号量被释放了,信号量值变为1。把这种取值只有0与1两种状态的信号量称之为二值信号量。创建二值信号量时,系统会为创建的二值信号量分配内存。
(2)二值信号量是一种长度为1,消息大小为0的特殊消息队列。因为这个队列只有空或满两种状态,而且消息大小为0,因此在运用时,只需要知道队列中是否有消息即可,而无需关注消息是什么。
2、二值信号量的作用
任务与任务 或 任务与中断间同步。
3、二值信号量的操作
(1)创建二值信号量函数
(2)释放信号量函数
(3)获取信号量函数
4、二值信号量操作实验
(1)初始化处创建二值信号量
(2)在串口中断处理函数USART1_IRQHandler() 释放二值信号量
(3)在任务处获取二值信号量
5、二值信号量会导致优先级翻转问题
(1)优先级翻转现象:
当一个低优先级任务和一个高优先级任务同时使用同一个信号量,而系统中还有其他中等优先级任务时。 如果低优先级任务获得了信号量,那么高优先级的任务就会处于等待状态,但是,中等优先级的任务可以打断低优先级任务而先于高优先级任务运行(此时高优先级的任务在等待信号量,所以不能运行),这是就出现了优先级翻转的现象。
三、互斥信号量
1、互斥信号量的引入
(1)作用:解决优先级翻转问题。
互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。因此二值信号另更适合用于同步(任务与任务或任务与中断的同步),而互斥信号量适合用于简单的互斥访问。
(2)优先级继承
当一个互斥信号量正在被一个低优先级的任务使用,而此时有个高优先级的任务也尝试获取这个互斥信号量的话就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级,这个过程就是优先级继承。优先级继承尽可能的降低了高优先级任务处于阻塞态的时间,并且将已经出现的“优先级翻转”的影响降到最低。
2、注意:互斥信号量不能用于中断服务函数中!!!
原因如下:
(1)互斥信号量有优先级继承的机制,所以只能用在任务中,不能用于中断服务函数。
(2)中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。
3、互斥信号量的操作
(1)互斥信号量的创建
(2)释放互斥信号量
(3)获取互斥信号量
四、计数型信号量
计数型信号量就是长度大于1的队列。
1、创建计数型信号量
2、释放和获取计数型信号量
计数型信号量的释放和获取与二值信号量相同。
3、计数型信号量操作实验
(1)初始化处创建计数型信号量
(2)在任务处释放计数型信号量
(3)在任务处获取计数型信号量