关注、星标公众号,直达精彩内容

素材来源:技术让梦想更伟大

作者:李肖遥

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,如下图所示:

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

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

/* Definitions for myTask01 */
osThreadId_t myTask01Handle;
const osThreadAttr_t myTask01_attributes = {.name = "myTask01",.stack_size = 128 * 4,.priority = (osPriority_t) osPriorityLow,
};
...
/* 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函数的具体实现以及定义如下图所示:

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 */
}

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

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

FreeRTOS 任务间通信,怎么实现?相关推荐

  1. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

  2. Go中协程间通信的方式Sync.Cond

    在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...

  3. Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信

    上一讲我们学习了 Ribbon 与 RestTemplate 两个组件.Ribbon 提供了客户端负载均衡,而 RestTemplate 则封装了 HTTP 的通讯,简化了发送请求的过程.两者相辅相成 ...

  4. 容器间通信_Vue组件间通信的6种方式,前端工程师人人都会,网友:太简单了...

    Vue 组件间通信只要指以下 3 类通信:父子组件通信.隔代组件通信.兄弟组件通信,下面分别介绍每种通信方式且会说明此种方法可适用于哪类组件间通信. (1)props / $emit 适用 父子组件通 ...

  5. Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问

    前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址.Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Over ...

  6. 深入解析Vue组件间通信

    React的基本组件元素是一个个组件,组件之间可能存在关联.组合等关系.不同的组件之间,经常会发生数据传递或者交换,我们称之为组件间通信. 根据传递的复杂程度,可以分为三种情况: 父子间通信,兄弟间通 ...

  7. 三层交换不同VLAN间通信

    注意: 1)多VLAN间通信必须在每个交换机上创建所有需要互通pc所属的VLAN的PVID(标识符) 2)多VLAN间的通信用trunk模式的链路类型连接相邻的交换机,允许所有VLAN通过:连接客户端 ...

  8. 微信小程序页面间通信的5种方式

    微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...

  9. Java并发——线程间通信与同步技术

    传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...

最新文章

  1. LLVM笔记(5) - SMS
  2. 【Codeforces 986B】Petr and Permutations
  3. ROS知识:关于如何命名的约定
  4. Ubuntu 开机自动执行脚本
  5. sublime的Fatal pylint error: UnicodeDecodeError: 'ascii' codec can't decode byte 问题解决方案
  6. Nginx 的线程池与性能剖析【转载】
  7. python并发编程4-线程
  8. AE学习笔记——第二章:AE图层中的图层用法及基本操作
  9. java里类包含对象对不对_Java类中的对象
  10. 汉字笔顺口诀_【小学语文知识】汉字书写笔顺口诀+书写规则
  11. 8.1并发集合(Concurrent Collections)
  12. linux数组删除数据,如何从shell数组中删除一个元素
  13. MacOS Big Sur 11.2.2 (20D80) With and OC 0.6.7 原版DMG黑苹果镜像
  14. 在进化计算中,软件进行元基编码的新陈代谢方式 V0. 1. 1
  15. 取回Apple TV遥控器的D-Pad
  16. 最新GraphPad Prism Mac直装版(医学绘图软件)v9.4.1
  17. 苹果指责三星收高版税:三星说苹果抄我们的
  18. python+百度地图 实现地址转换为经纬度(全网最简单方法)
  19. 使用EggJS开发接口(三)登录验证之egg-jwt 及 crypto加密
  20. 使用canvas制作背景水印

热门文章

  1. 最近抽了点时间做了个Android电子书一键生成器
  2. html发送邮件代码主题主题乱码,Java发送邮件时标题和发件人乱码
  3. WWDC2014之App Extensions (App功能共享)
  4. c语言开发物业收费程序,C语言程序的设计_物业管理系统方案
  5. 简记_如何使用立创商城的原理图符号及封装
  6. CAD文字转换为Revit注释文字
  7. node的下载及安装
  8. 计算机专业需要留学吗,美国留学申请计算机专业需要什么条件
  9. 360区块猫,领一个吧
  10. java hive和hbase整合,Hive入门3–Hive与HBase的整合