> 文章列表 > FreeRTOS - 计数信号量

FreeRTOS - 计数信号量

FreeRTOS - 计数信号量

一.任务功能

1、修改按键功能,模拟停车位出入功能

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

三.业务流程

FreeRTOS - 计数信号量

三.CubeMX配置

  • 使能计数量

FreeRTOS - 计数信号量

  • 创建信号量

FreeRTOS - 计数信号量

四.代码配置

  • 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");}}}}}
}