
原创不易,转载请注明出处,互相尊重劳动成果,谢谢!
一. 想法概述 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平台连接通信,降低系统设计的复杂性。
基于目前手上已有的硬件开发板,选择树莓派4b板和STM32H743开发板来搭建上述异构系统。
STM32H743基于Cortex M7内核,主频最高480MHz,片内1M SRAM,基本满足绝大多数的实时控制需求。
该MCU具备很多外设接口,系统中所有涉及到的外设器件,都连接到该MCU上做接口控制。
软件平台采用ThreadX平台,使用包括ThreadX、FileX+LevelX、NetX、USBX等组件,完成系统调度与通信。
树莓派4b的性能数据可网上搜索,资料很多。
两块开发板的连接方式,可采用串口、USB或以太网络,这三种方式都可实现,前期先基于串口连接进行数据互传,后续根据实据传输的数据量及实时要求,再实现网络传输和USB。
4. 开发语言设计目标:覆盖整个系统软件框架的所有涉及的功能与部件,具备信号采集、处理、上传、浏览、查询等功能,且能够基于现有硬件平台最简实现。
第一期功能实现,考虑仅使用两块开发板,不增加额外硬件的前提下,实现数据的实时采样上传,并通过数据流实现数据链路覆盖各个软件模块及功能,前期使用STM32H743片内ADC,实时读取MCU内部温度,通过板间数据通道,传送到树莓派板,并基于Python做简单的低通滤波处理,并将处理后的数据,上传到外部服务器,服务器端判断温度数值,超过设定阈值后下发报警命令,下行通知到树莓派及H743,两块板同步报警,报警方式为闪烁LED灯的简单方式,形成数据闭环。
此外,在树莓派上做BS服务,用户可通过浏览器访问树莓派,实时显示系统状态及当前温度,以及短时温度曲线,后续可做为本地UI通道,实现系统交互控制;服务器端也做BS服务,支持用户查看系统温度、检索历史温度数据及曲线,查看运行状态及报警记录等,后期可做报警时同步通知绑定用户,通知方式可基于微信、短信或邮件;服务器端同时做后台管理界面,支持用户登录后管理系统,配置参数,查看整个系统运行数据看板等功能。
后续功能设计中,可考虑更复杂的数据获取、处理算法、数据挖掘与深度学习框架等,更具体实际产品应用需求,完善软件功能模块,搭建一套实用软件平台框架,准备好应对各类产品需求所需的技术节点储备,实现快速产品化的目标。
二. 环境搭建 1. MCU开发环境MCU开发平台选用IAR 9.2。下载链接:
IAR 9.2 下载页面链接
代码编辑工具选用SourceInsight和Clion,两者功能各有千秋,互补使用。
在Github上,下载ThreadX全家桶代码,包括ThreadX、NetX、FileX和USBX。
ThreadX RTOS的下载地址如下:
Threadx RTOS 源码
ThreadX下载时的最新版本为6.1.11版。下载并解压ThreadX源码,打开ThreadX中基于M7内核的IAR示例工程,工程路径为:
threadx-masterportscortex_m7iarexample_buildazure_rtos.eww
编译其中的 tx 目标,生成ThreadX的RTOS库,供MCU软件框架工程使用,避免每次重新编译时,都花费冗余时间反复编译这些库文件,提高编译效率。
STM32H7 固件库源码
当时下载的最新版本是1.10.0。解压源码后,在例程目录中随便选找一个H743的IAR示例工程,如:
STM32CubeH7-masterProjectsSTM32H743I-EVALApplicationsFreeRTOSFreeRTOS_ThreadCreationEWARMProject.eww
打开后,将工程属性设置为Library,删除工程中的所有应用目录与文件,仅保留Drivers下的CMSIS和STM32HA7xx_HAL_Driver两个目录中的文件,并将固件库中所有LL驱动代码添加进来,源文件位于:
STM32CubeH7-masterDriversSTM32H7xx_HAL_DriverSrc
将目录中的所有 stm32h7xx_ll_xxx.c 文件都加入到工程中,编译生成STLibrary.a库,供MCU软件工程使用。
上述方法是借用一个已配置好的H743工程,改造为ST驱动库,省去工程的一些配置操作。当然也可以全新建一个库工程,包含进所有HAL和LL的驱动文件,并设置相应的目标工程参数,生成所需的驱动库。
void tx_application_define(void *first_unused_memory)
{
UCHAR* pointer = (UCHAR *) first_unused_memory;
InitBoard();
tx_thread_create(&thread_monitor, "threadMonitor", thread_monitor_entry, 0,
pointer, NORMAL_STACK_SIZE,
MONITOR_THREAD_PRIORITY, MONITOR_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
}
在任务实现中,睡眠500毫秒后翻转开发板上LED灯引脚:
void thread_monitor_entry(ULONG thread_input)
{
while(1)
{
LL_GPIO_TogglePin(GPIOH, LL_GPIO_PIN_12);
tx_thread_sleep(500);
}
}
编译、下载、运行,观察LED灯每秒闪烁一次,运行正常。
Raspberry Pi OS 下载
考虑到树莓派仅用做代码开发调试,并不做复杂的应用,所以下载体积较小的第一个版本:
烧写工具
搭建好两个硬件系统的设计、运行环境后,接下来先建立MCU上的软件,实现使用片内ADC进行温度采集与串口传输的功能。
下一篇 ->
基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【二】