FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,十分好用,而且没有任务数限制,在此之前分析过很多了,简单来说,FreeRTOS实时系统能够创建多个独立的任务,并且任务之间互不干扰,为了这一点的实现,每个任务都应该有自己的堆栈空间。当任务进行切换,执行环境则保存到该任务的堆栈中,所以,当一段时间后切换回该任务,它能够精确地回复上次工作时的状态。
之前也汇总了一些教程,参考精选汇总 | freertos从基础到高级篇系列
FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等,本篇主要说一下任务通信,任务创建之后并不是一起运行的,而是通过优先级顺序进行任务的调用来实现的。
轮子也造好了,很多我们可以直接拿来用,ARM Cortex 微控制器软件接口标准是cmsis,且是与供应商无关的硬件抽象层,CMSIS-RTOS是实时操作系统的通用API,简单来说就是将Freertos、Rtthread等操作系统再进行一次封装,形成通用的API函数,目的是使移植更方便。这里我们选用接口是CMSIS_V2,之前也讲到过stm32CubeIDE中CMSIS_V1和CMSIS_V2选项的区别。

首先创建两个任务myTask01和myTask02,如下图所示:

创建2个事件myEvent01,myEvent02,如下图所示:

拉下来也可以配置以下信息,在此我们默认配置计数信号量、分配方式、控制块名称等配置信息。
生成代码之后任务和事件如下代码:
/*DefinitionsformyTask01*/ osThreadId_tmyTask01Handle; constosThreadAttr_tmyTask01_attributes={ .name="myTask01", .stack_size=128*4, .priority=(osPriority_t)osPriorityLow, }; ... /*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函数的具体实现以及定义如下图所示:

osEventFlagsSet就是往某个任务的句柄发送一个信号,实现如下
/*USERCODEENDHeader_StartTask02*/
voidStartTask02(void*argument)
{
/*USERCODEBEGINStartTask02*/
/*Infiniteloop*/
for(;;)
{
osEventFlagsSet(myEvent01Handle,COMM1_EVENT);
osDelay(1);
}
/*USERCODEENDStartTask02*/
}
最后就可以实现多个任务间的通信了。
-
微控制器
+关注
关注
48文章
8249浏览量
162265 -
ARM
+关注
关注
135文章
9499浏览量
388551 -
通信
+关注
关注
18文章
6314浏览量
139537 -
FreeRTOS
+关注
关注
14文章
497浏览量
66327 -
实时操作系统
+关注
关注
1文章
206浏览量
31790
原文标题:FreeRTOS 任务间通信,怎么实现?
文章出处:【微信号:技术让梦想更伟大,微信公众号:技术让梦想更伟大】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
FreeRTOS中的任务管理
转:第27章 FreeRTOS任务消息邮箱
如何去实现基于stm32的FreeRTOS多任务程序
FreeRTOS队列创建任务间通信的基本应用程序
FreeRTOS队列创建任务间通信的基本应用程序
(一)FreeRTOS学习之FreeRTOS任务基础知识
FreeRTOS系列第11篇---FreeRTOS任务控制

FreeRTOS任务间通信,怎么实现?
评论