原创不易,转载请注明出处,互相尊重劳动成果,谢谢!
一. 想法概述
1. 想法由来
从事嵌入式软件开发多年,涉及许多不同产品需求与应用场景,其间使用了多种不同的软硬件系统与平台,系统的选型始终没法做到构建一个统一成熟的系统来覆盖所有应用,达不到这种一劳永逸的理想状态,选型策略都是围绕满足需求,考虑成本、资源限制、功能复杂度等,而且在产品中基本是生产成本是第一位要考虑的,选型没有最好,只有适合,所以也才有了ST的上百种产品协型号,满足不同的产品需求与成本限制。
随着这几年,在人工智能、云服务、大数据计算等方面的应用增长,越来越多的嵌入式产品也被纳入到这个生态圈中,作为数据采集前端,或底层执行机构,成为了整个系统框架不可或缺的部分,所谓的智能化分析、控制、决策与执行,都离不开底层嵌入式产品或模块的支持。在一些高利润、大规模的产品系统中,模块成本已不是所要考虑的最关键的因素,实现功能、运行性能、长期的可扩展性、可维护性变成了系统架构设计中首要考虑的重要因素,既要满足底层系统的强实时性、高可靠性,又要满足复杂数据分析处理的高性能要求,并能够连接到云服务平台,上传各类实时数据,为更上层的人工智能分析处理提供海量数据,并基于此数据进行数据挖掘与深度学习,进而将智能决策后的控制需求落到实处,准确可靠地及时执行,完成整个智能系统的闭环。
基于以上对未来技术的发展趋势的分析与预测,结合以前的项目经验与开发能力,在自己能够实现的范围内,构建一套能够满足上述需求的软件系统,既能保证实时性与可靠性,又具备一定的复杂数据处理能力与可扩展性,并实现与云平台的数据交互,完成数据采集处理、实时控制、以及决策执行等功能;并能够具备良好的升级控制能力,在硬件升级迭代时,软件也能够方便轻松地迁移到新平台。
2. 系统架构
考虑到目标系统既要满足强实时性,又需要较为复杂的数据处理、存储、传输等功能,较为理想的架构是双核心异构系统,即使用两个不同类型的系统进行互联后组成整个平台,MCU+RTOS 实现强实时方面的控制需求,包括外围各类外设接口等;APU+Linux 实现数据的复杂计算处理、存储、网络传输、远程诊断/维护等业务与服务。两个系统通过高速连接进行数据交互,各司其职,整体组成前端嵌入式产品或模块。
两个系统间的连接方式,取决于相互传输的数据量的大小。
对于一般产品而言,MCU会做必要的前端数据处理,仅处理结果传输到Linux平台做进一步的处理或向云端传输,两个系统间的数据传输与频率均不高,此时可选择串口作为数据传输通道。串口的优点在于处理简单高效,两个系统的串口属于板级连接,物理传输路径很短,可以轻松将传输速率拉升到1~2Mbps,且收发独立的传输方式可实现数据异步传输,满足关键数据的突发与实时传输。
如果有更高数据传输量的需求,可考虑SPI或QSPI接口,传输速率可达数十M甚至百Mbps,但要达到高传输速率的QSPI接口在Linux平台上需要进行优化设计,包括硬件与驱动两方面,设计复杂度较大。
其他接口可选择USB接口,USB HS的传输速率可480Mbps,但需要MCU上支持并实现USB HS接口。此外USB接口并不是工业接口规范,在现场使用时可能会出现掉线情况,且掉线后的自恢复能力并不十分可靠。
还可选择Ethernet接口,两个系统之间使用网络连接通信,数据传输高速可靠,且协议灵活度很高,可满足各类数据复杂传输需求。但最好是Linux平台留出一个专用的网口与MCU平台连接通信,降低系统设计的复杂性。
3. 系统选型
基于目前手上已有的硬件开发板,选择树莓派4b板和STM32H743开发板来搭建上述异构系统。
STM32H743基于Cortex M7内核,主频最高480MHz,片内1M SRAM,基本满足绝大多数的实时控制需求。
该MCU具备很多外设接口,系统中所有涉及到的外设器件,都连接到该MCU上做接口控制。
软件平台采用ThreadX平台,使用包括ThreadX、FileX+LevelX、NetX、USBX等组件,完成系统调度与通信。
树莓派4b的性能数据可网上搜索,资料很多。
两块开发板的连接方式,可采用串口、USB或以太网络,这三种方式都可实现,前期先基于串口连接进行数据互传,后续根据实据传输的数据量及实时要求,再实现网络传输和USB。
4. 开发语言
- C,用于MCU平台上的软件开发
- C/C++,用于Linux上的驱动、业务层软件开发
- Python,用于Linux上数据分析处理算法开发
- JAVA/Konlin,用于Linux上BS架构服务中的WebServer后端服务开发,以及云端服务开发
- JavaScript/TypeScript,用于Linux上BS架构服务中的前端页面开发,以及云端服务的访问页面开发
- C#,用于PC端调试工具及应用软件开发
5. 涉及到的框架
- ThreadX,用于构建嵌入式应用框架
- SpringBoot,用于BS后端服务框架
- VUE+Quasar,用于BS前端页面框架
- Prism,用于C# MVVM软件框架
- DotNetBar WPF,用于C#图形界面开发
6. 开发工具
- MCU 代码编辑工具,使用 SouceInsight 和 CLion 混合使用
- MCU 代码编译、调试工具,使用 IAR
- Linux 代码开发、调试,使用 CLion
- Python 开发、调试,使用 PyCharm
- 后端 Java/Kotlin 开发、调试,使用 IntelliJ IDEA
- 前端 JavaScript/TypeScript 开发、调试,使用 WebStorm
- PC端 C# 开发,使用 Vistual Studio 2022
7. 功能实现
设计目标:覆盖整个系统软件框架的所有涉及的功能与部件,具备信号采集、处理、上传、浏览、查询等功能,且能够基于现有硬件平台最简实现。
第一期功能实现,考虑仅使用两块开发板,不增加额外硬件的前提下,实现数据的实时采样上传,并通过数据流实现数据链路覆盖各个软件模块及功能,前期使用STM32H743片内ADC,实时读取MCU内部温度,通过板间数据通道,传送到树莓派板,并基于Python做简单的低通滤波处理,并将处理后的数据,上传到外部服务器,服务器端判断温度数值,超过设定阈值后下发报警命令,下行通知到树莓派及H743,两块板同步报警,报警方式为闪烁LED灯的简单方式,形成数据闭环。
此外,在树莓派上做BS服务,用户可通过浏览器访问树莓派,实时显示系统状态及当前温度,以及短时温度曲线,后续可做为本地UI通道,实现系统交互控制;服务器端也做BS服务,支持用户查看系统温度、检索历史温度数据及曲线,查看运行状态及报警记录等,后期可做报警时同步通知绑定用户,通知方式可基于微信、短信或邮件;服务器端同时做后台管理界面,支持用户登录后管理系统,配置参数,查看整个系统运行数据看板等功能。
后续功能设计中,可考虑更复杂的数据获取、处理算法、数据挖掘与深度学习框架等,更具体实际产品应用需求,完善软件功能模块,搭建一套实用软件平台框架,准备好应对各类产品需求所需的技术节点储备,实现快速产品化的目标。
二. 环境搭建
1. MCU开发环境
- MCU开发平台选用IAR 9.2。
- 代码编辑工具选用SourceInsight和Clion,两者功能各有千秋,互补使用。
- 在Github上,下载ThreadX全家桶代码,包括ThreadX、NetX、FileX和USBX。
- ST固件库使用LL库开发,提高运行效率,减少HAL库本身出问题引入的不稳定性。不过使用LL库后,基本不再使用ST Cube,所有硬件外设的驱动均基于LL库自行设计实现,除了USB驱动与Ethernet驱动外,这两个外设使用机制较为复杂,仍使用HAL库实现底层访问与操作。
- 下载并安装好上述软件或代码包后,打开ThreadX中的IAR工程,作为MCU的工程框架,并建立ThreadX库工程、STLib工程,编译后放入应用工程中,避免每次花费冗余时间反复编译这些库文件,提高编译效率。
- 在ThreadX创建的起始任务中,添加定时500毫秒翻转LED灯的代码逻辑,编译、下载、运行,观察LED灯每秒闪烁一次,运行正常。
至此,MCU开发平台搭建完成。
2. 树莓派开发环境
3. 其他开发环境
- 安装:
… … 待续
文章出处登录后可见!