18 FreeRTOS信号量及二值信号量
1 信号量简介
信号量常用于控制对共享资源的访问和任务同步
共享资源访问
与任务同步
与任务同步:
用于任务与任务或中断与任务之间同步
FreeRTOS中信号量:
二值信号量
计数型信号量
互斥信号量
递归互斥信号量
二值信号量简介
用于互斥访问或同步
互斥信号量有优先级继承机制
信号量没有优先级继承
二值信号用于同步
互斥信号量用于互斥访问
二值信号量无效
xSemaphoreTake() //获取信号量
二值信号量无效,任务进入阻塞态
中断释放信号量
xSemaphoreGiveFromISR() //释放信号量
信号量变有效
任务获取信号量成功
信号量有效,任务获取信号量成功,任务从阻塞态解除,开始执行处理过程、
任务再次进入阻塞态
等再次调用
XSemaphoreTake() //获取信号量
二值信号量变无效,任务进入到阻塞态,直到中断再次调用
xSemaphoreGiveFromISR() //释放信号量
创建二值信号量
头文件:
#include “semphr.h”
函数:
void vSemaphoreCreateBinary(SemaphoreHandle_t xSemaphore) //动态创建二值信号量,老版API函数
参数:
xSemaphore:保存创建成功的二值信号量句柄
返回值:
NULL:二值信号量创建失败
其他值:二值信号量创建成功
SemaphoreHandle_t xSemaphoreCreateBinary(void) //动态创建二值信号量,新版
参数:无
返回值:
NULL:二值信号量创建失败
其他值:创建成功的二值信号量的句柄
SemaphoreHandle_t xSemaphoreCreateBinaryStatic(StaticSemaphore_t * pxSemaphoreBuffer)
//静态创建二值信号量
参数:
pxSemaphoreBuffer: 指向StaticSemaphore_t 类型的变量,来保存信号量结构体。
返回值:
NULL:二值信号量创建失败
其他值:创建成功的二值信号量句柄
释放信号量
分为:
任务级
中断级别
释放信号量:
二值信号量
计数型信号量
互斥信号量
BaseType_t xSemaphoreGive(xSemaphore) //任务级信号量释放函数
参数:
xSemaphore: 释放的信号量句柄
返回值:
pdPASS: 释放信号量成功
errQUEUE_FULL: 释放信号量失败
中断释放信号量用于:
二值信号量
计数型信号量
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, BaseType_t * PxHigherPrityTaskWoken)
//中断级信号量释放函数
参数:
xSemaphore:
释放的信号量句柄
pxHigherPriorityTaskWoken:
标记退出函数以后是否进行任务切换
返回值:
pdPASS:
释放信号量成功
errQUEUE_FULL:
释放信号量失败
获取信号量
获取
二值信号量
计数型信号量
互斥信号量
BaseType_t xSemaphoreeTake(SemaphoreHandle_t xSemaphore, TickType_t XBlockTime) //任务级获取信号量函数
参数:
xSemaphore: 获取信号量句柄
xBlockTime: 阻塞时间
返回值:
pdTRUE: 获取信号量成功
pdFALSE: 超时,获取信号量失败
BaswType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore, BaseType_t * pxHigherPriorityTaskWoken)
//中断级获取信号量函数
参数:
xSemaphore: 获取信号量句柄
pxHigherPriorityTaskWoken:
返回值:
pdPASS:获取信号量成功
xSemaphoreCreateBinaryStatic() //静态创建二值信号量