素材来源:技术让梦想更伟大
作者:李肖遥

FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制,在此之前分析过很多。参考精选汇总 | freertos从基础到高级篇系列

FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等,本篇主要说一下任务通信,我们选用接口是CMSIS_V2,之前也讲到过stm32CubeIDE中CMSIS_V1和CMSIS_V2选项的区别。

MBXY-CR-b56c70ff8c5ef5c08de3ac20289a876e.png

首先创建两个任务 MBXY-CR-99ae3785998b57ea5f67e1102677ea31.png

创建2个事件 MBXY-CR-627defeb06e9a28916b1e703712849d1.png 拉下来也可以配置以下信息,在此我们默认配置


  • Semaphore Name:信号量名称


  • Count:计数信号量的最大值


  • Allocation:分配方式:Dynamic 动态内存创建


  • Conrol Block Name:控制块名称


生成代码之后任务和事件如下

/* Definitions for myTask01 */
osThreadId_t myTask01Handle;
const osThreadAttr_t myTask01_attributes = {
  .name = "myTask01",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityLow,
};
/* Definitions for myTask02 */
osThreadId_t myTask02Handle;
const osThreadAttr_t myTask02_attributes = {
  .name = "myTask02",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityLow,
};
/* Definitions for myEvent01 */
osEventFlagsId_t myEvent01Handle;
const osEventFlagsAttr_t myEvent01_attributes = {
  .name = "myEvent01"
};
/* Definitions for myEvent02 */
osEventFlagsId_t myEvent02Handle;
const osEventFlagsAttr_t myEvent02_attributes = {
  .name = "myEvent02"
};

这个是创建任务的句柄

  /* creation of myTask01 */
  myTask01Handle = osThreadNew(StartTask01, NULL, &myTask01_attributes);

  /* creation of myTask02 */
  myTask02Handle = osThreadNew(StartTask02, NULL, &myTask02_attributes);

我们改写代码,实现task2往task发送信号,实现简单的任务通信。

/* USER CODE END Header_StartTask01 */
void StartTask01(void *argument)
{
    /* USER CODE BEGIN StartTask01 */
    /* Infinite loop */
    osStatus_t os_Status;

   while(1)
   {
    os_Status = osEventFlagsWait(myTask02Handle,   /* 事件标志组ID */
            COMM2_EVENT,       /* 等待事件标志位0与事件标志位1 */
            osFlagsWaitAny,    /* 逻辑或 */
               osWaitForever      /* 一直等待 */
            );
    if(os_Status == COMM1_EVENT)
    {
       printf("startTask02 is running.\r\n");
    }
   }
    /* USER CODE END StartTask01 */
}

/* USER CODE BEGIN Header_StartTask02 */

osEventFlagsWait函数的具体实现以及定义如下

MBXY-CR-0e4e952e3677c9e697dba7caf37b7f61.png

osEventFlagsSet就是往某个任务的句柄发送一个信号,实现如下

/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
   osEventFlagsSet(myEvent01Handle, COMM1_EVENT);
   osDelay(1);
}
/* USER CODE END StartTask02 */
}

本文由编辑推荐,原出处:https://www.eet-china.com/mp/a167051.html