1、简介
互斥信号量和信号量有着相同的作用,不同的是前者具备优先级继承机制,可以最大化减小优先级翻转的缺陷。
2、CubeMX配置
创建Mutex互斥信号量
同时创建4个任务,其优先级设置如下,用于验证互斥信号量的作用。LowTask用于访问临界资源,而MidTask1/2不涉及对临界资源的访问,仅是优先级高于LowTask。HighTask用于访问临界资源,在4个任务中优先级为最高。
3、测试程序编写
LowTask任务部署
/* USER CODE END Header_LowTask1 */ void LowTask1(void *argument) { /* USER CODE BEGIN LowTask1 */ static uint32_t i; osStatus_t ret; /* Infinite loop */ for(;;) { printf("LowPriority_Task AcquireMutex......\n"); ret = osMutexAcquire (MutexSemHandle, osWaitForever); if( ret == osOK) { printf("LowPriority_Task Running\n"); } for(i=0;i<2000000;i++) { osThreadYield(); } printf("LowPriority_Task ReleaseMutex\n"); ret = osMutexRelease(MutexSemHandle); osDelay(1000); }
MidTask1任务部署
/* USER CODE END Header_MidTask01 */ void MidTask01(void *argument) { /* USER CODE BEGIN MidTask01 */ /* Infinite loop */ for(;;) { printf("MidPriority_Task01 Running\n"); osDelay(1000); } /* USER CODE END MidTask01 */ }
MidTask2任务部署
void MidTask02(void *argument) { /* USER CODE BEGIN MidTask02 */ /* Infinite loop */ for(;;) { printf("MidPriority_Task02 Running\n"); osDelay(1000); } /* USER CODE END MidTask02 */ }
HighTask任务部署
/* USER CODE END Header_HighTask01 */ void HighTask01(void *argument) { /* USER CODE BEGIN HighTask01 */ osStatus_t ret; /* Infinite loop */ for(;;) { printf("HighPriority_Task AcquireMutex.......\n"); ret = osMutexAcquire (MutexSemHandle, osWaitForever); if( ret == osOK) { printf("HighPriority_Task Running\n"); } ret = osMutexRelease(MutexSemHandle); if( ret == osOK) { printf("HighPriority_Task ReleaseMutex!\r\n"); } osDelay(1000); } /* USER CODE END HighTask01 */ }
4、实验结果
可以看到,使用互斥量后低优先级任务不会被MidTask打断。这是因为LowTask和HighTask同时访问临界资源,并且LowTask先于访问而HighTask后访问,LowTask临时将优先级提升至HighTask级别,故MidTask无法打断LowTask的执行。