丰城建设网站,乐清网站建设,郑州高端网站建设公司,亚马逊网站怎么做信号量相当于一个标志#xff0c;实现对资源多少的管理。 比如停车场空位的数量。
这里使用的是二值信号量#xff0c;其队列长度为1#xff0c;只有空或满两种状态。
1、步骤#xff1a;
1.1、创建信号量
1.2、释放信号量
1.3、获取信号量
注#xff1a;若想深入还…信号量相当于一个标志实现对资源多少的管理。 比如停车场空位的数量。
这里使用的是二值信号量其队列长度为1只有空或满两种状态。
1、步骤
1.1、创建信号量
1.2、释放信号量
1.3、获取信号量
注若想深入还需花大功夫目前目标争取会用
#include sys.h
#include delay.h
#include usart.h
#include led.h
#include FreeRTOS.h
#include task.h
#include sys.h
#include semphr.h //添加信号量相关头文件
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者KJX
时间2023-12-22
*****************************************************/
//优先级
#define START_TASK_PRIO 1
//堆栈大小
#define START_STK_SIZE 128
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;//task1优先级
#define TASK1_TASK_PRIO 2
//task1堆栈大小
#define TASK1_STK_SIZE 128
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t Task1Task_Handler;//task2优先级
#define TASK2_TASK_PRIO 3
//task2堆栈大小
#define TASK2_STK_SIZE 128
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t Task2Task_Handler;QueueHandle_t semphore_handle;//信号量句柄int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);delay_init();uart_init(9600);LED_Init();LED00; semphore_handlexSemaphoreCreateBinary();//创建二值信号量if(semphore_handle ! NULL){printf(二值信号量创建成功\r\n);}xTaskCreate((TaskFunction_t ) start_task, //指向任务函数的指针必须为第一个(char * ) start_task, //任务名字(uint16_t ) START_STK_SIZE, //任务堆栈大小,字为单位(void * ) NULL, //传递给任务函数的参数(UBaseType_t ) START_TASK_PRIO,//任务优先级数值大则优先级大(TaskHandle_t * ) StartTask_Handler);//任务句柄控制块 vTaskStartScheduler();//开启任务调度
}//开始任务
//返回值为pdPASS则创建任务成功void start_task(void * pvParameters)
{taskENTER_CRITICAL();//进入临界区创建任务完成后才开始执行优先级任务//创建Task1xTaskCreate((TaskFunction_t ) task1_task,(char * ) task1_task,(uint16_t ) TASK1_STK_SIZE,(void * ) NULL,(UBaseType_t ) TASK1_TASK_PRIO,(TaskHandle_t * ) Task1Task_Handler);//创建Task2xTaskCreate((TaskFunction_t ) task2_task,(char * ) task2_task,(uint16_t ) TASK2_STK_SIZE,(void * ) NULL,(UBaseType_t ) TASK2_TASK_PRIO,(TaskHandle_t * ) Task2Task_Handler);vTaskDelete(StartTask_Handler);//删除开始任务删除自身用NULLtaskEXIT_CRITICAL();//退出临界区
}//任务一获取二值信号量
void task1_task(void * pvParameters)
{ uint8_t key1;BaseType_t err; while(1){if(key1){if(semphore_handle ! NULL){err xSemaphoreGive(semphore_handle);printf(二值信号量释放成功\r\n);}else{printf(二值信号量释放失败\r\n);}}vTaskDelay(10);}
}//任务二释放二值信号量
void task2_task(void * pvParameters)
{ uint32_t i0;while(1){xSemaphoreTake(semphore_handle,1000);//获取信号量并死等printf(获取信号量释放成功:%d\r\n,i);}
}