一、概念
(1)信号量是一种实现任务间同步与互斥的机制,可以实现任务与任务之间、中断与任务之间同步或临界资源的互斥访问,基于队列实现
(2)二值信号量:只有一个消息,空和满的状态标志信号量是否有效可用,主要应用于任务与任务、任务与中断之间的同步
(3)计数信号量:长度大于1的队列,主要应用于事件计数和资源管理
二、常用函数
(1)xSemaphoreCreateBinary创建二值信号量
(2)xSemaphoreCreateCounting创建计数信号量,使用计数信号量时需要将configUSE_COUNTING_SEMAPHORES宏定义打开
(3)vSemaphoreDelete删除信号量
(4)xSemaphoreGive释放信号量,使信号量变为有效状态供任务获取
(5)xSemaphoreGiveFromISR释放信号量,带中断保护
(6)xSemaphoreTake获取信号量,使信号量有效状态个数减一,减到零无可用信号量
(7)xSemaphoreTakeFromISR获取信号量,带中断保护
三、代码示例
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "queue.h"
#include "semphr.h"
static void vAppInitTask(void* pParam);
static void task1(void* pParam);
static void task2(void* pParam);
static TaskHandle_t handler1;
static TaskHandle_t handler2;
static TaskHandle_t appHandler;
SemaphoreHandle_t binaryHandler;
//主函数
int main(void)
{
//初始化硬件
led_init();
BaseType_t xReturn;
xReturn = xTaskCreate(vAppInitTask, //任务函数入口
"vAppInitTask", //任务名称
512, //任务堆栈大小
NULL, //传递参数
2, //任务优先级
&appHandler //任务句柄
);
if(pdPASS == xReturn){
vTaskStartScheduler(); //开启任务调度器
}
while(1);
}
//APP任务
void vAppInitTask(void* pParam)
{
taskENTER_CRITICAL();//进入临界区
//创建二值信号量
binaryHandler = xSemaphoreCreateBinary();
if(binaryHandler != NULL){//创建成功
}
//由于app任务创建成功后便开启了调度器,于是下边创建的任务创建后便会立即执行
xTaskCreate(task2, //任务函数入口
"task2", //任务名称
512, //任务堆栈大小
NULL, //传递参数
2, //任务优先级
&handler2 //任务句柄
);
xTaskCreate(task1, //任务函数入口
"task1", //任务名称
512, //任务堆栈大小
NULL, //传递参数
2, //任务优先级
&handler1 //任务句柄
);
vTaskDelete(appHandler);
taskEXIT_CRITICAL();//退出临界区
}
//任务1获取信号量
void task1(void* pParam)
{
BaseType_t pdReturn;
while(1){
pdReturn = xSemaphoreTake(binaryHandler,portMAX_DELAY);
if(pdReturn != pdFALSE){
open();
}
}
}
//任务2释放信号量
void task2(void* pParam)
{
while(1){
xSemaphoreGive(binaryHandler);
}
}
四、互斥量
(1)使用互斥量和递归互斥量需要打开configUSE_MUTEXES和configUSE_RECURSIVE_MUTEXES宏定义
(2)互斥量就是具有优先级继承的二值信号量
五、互斥量相关函数介绍
(1)xSemaphoreCreateMutex创建互斥量
(2)xSemaphoreCreateRecursiveMutex创建递归互斥量
(3)vSemaphoreDelete删除互斥量
(4)xSemaphoreTake获取互斥量
(5)xSemaphoreGive释放互斥量
(6)xSemaphoreTakeRecursive获取递归互斥量
(7)xSemaphoreGiveRecursive释放递归互斥量