简介:
信号量用来进行资源管理和任务同步。
FreeRTOS 中 信号量分为 二值信号量,互斥信号量,计数信号量和递归信号量。
二值信号量
官网介绍:https://www.freertos.org/Embedded-RTOS-Binary-Semaphores.html
一个只有一个队列项的队列。 可以用于互斥访问 或者 同步,常用于任务(中断)和任务间的同步。
函数
创建二值信号量 xSemaphoreCreateBinary()
释放信号量 xSemaphoreGive()
获取信号量 xSemaphoreTake()
计数信号量
官网介绍:https://www.freertos.org/Real-time-embedded-RTOS-Counting-Semaphores.html
简介: 计数信号量是长度大于1的队列。
一 个二值信号量最多只可以锁存一个中断事件。在锁存的事件还未被处理之前,如果还有中断事件发生,那么后续发生的中断事件将会丢失。如果 用计数信号量代替二值信号量,那么,这种丢中断的情形将可以避免。
常用与两个场合:
-
计算事件。
在这种使用场景中,事件处理程序将在每次事件发生时“给出”信号量(递增信号量计数值),并且处理程序任务将在每次处理事件时“获取”信号量(递减信号量计数值)。因此,计数值是已发生事件数与已处理数之间的差值。在这种情况下,希望在创建信号量时计数值为零。
应用场景: 某个动作触发计数信号量,信号量的值都会+1.另一个任务会根据计数信号量的计数值,发生多次触发事件。
-
资源管理。
在此使用方案中,计数值指示可用资源的数量。要获得对资源的控制,任务必须首先获得信号量 - 递减信号量计数值。当计数值达到零时,没有空闲资源。当任务完成资源时,它'返回'信号量 - 增加信号量计数值。在这种情况下,希望计数值等于创建信号量时的最大计数值。
应用场景: 做流控 。 比如银行有10个窗口,排号机人员排号。停车场空位。
函数:
-
创建计数型信号 xSemaphoreCreateCounting()
-
查询 信号量的计数 uxSemaphoreGetCount()
-
释放信号量 xSemaphoreGive()
-
获取信号量 xSemaphoreTake()
互斥信号量
官网介绍: https://www.freertos.org/Real-time-embedded-RTOS-mutexes.html
一个拥有优先级继承的二值信号量。互斥信号量相当于一个钥匙,要访问的时候,必须需要钥匙,访问完了之后,需要归还钥匙,这样其他的任务可以拿这个钥匙去使用资源。
互斥信号量,只能用在任务中,不能用于中断服务函数。
互斥信号量创建成功后,释放了一次。这里和二值信号量不同,二值信号量创建的时候,没有释放。
函数:
释放信号量 xSemaphoreGive()
获取信号量 xSemaphoreTake()
递归互斥信号量
官网: https://www.freertos.org/RTOS-Recursive-Mutexes.html
不能用在中断服务函数中。
递归使用的互斥锁可由所有者重复“捕获”。
创建: xSem'CreateRecursiveMutex()
使用信号量,要包含头文件 #include "semphr.h"
来源:https://blog.csdn.net/happygrilclh/article/details/100019726