STM32 HAL freertos零基础(五) STM32CubeMX配置完成后自定义二值信号量 解决二值信号量初始值为1问题

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 */
}

 测试如下:

上文如有错误,恳请各位大佬指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值