这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » FreeRTOS互斥信号量使用

共1条 1/1 1 跳转至

FreeRTOS互斥信号量使用

工程师
2025-05-19 15:34:42     打赏

1、简介

互斥信号量和信号量有着相同的作用,不同的是前者具备优先级继承机制,可以最大化减小优先级翻转的缺陷。

2CubeMX配置

创建Mutex互斥信号量

image.png

同时创建4个任务,其优先级设置如下,用于验证互斥信号量的作用。LowTask用于访问临界资源,而MidTask1/2不涉及对临界资源的访问,仅是优先级高于LowTaskHighTask用于访问临界资源,在4个任务中优先级为最高。

image.png

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

image.png





关键词: 互斥信号量    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]