使用全局变量实现数据通信(传递)

使用全局变量实现数据通信(传递)

概述

前述讲述了使用全局变量、信号量、事件组、消息队列实现任务间同步。

如前所述,任务间通过通信组件完成通信的目的可以是同步执行流程,也可以是传递数据。本节开始进入到新的讨论话题:任务间数据传输

任务 A 产生的数据可能要传输到任务 B 中进行处理或分析。最简单的方法是使用全局变量进行传输,但如前述在章节 任务同步与消息通信篇概述 中所述的那样,全局变量存在以下问题:
1)覆盖问题,即后写入者覆盖前写入者的数据的问题。

2)双核情况下资源同时访问的问题。

3)读写同步问题,全局变量没有延时等待-通知机制,必须使用其他通信组件完成这种延时等待-通知的机制。如规定全局变量写后,发送信号量通知,才启用一次读。

值的注意的是,这里指的全局变量可以是 基本类型如 int 型变量、也可以是符合类型,如结构体,联合体等。

需求及功能解析

本小节将任务 1 中的值拷贝存储到全局数组中,当拷贝的数据满足一定长度时,通知任务2通过全局变量获取任务1 中的值。

示例解析

示例通过在两任务之间增加延时,模拟该任务执行过程中,被抢占 CPU 的情况。如下所示为任务2获取到的数据,即便通过信号量完成通知任务2读取全局变量,但仍会丢失一部分数据(6、7 后应该是 8,但8被覆盖了,导致该数据被丢失了)。

This is esp32 chip with 2 CPU core(s), WiFi/BT/BLE, Minimum free heap size: 295340 bytes
TASK2: get data=3       4       5
TASK2: get data=6       7       11
TASK2: get data=9       10      14
TASK2: get data=15      16      17
TASK2: get data=18      19      23
TASK2: get data=21      22      26
TASK2: get data=27      28      29
TASK2: get data=30      31      35

讨论

这里的示例比较简单,主要是演示全局变量在使用过程中可能存在的风险。

在最终的综合示例中,可以看到更复杂的数据通信示例:使用循环队列+开关中断+计数信号量实现串口收发中断与多个任务通信的例子。

总结

1)本节主要引出任务间数据传递的议题,并指出全局变量在数据传递中的不足,在后续章节将介绍更多组件的特性。

资源链接

1)Learning-FreeRTOS-with-esp32 系列博客介绍
2)对应示例的 code 链接 (点击直达代码仓库)

3)下一篇:

你可能感兴趣的:(FreeRTOS,freertos,c语言,iot,物联网)