FREERTOS学习笔记五-互斥锁

学习笔记五-互斥锁

1.实验内容

​ 互斥锁即优先级继承,其作用就是在H、L两个任务同时需要唯一资源时,且任务L需要先得到了使用权,这时需要提高L的优先级,让L尽快干完活,好让H用,避免因任务M打断任务L而导致任务L占用资源的时间过长。

​ 而递归互斥锁是可以在一个任务线程内使用。

​ 本次实验是在实验三的基础上进行修改,其中将按键任务的优先级更改为三者中的H;将任务三的优先级更改为三者中的M;将任务四的优先级更改为三者中的L。

2.CubeMX的配置

2.1添加互斥锁

FREERTOS学习笔记五-互斥锁_第1张图片

2.2使能递归互斥锁

FREERTOS学习笔记五-互斥锁_第2张图片

2.3添加递归互斥锁

FREERTOS学习笔记五-互斥锁_第3张图片

2.4更改任务优先级

FREERTOS学习笔记五-互斥锁_第4张图片

3.测试一 不添加互斥锁

3.1程序源码

按键

/* 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.2测试结果

​ 由于任务3的优先级比任务4的优先级要,所以在按键任务释放任务3和任务4后,会先执行任务3其运行结果如下
FREERTOS学习笔记五-互斥锁_第5张图片

4.测试二 添加互斥锁

4.1程序源码

按键

/* 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 */
}

4.2测试结果

​ 在按键key0未按下之前,任务4会先获得互斥锁然后挂起任务4

FREERTOS学习笔记五-互斥锁_第6张图片

​ 当key0按键按下之后,由于任务4的获得互斥锁,那么任务4会获取与按键任务相同的优先级,测试结果如下

FREERTOS学习笔记五-互斥锁_第7张图片

5.关键函数

osMutexWait(myMutex01Handle,osWaitForever)//获得互斥锁
osMutexRelease(myMutex01Handle)//释放互斥锁

你可能感兴趣的:(FREERTOS学习笔记,嵌入式,stm32,freertos)