首页 > 技术知识 > 正文

FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制,在此之前分析过很多。

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

浅析FreeRTOS实时操作系统的任务通信-浅析太极拳运动的特点

首先创建两个任务

浅析FreeRTOS实时操作系统的任务通信-浅析太极拳运动的特点1

创建2个事件

浅析FreeRTOS实时操作系统的任务通信-浅析太极拳运动的特点2 拉下来也可以配置以下信息,在此我们默认配置

Semaphore Name:信号量名称

Count:计数信号量的最大值

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

Conrol Block Name:控制块名称

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

/*DefinitionsformyTask01*/ osThreadId_tmyTask01Handle; constosThreadAttr_tmyTask01_attributes={ .name=”myTask01″, .stack_size=128*4, .priority=(osPriority_t)osPriorityLow, }; /*DefinitionsformyTask02*/ osThreadId_tmyTask02Handle; constosThreadAttr_tmyTask02_attributes={ .name=”myTask02″, .stack_size=128*4, .priority=(osPriority_t)osPriorityLow, }; /*DefinitionsformyEvent01*/ osEventFlagsId_tmyEvent01Handle; constosEventFlagsAttr_tmyEvent01_attributes={ .name=”myEvent01″ }; /*DefinitionsformyEvent02*/ osEventFlagsId_tmyEvent02Handle; constosEventFlagsAttr_tmyEvent02_attributes={ .name=”myEvent02″ };

这个是创建任务的句柄

/*creationofmyTask01*/ myTask01Handle=osThreadNew(StartTask01,NULL,&myTask01_attributes); /*creationofmyTask02*/ myTask02Handle=osThreadNew(StartTask02,NULL,&myTask02_attributes);

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

/*USERCODEENDHeader_StartTask01*/ voidStartTask01(void*argument) { /*USERCODEBEGINStartTask01*/ /*Infiniteloop*/ osStatus_tos_Status; while(1) { os_Status=osEventFlagsWait(myTask02Handle,/*事件标志组ID*/ COMM2_EVENT,/*等待事件标志位0与事件标志位1*/ osFlagsWaitAny,/*逻辑或*/ osWaitForever/*一直等待*/ ); if(os_Status==COMM1_EVENT) { printf(“startTask02isrunning. “); } } /*USERCODEENDStartTask01*/ } /*USERCODEBEGINHeader_StartTask02*/

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

浅析FreeRTOS实时操作系统的任务通信-浅析太极拳运动的特点3

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

/*USERCODEENDHeader_StartTask02*/ voidStartTask02(void*argument) { /*USERCODEBEGINStartTask02*/ /*Infiniteloop*/ for(;;) { osEventFlagsSet(myEvent01Handle,COMM1_EVENT); osDelay(1); } /*USERCODEENDStartTask02*/ }

审核编辑:刘清

猜你喜欢