互斥锁即优先级继承,其作用就是在H、L两个任务同时需要唯一资源时,且任务L需要先得到了使用权,这时需要提高L的优先级,让L尽快干完活,好让H用,避免因任务M打断任务L而导致任务L占用资源的时间过长。
而递归互斥锁是可以在一个任务线程内使用。
本次实验是在实验三的基础上进行修改,其中将按键任务的优先级更改为三者中的H;将任务三的优先级更改为三者中的M;将任务四的优先级更改为三者中的L。
按键
/* USER CODE END Header_StartKEY_Task */
void StartKEY_Task(void const * argument)
{
/* USER CODE BEGIN StartKEY_Task */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);//消抖
osThreadSuspendAll();
printf("KEY0按下\r\n");
osThreadResumeAll();
osThreadResume(myTask03Handle);//释放任务3
osThreadResume(myTask04Handle);//释放任务4
}
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);
}
osDelay(1);
}
/* USER CODE END StartKEY_Task */
}
任务3
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
osThreadSuspend(NULL);//将自己挂起
osThreadSuspendAll();
printf("我是任务1\r\n");
osThreadResumeAll();
osDelay(1);
}
/* USER CODE END StartTask03 */
}
任务4
/* USER CODE END Header_StartTask04 */
void StartTask04(void const * argument)
{
/* USER CODE BEGIN StartTask04 */
/* Infinite loop */
for(;;)
{
osThreadSuspend(NULL);//将自己挂起
osThreadSuspendAll();
printf("我是任务2\r\n");
osThreadResumeAll();
osDelay(1);
}
/* USER CODE END StartTask04 */
}
由于任务3的优先级比任务4的优先级要,所以在按键任务释放任务3和任务4后,会先执行任务3其运行结果如下
按键
/* USER CODE END Header_StartKEY_Task */
void StartKEY_Task(void const * argument)
{
/* USER CODE BEGIN StartKEY_Task */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);//消抖
osThreadSuspendAll();
printf("KEY0按下\r\n");
osThreadResumeAll();
osThreadResume(myTask03Handle);//释放任务3
osThreadResume(myTask04Handle);//释放任务4
if(osMutexWait(myMutex01Handle,osWaitForever) == osOK)//获得互斥锁
{
osThreadSuspendAll();
printf("获得成功byKEY\r\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("获得失败byKEY\r\n");
osThreadResumeAll();
}
if(osMutexRelease(myMutex01Handle) == osOK)
{
osThreadSuspendAll();
printf("释放成功byKEY\r\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("释放失败byKEY\r\n");
osThreadResumeAll();
}
}
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == 0)
{
osDelay(10);
}
osDelay(1);
}
/* USER CODE END StartKEY_Task */
}
任务3
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
osThreadSuspend(NULL);//将自己挂起
osThreadSuspendAll();
printf("我是任务1\r\n");
osThreadResumeAll();
osDelay(1);
}
/* USER CODE END StartTask03 */
}
任务4
/* USER CODE END Header_StartTask04 */
void StartTask04(void const * argument)
{
/* USER CODE BEGIN StartTask04 */
/* Infinite loop */
for(;;)
{
if(osMutexWait(myMutex01Handle,osWaitForever) == osOK)//获得互斥锁
{
osThreadSuspendAll();
printf("获得成功byTASK04\r\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("获得失败byTASK04\r\n");
osThreadResumeAll();
}
osThreadSuspend(NULL);//将自己挂起
osThreadSuspendAll();
printf("我是任务2\r\n");
osThreadResumeAll();
osDelay(1);
if(osMutexRelease(myMutex01Handle) == osOK)
{
osThreadSuspendAll();
printf("释放成功byTASK04\r\n");
osThreadResumeAll();
}
else
{
osThreadSuspendAll();
printf("释放失败byTASK04\r\n");
osThreadResumeAll();
}
}
/* USER CODE END StartTask04 */
}
在按键key0未按下之前,任务4会先获得互斥锁然后挂起任务4
当key0按键按下之后,由于任务4的获得互斥锁,那么任务4会获取与按键任务相同的优先级,测试结果如下
osMutexWait(myMutex01Handle,osWaitForever)//获得互斥锁
osMutexRelease(myMutex01Handle)//释放互斥锁