2. STM32MP硬件平台与Linux系统基础

STM32MP1 是 ST 推出的异构多核微处理器系列,把 Cortex-A 应用核与 Cortex-M 实时核封装在同一颗芯片内。要在这类平台上做可靠性与压力测试,第一步不是写测试脚本,而是把“硬件资源—BSP—启动链—根文件系统”这条路径看清楚:测试程序最终跑在哪个核、访问哪段内存、依赖哪个驱动、由谁加载,都取决于这条路径。本节围绕 STM32MP157 这一典型型号展开,梳理架构、外设、BSP 结构、启动流程与文件系统布局,为后续的稳定性验证建立参照。

一、异构架构:A7 与 M4 的分工

STM32MP157 内部包含两个 Cortex-A7 核(可组成 SMP 双核)和一个 Cortex-M4 核。A7 侧运行 Linux,负责文件系统、网络、图形与大部分应用;M4 侧通常运行裸机或 RTOS 固件,承担电机控制、实时采样、低延迟中断等任务。两者通过硬件信号量 HSEM、核间中断 IPCC 以及共享内存进行通信,ST 提供的 OpenAMP 框架把 RPMsg 消息机制封装成可用的核间通道。

对可靠性测试而言,这个结构意味着两件事:其一,A7 侧的 Linux 崩溃不一定影响 M4 固件,反之亦然,测试时要分别观察两侧状态;其二,共享内存与 IPCC 是跨核耦合点,长时间高频通信可能暴露同步缺陷,属于压力测试的重点区域。下图给出该平台的资源与启动链关系。

STM32MP157 资源结构与启动链 STM32MP157 SoC Cortex-A7 双核(Linux 域) A7 Core 0 A7 Core 1 MMU / L2 Cache / DDR 控制器 外设总线:UART / ETH / SDMMC / USB Cortex-M4(实时域) M4 固件 / RTOS NVIC / 定时器 外设直连通道 核间耦合点 HSEM 硬件信号量 IPCC 核间中断 共享内存 / RPMsg 启动链(Boot Chain) Boot ROM 固化,选启动源 FSBL TF-A BL2 / DDR 初始化 SSBL U-Boot / 加载内核 Linux Kernel 解压、驱动探测 RootFS + init 挂载、启动用户空间 典型根文件系统布局 /boot /dev /etc /lib /proc /sys /usr /var

二、外设资源与测试关注点

STM32MP157 的外设大致可分为三类。第一类是通用通信外设:多路 UART/USART、I2C、SPI、CAN-FD、以太网 GMAC、USB2.0 OTG,它们通常由 Linux 驱动管理,是压力测试中高频读写、长时间收发的主要对象。第二类是存储与显示相关:SDMMC 接口用于 eMMC/SD 卡,DDR 控制器连接外部内存,LTDC 驱动 RGB 显示,DCMI 接摄像头。第三类是模拟与定时资源:ADC、DAC、多路定时器、看门狗 IWDG/WWDG。

做可靠性验证时,外设不是孤立测试的。例如用 SD 卡反复读写验证文件系统稳定性时,实际同时压到了 SDMMC 控制器、DMA、DDR 带宽和内核块层;用 UART 做长时间收发时,若波特率较高,中断频率会明显上升,可能间接影响其他任务的调度延迟。因此测试设计要明确“主压对象”和“被牵连对象”,否则出现异常时难以定位。

三、Linux BSP 的组成结构

ST 官方 BSP 以 Yocto/OpenEmbedded 为构建框架,源码分布在几个关键仓库中:TF-A(可信固件,含 BL2 和 BL32)、U-Boot(含 SPL 与设备树)、Linux 内核(ST 维护的 stm32mp 分支)、OP-TEE(可选安全世界),以及 OpenEmbedded 元数据层 meta-st-stm32mp。设备树是贯穿其中的核心描述文件,同一份硬件差异通过 stm32mp157c-xxx.dts 与 -u-boot.dtsi 分别向内核和 U-Boot 描述引脚、时钟、电源域与外设使能状态。

一个容易踩坑的点是:U-Boot 阶段和内核阶段使用不同的设备树,引脚复用(pinctrl)配置若只改了一侧,就会出现“U-Boot 里串口正常、进内核后无输出”这类现象。排查时应先确认两侧 dts 是否同步。

四、启动流程与文件系统布局

上电后 Boot ROM 根据 BOOT 引脚选择启动介质,从 SD 卡或 eMMC 的特定偏移读取 FSBL。FSBL 即 TF-A 的 BL2,负责初始化 DDR、时钟和安全环境,随后加载 SSBL(U-Boot)。U-Boot 完成外设初始化后,从存储中读取内核镜像、设备树与 initramfs(若使用),跳转执行内核。内核挂载根文件系统后启动 init 进程,进入用户空间。

典型根文件系统采用只读的 squashfs 或 ext4 作为根分区,配合可写的 data 分区。关键目录的职责如下:/boot 存放内核与设备树;/dev 由 devtmpfs 动态生成设备节点;/proc 与 /sys 是内核暴露的运行状态接口,压力测试中常用它们读取负载、内存与中断统计;/etc 保存启动脚本与服务配置;/usr 与 /lib 存放用户程序与共享库。测试程序一般放在 /usr/bin 或独立分区,日志写入 /var/log 或 data 分区,避免写满只读根分区导致系统异常。

判断启动是否完整,可依次检查:串口是否打印 TF-A 与 U-Boot 版本、内核是否输出 “Run /sbin/init as init process”、登录提示是否出现。若卡在某一阶段,问题范围即可缩小到对应组件。

五、为压力测试建立基线

在开始任何压力测试前,建议先记录一份平台基线:内核版本、设备树名称、DDR 容量与频率、根文件系统类型、各外设的使能状态。下面是一份可直接填写的基线记录示例,字段均对应本节涉及的真实对象。

项目示例值获取方式
芯片型号STM32MP157C丝印 / /proc/device-tree/compatible
内核版本5.15-stm32mpuname -r
设备树stm32mp157c-ev1.dtb/proc/device-tree/model
DDR 容量512 MBfree -m / U-Boot 打印
根文件系统ext4,只读挂载mount | grep " / "
关键外设UART4、ETH1、SDMMC2ls /sys/class/

基线确定后,后续测试中任何指标变化都能与基线对照。例如内存占用从 120 MB 涨到 400 MB,或中断计数在空闲时仍持续增长,都说明存在资源泄漏或异常唤醒,需要进一步定位。把硬件结构、BSP 组成、启动链与文件系统布局串起来理解,才能在测试出现异常时快速判断问题出在哪个层次。