1、简介
通过上文虽然实现了二值信号量实战,但每次配置STM32CubeMX二值信号量都恢复默认值1,为了解决该问题,对于二值信号量通过CubeMX配置完成后,在程序内自定义二值信号量。
2、文件建立
建立BinarySem文件夹添加BinarySem.cpp、BinarySem.h文件过程同STM32 HAL freertos零基础(二)-通过STM32CubeMX配置Freertos后在程序中进行任务创建,便于任务管理与识别。
一致。
2.1 BinarySem.cpp
/**
******************************************************************************
* File Name : BinarySem.cpp
* Description : BinarySem
******************************************************************************
* @attention
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "BinarySem.h"
osSemaphoreId_t xMyBinarySemaphore = NULL;
/* Functions -----------------------------------------------------------------*/
/**
* @brief BinarySem初始化
* @retval None
*/
void BinarySem_Init(void){
const osSemaphoreAttr_t myBinarySem02_attributes = {"myBinarySem02"};
xMyBinarySemaphore = osSemaphoreNew(1, 0, &myBinarySem02_attributes);
}
/**********************************END OF FILE*********************************/
每次建立新信号量仅仅需要在对应位置进行修改即可:
2.2 BinarySem.h
/**
******************************************************************************
* File Name : MainThread.h
* Description :
******************************************************************************
* @attention
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BinarySem_H
#define __BinarySem_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "FreeRTOS.h"
#include "task.h"
void BinarySem_Init(void);
extern osSemaphoreId_t xMyBinarySemaphore ;
#ifdef __cplusplus
}
#endif
#endif
/**
* @}
*/
/**
* @}
*/
/**********************************END OF FILE***********************************/
2.3 初始化配置
main.h中添加头文件:
#include "BinarySem.h"
接着在mian.c进行初始化:
BinarySem_Init();
2.4 测试
最后将任务1、2信号量句柄进行替换:
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
uint16_t buf = 100;
BaseType_t status;
/* Infinite loop */
for(;;)
{
if(sign_1==1){
status = xSemaphoreGive(xMyBinarySemaphore);
if (status == pdTRUE){
printf("二值信号量放入成功");
}
else{
printf("二值信号量放入失败\r\n");
}
sign_1=0;
}
osDelay(1);
}
/* USER CODE END StartDefaultTask */
}
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
uint16_t buf;
BaseType_t status;
/* Infinite loop */
for(;;)
{
if(sign_1==2){
status = xSemaphoreTake(xMyBinarySemaphore,0);
if (status == pdTRUE){
printf("二值信号量获取成功");
}
else{
printf("二值信号量获取失败\r\n");
}
sign_1=0;
}
osDelay(1);
}
/* USER CODE END StartTask02 */
}
测试如下:
上文如有错误,恳请各位大佬指正!