static void LowPriority_Task(void* parameter)
{
static uint32_t i;
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
while (1)
{
//printf("LowPriority_Task 获取信号量\n");
//获取互斥量 MuxSem,没获取到则一直等待
xReturn = xSemaphoreTake(MuxSem_Handle,/* 互斥量句柄 */
portMAX_DELAY); /* 等待时间 */
if (pdTRUE == xReturn)
{
// printf("LowPriority_Task Runing\n\n");
}
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
vTaskDelay(180);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
vTaskDelay(110);
//for (i=0; i<2000000; i++)
{ //模拟低优先级任务占用互斥量
//taskYIELD();//发起任务调度
}
//printf("LowPriority_Task 释放信号量!\r\n");
xReturn = xSemaphoreGive( MuxSem_Handle );//给出互斥量
// LED1_TOGGLE;
vTaskDelay(50);
}
}
static void HighPriority_Task(void* parameter)
{
BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为 pdPASS */
while (1)
{
//printf("HighPriority_Task 获取信号量\n");
//获取互斥量 MuxSem,没获取到则一直等待
xReturn = xSemaphoreTake(MuxSem_Handle,/* 互斥量句柄 */
portMAX_DELAY); /* 等待时间 */
if (pdTRUE == xReturn)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
vTaskDelay(280);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
vTaskDelay(130);
xReturn = xSemaphoreGive(MuxSem_Handle);
if (pdTRUE == xReturn)
flag=2;
}
vTaskDelay(40); // 释放 CPU
}
}
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
MuxSem_Handle = xSemaphoreCreateMutex();
if (NULL != MuxSem_Handle)
{
//printf("MuxSem_Handle 互斥量创建成功!\r\n");
}
BaseType_t xReturn = pdPASS;
xReturn = xSemaphoreGive( MuxSem_Handle );
if (pdPASS == xReturn)
{
// printf("创建 LowPriority_Task 任务成功!\r\n");
}
if (xTaskCreate(HighPriority_Task, "High", 128, NULL, 3, &xSenderTask) != pdPASS) {
// 创建失败处理
Error_Handler();
}
// 创建低优先级任务
if (xTaskCreate(LowPriority_Task, "Low", 128, NULL, 1, &xReceiverTask) != pdPASS) {
// 创建失败处理
Error_Handler();
}
// 启动调度器
vTaskStartScheduler();
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS */
/* add events, ... */
/* USER CODE END RTOS_EVENTS */
}
运行结果如下
可以看到互斥量对硬件的保护,即一个任务执行时不会被另一个打断。
下午一直是一个任务运行,另一个任务不执行,找了一下午发现是c8t6的存储空间不支持两个512,创建第二个任务都是失败的,换成两个128就好了。
还要注意freertosconfig.h
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configUSE_MUTEXES 1
#define configUSE_PREEMPTION 1
#define configUSE_TIME_SLICING 1 // 启用时间片轮转
#define configUSE_MUTEXES 1
#define configTICK_RATE_HZ ((TickType_t)1000) // 1ms时基