FreeRTOS的二进制信号量实现同步

点击查看代码
/**
   *********************************************************************************
   * @file    main.c 
   * @author  
   * @version 
   * @date    2024/07/20
   * @brief   利用FreeRTOS的动态分配内存的方案来创建一个任务,学习API接口的使用流程
							创建一个任务,用于点亮一盏LED灯  PF9 -- LED0
						  
					
   *********************************************************************************
**/

#include "stm32f4xx.h"  //必须包含
#include <stdio.h>
#include "uart.h"
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

TaskHandle_t Task1_Handle = NULL;  //用于存储创建的任务句柄
TaskHandle_t Task2_Handle = NULL;  //用于存储创建的任务句柄

SemaphoreHandle_t xSemaphore;      //二进制信号量	


//任务的接口
void task1(void *arg)
{
	USART1_SendString("task1 is create success!\r\n");
	
	for(;;)
	{
		
		 
		 USART1_SendString("task1 is running!\r\n");
		 vTaskDelay(5000);
		
		 //V操作
		 xSemaphoreGive(xSemaphore);
		 
	}

}
//任务的接口
void task2(void *arg)
{
	
	USART1_SendString("task2 is create success!\r\n");
	
	for(;;)
	{
		 
		 //P操作   如果没有获取到则一直阻塞
	   xSemaphoreTake( xSemaphore,portMAX_DELAY);	
		 
		 
		 USART1_SendString("task2 is running!\r\n");
		 vTaskDelay(500);
		
	}

}

int main()
{
	BaseType_t xReturned;
	
	
	//1.硬件的初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //在程序开头必须先进行NVIC的中断优先级分组
	
	USART1_Config(9600);
	
	
	
	//2.创建2个任务
	xReturned = xTaskCreate(
														task1,       				//任务的地址
														"task1",     				//任务的描述
														128,      					//任务的堆栈大小  128 * 32 / 8 = 512字节
														NULL,    						//任务接口的参数,无需传参则填NULL
														1,									//任务的优先级    范围 0 ~ configMAX_PRIORITIES - 1
														&Task1_Handle 			//任务的句柄,是为了提供给其他函数使用的
													);
	
	xReturned = xTaskCreate(
														task2,       				//任务的地址
														"task2",     				//任务的描述
														128,      					//任务的堆栈大小  128 * 32 / 8 = 512字节
														NULL,    						//任务接口的参数,无需传参则填NULL
														2,									//任务的优先级    范围 0 ~ configMAX_PRIORITIES - 1
														&Task2_Handle 			//任务的句柄,是为了提供给其他函数使用的
													);
  //错误处理	
	if( xReturned != pdPASS )
	{

	}
	
	//3.创建二进制信号量  初值=0
	xSemaphore = xSemaphoreCreateBinary();
	
	//4.启动调度器
	vTaskStartScheduler();
	
	while(1)
	{
		
	}
}





posted @ 2025-08-30 12:35  w1888  阅读(8)  评论(0)    收藏  举报