FreeRTOS - 计数信号量
一.任务功能
2、当按键按下 获取车位
3、当按键抬起 释放车位
二.API接口
函数原型 |
SemaphoreHandle_t xSemaphoreCreateCounting( ①UBaseType_t uxMaxCount, ②UBaseType_t uxInitialCount ); |
功能概述 |
创建计数信号量,并返回信号量句柄。 |
参数 |
①:计数信号量最大值,当信号量到达最大值后,就不能是give ②:创建时,计数信号量初始值 |
返回值 |
NULL:堆空间不足 Any other value :信号量句柄 |
注意事项 |
configSUPPORT_DYNAMIC_ALLOCATION必须置为1 USE_COUNTING_SEMAPHORES必须置为1 |
函数原型 |
#include “FreeRTOS.h” #include “semphr.h” UBaseType_t uxSemaphoreGetCount( ①SemaphoreHandle_t xSemaphore ); |
功能概述 |
返回当前信号量计数值 |
参数 |
①:信号量句柄 |
返回值 |
当前信号量计数值 |
注意事项 |
None |
三.业务流程
三.CubeMX配置
-
使能计数量
-
创建信号量
四.代码配置
-
GPIO.c
extern osSemaphoreId KeyCountingSemHandle;
//按键检测回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(Key1_Pin == GPIO_Pin) //判断按下的GPIO{if ( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_RESET) //按下按键,导通{// HAL_Delay(10); //软件去抖动 if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_RESET){
// HAL_GPIO_WritePin(GPIOB,Led_Red_Pin,GPIO_PIN_RESET);
// HAL_GPIO_WritePin(GPIOB,Led_Green_Pin,GPIO_PIN_SET);/*建立标志位*/keyStatus = Key_down;printf("按键已按下\\r\\n");if(xSemaphoreTakeFromISR(KeyCountingSemHandle,NULL) == pdPASS){printf("获取车位成功\\r\\n");}else{printf("获取车位失败,车位已满\\r\\n");}}}else{if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_SET) // 高电平,未准备好 {
// HAL_Delay(10); //软件去抖动 if( HAL_GPIO_ReadPin(GPIOA,GPIO_Pin) == GPIO_PIN_SET){ // HAL_GPIO_WritePin(GPIOB,Led_Red_Pin,GPIO_PIN_SET); //关闭红灯
// HAL_GPIO_WritePin(GPIOB,Led_Green_Pin,GPIO_PIN_RESET); //开启绿灯/*建立标志位*/keyStatus = Key_up;printf("按键已抬起\\r\\n");if(xSemaphoreGiveFromISR(KeyCountingSemHandle,NULL) == pdPASS){printf("释放车位成功\\r\\n");}else{printf("释放车位失败,车位为空\\r\\n");}}}}}
}