一。信号量的概念与应用
信号量定义
FreeRTOS信号量介绍
FreeRTOS信号量工作原理
1.信号量的定义
多任务环境下使用,用来协调多个任务正确合理使用临界资源。
2.FreeRTOS信号量介绍
Semaphore包括Binary,Count,Mutex;
Mutex包括RecursiveMutex,Mutex。
3.FreeRTOS信号量工作原理
任务1在运行时,使用了一个临界资源,他发送一个二值信号量同步信号,表示占用资源,任务2来运行时,发现有任务占用资源(信号量同步信号),所以堵塞任务,等待下资源的释放。
二。实验:二值信号量函数的应用(在上一节创建工程基础上--》queue队列)
1.功能需求
1、修改按键功能
2、当按键按下触发打印一次CPU利用率
3、使用二值信号量实现按键与任务间同步
2.API详解
(1)xSemaphoreCreateBinary()创建二值信号量
(2)xSemaphoreGive()任务间释放信号量
(3)xSemaphoreGiveFromISR()任务间释放信号量
(4)xSemaphoreTake()任务间获取信号量 semphr.h
(5)xSemaphoreTakeFromISR()中断获取信号量
3.任务实现
1.创建二值信号量
2.在任务中获取信号量
3.在中断中发送信号量
3.1Cubemx创建工程
(1)在FREERTOS中创建二值信号量
二值信号量在FREERTOS的初始化的时候就会创建(返回信号量的句柄)
3.2 步骤:
(1)把FREERTOS.c中的二值信号量声明外接到GPIO.c中(GPIO.c中有按键按下的GPIO中断处理)
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
extern osSemaphoreId CpuPrintBinarySemHandle;
(2)在GPIO.c中的按键中断回调函数中加入任务释放信号量函数
xSemaphoreGiveFromISR(CpuPrintBinarySemHandle,NULL);
(3)FREERTOS.c中的串口输出的主函数中
if(xSemaphoreTake(CpuPrintBinarySemHandle,portMAX_DELAY) == pdPASS){
结果
复位直接打印程序的cpu利用率,由于没有运行就输出,所以只能打印printf,字符串没有东西,按key3释放信号量,这个时候主函数中接受到有信号量,所以再次运行。
三。实验:计数信号量函数的应用(上一个工程基础上继续创建)
功能分析
API详解
功能实现
1.功能分析
1、修改按键功能,模拟停车位出入功能
2、当按键K3按下获取车位
3、当按键K4按下释放车位
2.API讲解
xSemaphoreCreateCounting()
uxSemaphoreGetCount()
3.功能实现
1.按键k4初始化
2.创建技术信号量
3.k3按下获取停车位
4.按下释放停车位
1.cubemx创建工程
(1)Key4(PF11)初始配置,中断配置
(2)FREERTOS中使能以下后,才可以添加计数信号量
(3)创建计数信号量(初始化为4)
2.步骤:
(1)在FREERTOS.c中有设置的计数信号量,extern设置到GPIO.c中
extern osSemaphoreId KeyCountingSemHandle;
(2)GPIO.c的中断回调函数中,Give为释放信号量,Take为使用信号量,Key3为释放,Key为使用。
《获取》
《释放》
//key3中
if(xSemaphoreTakeFromISR(KeyCountingSemHandle,NULL)==pdPASS){
printf("Take success\n");
}else{
printf("Take fail\n");
}
//key4中
if(xSemaphoreGiveFromISR(KeyCountingSemHandle,NULL)==pdPASS){
printf("Give success\n");
}else{
printf("Give fail\n");
}
结果:
按Key3为开走车(释放信号量),Key4为停车(占用信号量)
四。信号量实现原理
1.信号量创建删除
2.信号量释放
3.信号量获取