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的执行。

我要赚赏金
