痞子衡嵌入式:如果你嫌MCU板卡工厂验收测试麻烦,不妨试试FATestSuite


  任何一个 MCU 板卡从工厂生产出来一定要过验收测试以确保板卡焊接以及所用元器件功能正常,这就是所谓的 Factory Acceptance Test(工厂验收测试,简称 FAT)。除了工厂自身的必要测试之外,一般 MCU 原厂还需提供 MCU 端测试固件程序让工人在板卡上实际跑一遍功能来进一步确认板卡是否正常(不是 OOB 程序,而是特意设计的能遍历主芯片外围器件功能的 FAT 程序)。今天痞子衡主要讲得就是这部分跟 MCU 原厂相关的验收测试工作。

一、传统FAT方法

  MCU 原厂准备 FAT 程序,传统的方式是基于 SDK 包将板卡涉及的外围器件功能测试全部集成在一个总工程里,然后工人将这个单一程序下载到板卡上运行,并在串口终端里进行手工交互获取测试结果。

  这种传统方式有两大弊端:一、多个功能测试糅杂在一个总工程里,导致这个工程维护比较麻烦,并且多个测试对系统的配置之间可能互相影响,会引入额外的调试工作;二、测试过程在串口终端里交互,对工人不太友好,并且测试结果存档及与具体板卡对应关系需手工完成。

二、全新FATestSuite方式

  FATestSuite 是一个为 i.MX RT 系列板卡全新设计的 FAT 方法,其包含 MCU 端测试固件模板(fat-template-fw)和 PC 端 GUI 工具(MCU-FATestSuite)两部分。我们先来看一下它的测试原理,你就能明白它为什么能解决传统 FAT 的弊端。

  首先基本硬件依赖和传统 FAT 方式一样:板卡,调试器,串口。所不同的是我们将原本一个包含全部测试功能的总工程,变回各自独立的测试子工程(实际上 SDK 里本来就是这样的子工程),这样就省去了额外集成与调试维护工作。现在我们有了多个测试程序,这时候再设计一个上位机软件,让它去逐一加载运行这些测试程序。为了能够让上位机识别单个测试程序运行情况,我们在每个程序里额外加上统一的串口打印内容(如下图代码里标黄部分),上位机获取串口打印结果并识别即可。一轮测试结束,上位机可以自动生成完整的报告。

2.1 特性概述

  MCU-FATestSuite 工具实际上痞子衡已经维护了近 3 年了,第一版 V1.0 于2024年1月份正式发布,当前已经是 V3.x 版本,功能已经比较成熟了:

text 复制代码
01. 支持i.MXRT5xx/7xx/105x/106x/118x
02. 支持J-LINK方式下载程序
03. 支持调试器类型以及SN号选项
04. 支持多测试用例程序的自动检测、下载和执行
05. 支持串口方式交互程序执行结果
06. 支持若干用户配置选项(jlink设置、串口交互字符、程序加载等待时间、执行结果等待时间)
07. 支持用户芯片与板卡选项
08. 支持板卡序列号文本框输入(被用于测试结果文件名)
09. 支持用户自定义板卡文件夹(放置测试用例程序)
10. 对于测试用例程序需要人工判定结果的情况,弹框交互确定结果
11. 一轮测试结束,自动保存测试结果进EXCEL/TEXT文件(./report目录下)

2.2 MCU端测试固件模板

  测试用例可以基于 SDK 里的现有例程,仅需小小代码改动,然后工程换成在内部 SRAM 执行的链接文件生成 .srec 文件(注意无需任何 boot header,就是裸 CM 程序,镜像内容一开始应该是 ARM 中断向量表),并将该镜像文件放到上位机工具 \MCU-FATestSuite\src\targets\对应芯片以及板卡的文件夹目录下即可。

text 复制代码
测试固件模板地址 https://github.com/JayHeng/imxrt-fat-template-fw
IDE版本:IAR EWARM v9.70.3

  固件模板主要就 \imxrt-fat-template-fw\templates\fat_src 里两个源文件,将其添加进 SDK 里例程工程里,并在适当地方调用如下接口:

C 复制代码
// 对于例程自身能直接判断结果的情况,delay_Time_s 参数设 0
// 对于例程需要人工来判断结果的情况,delay_Time_s 参数设非 0
//   - 上位机 V2.x 以下真实延时,以便人工观察,结果也由人工额外记录
//   - 上位机 V3.x 开始弹窗让用户反馈结果,此时延时时间不重要,由弹窗反馈交互决定
void FAT_MagicStart(uint32_t delayTime_s);
// 放到代码里最后判定运行正常的地方;如果结果需要人工判定,则无所谓
void FAT_MagicPass(void);
// 放到代码里所有出现异常结果的地方
void FAT_MagicFail(void);

2.3 PC端GUI工具

  整个设计里 PC 端工具是核心,这里主要介绍一下上位机工具的使用。工具本身是基于 Python 3.11 开发的,但是最终用了 PyInstaller 打包成了 EXE,运行时并不依赖 Python 环境。代码也是开源的,大家可以二次开发。

text 复制代码
工具地址 https://github.com/JayHeng/MCU-FATestSuite
2.3.1 基本使用步骤

  当前上位机版本 V3.x 主要支持 J-Link 调试器,在使用工具前需要确保安装了 J-Link 驱动以及芯片支持包(Device Patch),确保能够使用 J-Link Commander 连接上主芯片。 上位机工具使用起来步骤很简单,便于普通工人操作,没有学习成本。

text 复制代码
1. 双击 \bin\MCU-FATestSuite.exe 打开软件
2. 假定加载方式选J-Link,点击 'Browse' 设置正确的 JLINK.exe 路径
3. 假定测试得 MIMXRT700-EVK('MCU Device'、'MCU Board'作相应设置)
   将所有测试程序(.srec格式)放置在 \src\targets\MIMXRT700\FRDM_Rev.A_SCH-96317\ 目录下
4. 在 'Board SN' 里写入当前板卡唯一识别号
 
板卡上电 / 换新一块板卡
5. 点击 'Reset Test Result' 按钮
6. 点击 'Open' 按钮打开串口(确保串口号与板卡对应),确保状态变为 'Close'
7. 点击 'Detect Test Cases' 按钮扫描测试程序
8. 点击 'Run Test Cases' 按钮开始跑,按钮黄色说明正在跑
 
重复 5、6、7、8

9. 每一轮测试均会在 \report\ 下生成 .text 和 .excel 测试结果报告
2.3.2 用户配置项

  上位机同时也提供了一些用户配置项,在 \MCU-FATestSuite\src\targets\xxDevice\fattargetconfig.py 文件中,配置是动态加载的,无需重新编 EXE。这里最需要特别关注的是 waitAppTimeout 配置,如果测试用例是一个能够自我判定结果的情况,但是需要很长时间才能返回结果,那么就需要调整这里的设置值。

py 复制代码
# 连接 J-Link 时的配置
jlinkDevice     = 'MIMXRT798S_M33_0'
jlinkInterface  = 'SWD'
jlinkSpeedInkHz = 4000

# 程序中串口数据刷新间隔(thread进程重入时间)
uartRecvInterval = 0.5  # seconds

# 测试程序APP与工具接头字符
fatLogStart = 'FAT FW Start'
fatLogPass  = 'FAT FW Pass'
fatLogFail  = 'FAT FW Fail'
fatLogDelay = ' DelayTime='

# 从调用 J-Link 加载程序开始到接收到 fatLogStart 的最大等待时间
loadAppTimeout    = 5.0  # seconds
# loadAppTimeout 时间内未收到 fatLogStart,重复调用 J-Link 加载程序次数,失败返回 LOAD-FAIL 测试结果
loadAppRetryCount = 3

# 从接收到 fatLogStart 开始到接收到 fatLogPass/fatLogFail 的最大等待时间,超时可返回 RUN-TIMEOUT 测试结果
waitAppTimeout    = 10.0 # seconds