FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制,在此之前分析过很多。
FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等,本篇主要说一下任务通信,我们选用接口是CMSIS_V2,之前也讲到过stm32CubeIDE中CMSIS_V1和CMSIS_V2选项的区别。
首先创建两个任务
创建2个事件
拉下来也可以配置以下信息,在此我们默认配置
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. "); } } /* USER CODE END StartTask01 */ } /* USER CODE BEGIN Header_StartTask02 */
osEventFlagsWait函数的具体实现以及定义如下
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 */ }
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !