0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

技术让梦想更伟大 来源:技术让梦想更伟大 2023-02-23 09:21 次阅读

FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,十分好用,而且没有任务数限制,在此之前分析过很多了,简单来说,FreeRTOS实时系统能够创建多个独立的任务,并且任务之间互不干扰,为了这一点的实现,每个任务都应该有自己的堆栈空间。当任务进行切换,执行环境则保存到该任务的堆栈中,所以,当一段时间后切换回该任务,它能够精确地回复上次工作时的状态。

之前也汇总了一些教程,参考精选汇总 | freertos从基础到高级篇系列

FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等,本篇主要说一下任务通信,任务创建之后并不是一起运行的,而是通过优先级顺序进行任务的调用来实现的。

轮子也造好了,很多我们可以直接拿来用,ARM Cortex 微控制器软件接口标准是cmsis,且是与供应商无关的硬件抽象层,CMSIS-RTOS是实时操作系统的通用API,简单来说就是将Freertos、Rtthread等操作系统再进行一次封装,形成通用的API函数,目的是使移植更方便。这里我们选用接口是CMSIS_V2,之前也讲到过stm32CubeIDE中CMSIS_V1和CMSIS_V2选项的区别。

3dc91496-b2fc-11ed-bfe3-dac502259ad0.png

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

3e027d80-b2fc-11ed-bfe3-dac502259ad0.png

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

3e303c70-b2fc-11ed-bfe3-dac502259ad0.png

拉下来也可以配置以下信息,在此我们默认配置计数信号量、分配方式、控制块名称等配置信息。

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

/*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函数的具体实现以及定义如下图所示:

3e64a050-b2fc-11ed-bfe3-dac502259ad0.png

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

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

最后就可以实现多个任务间的通信了。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7482

    浏览量

    151015
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9040

    浏览量

    366730
  • 通信
    +关注

    关注

    18

    文章

    5968

    浏览量

    135829
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61992
  • 实时操作系统

    关注

    1

    文章

    196

    浏览量

    30738

原文标题:FreeRTOS 任务间通信,怎么实现?

文章出处:【微信号:技术让梦想更伟大,微信公众号:技术让梦想更伟大】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FreeRTOS介绍与基础任务创建

    本篇介绍FreeRTOS与基础任务创建
    的头像 发表于 09-26 09:00 2336次阅读
    <b class='flag-5'>FreeRTOS</b>介绍与基础<b class='flag-5'>任务</b>创建

    FreeRTOS中的任务管理

    任务FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,优先级高的任务
    的头像 发表于 11-27 17:03 941次阅读

    转:第27章 FreeRTOS任务消息邮箱

    本章节为大家讲解FreeRTOS消息队列(消息队列长度固定为1)的另一种实现方式----基于任务通知(Task Notifications)的消息队列,这里我们将这种方式实现的消息队
    发表于 09-09 07:52

    如何去实现基于stm32的FreeRTOS任务程序

    基于 stm32 的 FreeRTOS任务程序实现一、什么是FreeRTOS二、AHT20数据采集原理电路绘制三、FreeRTOS的多
    发表于 08-24 07:45

    任务通信的目的是什么

    嵌入式操作系统中任务之间的交互与Linux同一进程的不同线程之间的交互完全类似,可以通过全局变量和任务通信机制两种方法来实现。这种交互包括
    发表于 12-24 08:16

    请问ESP32单核如何使用FreeRTOS测试队列进行任务通信

    请问ESP32单核如何使用FreeRTOS测试队列进行任务通信
    发表于 01-14 07:12

    FreeRTOS队列创建任务通信的基本应用程序

    应用程序 : 此代码是 FreeRTOS 队列创建任务通信的基本应用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-
    发表于 08-22 07:12

    FreeRTOS队列创建任务通信的基本应用程序

    应用程序 : 此代码是 FreeRTOS 队列创建任务通信的基本应用程序 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-
    发表于 08-30 07:56

    如何轻松几步实现在STM32上运行FreeRTOS任务

    轻松几步实现在STM32上运行FreeRTOS任务
    的头像 发表于 03-01 12:07 8416次阅读
    如何轻松几步<b class='flag-5'>实现</b>在STM32上运行<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>

    (一)FreeRTOS学习之FreeRTOS任务基础知识

    功能,初学者必须先掌握——任务的创建、删除、挂起和恢复等操作。本章节分为如下几部分:*什么是多任务系统*FreeRTOS任务与协程*初次使用*任务
    发表于 12-23 19:57 3次下载
    (一)<b class='flag-5'>FreeRTOS</b>学习之<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>基础知识

    FreeRTOS任务详解

    详细讲解freeRTOS任务
    发表于 12-23 20:01 11次下载
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>任务</b>详解

    FreeRTOS高级篇2---FreeRTOS任务创建分析

    FreeRTOS基础系列《FreeRTOS系列第10篇---FreeRTOS任务创建和删除》中介绍了任务创建API函数xTaskCreat
    发表于 01-26 17:42 23次下载
    <b class='flag-5'>FreeRTOS</b>高级篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>创建分析

    FreeRTOS系列第11篇---FreeRTOS任务控制

    FreeRTOS任务控制API函数主要实现任务延时、任务挂起、解除任务挂起、任务优先级获取和设置
    发表于 01-26 17:54 12次下载
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>控制

    freeRTOS任务

    freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。
    的头像 发表于 02-10 11:02 1529次阅读
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任务</b>

    FreeRTOS的二值信号量

    FreeRTOS中的信号量是一种任务通信的方式,信号量包括:二值信号量、互斥信号量、计数信号量,本次实验只使用二值信号量。信号量用于任务
    的头像 发表于 02-10 15:07 1453次阅读