3、测试环境搭建:硬件平台选型与BSP配置

做性能基准测试,第一步就是搭台子。台子搭不好,后面测出来的数据全是废的。我这些年踩过的坑,有一半都出在环境搭建阶段。今天咱们就聊聊瑞萨R-Car和高通SA8295这两个主流平台,以及QNX BSP怎么配、调试口怎么连。

3.1 硬件平台选型:瑞萨R-Car vs 高通SA8295

选哪个平台,其实取决于你的项目定位。我个人习惯把这两个平台分开看:

对比项 瑞萨R-Car H3/M3 高通SA8295
CPU架构 Cortex-A57 + A53 Kryo 680 (Cortex-X1 + A78)
GPU PowerVR GX6650 Adreno 660
典型应用 仪表盘、AVM 中控、副驾屏、多屏互动
QNX BSP成熟度 非常成熟 较新,但生态在快速完善
性能基准测试关注点 实时性、中断延迟 多核吞吐、GPU渲染

我在项目中遇到过一个问题:用R-Car做仪表盘,中断延迟要求小于50微秒。当时BSP里默认的irq affinity没配好,导致中断全挤在CPU0上。嗯,这个后面会细说。

我的建议:如果项目偏重安全域(仪表、ADAS),优先选R-Car。如果偏重娱乐域(中控、后排屏),SA8295更合适。当然,现在也有不少方案是两者混用。

3.2 QNX BSP配置要点

拿到开发板之后,第一件事不是跑benchmark,而是把BSP配稳。你想想看,BSP都不稳,测出来的数据谁敢信?

3.2.1 内核配置

QNX的BSP配置主要在buildfile里。我一般会关注这几个参数:

# 典型的buildfile片段
[+image]
[virtual=armv8,raw] .bootstrap = {
    startup-rcar.elf
    path = /proc/boot
}

[+script] .script = {
    # 设置CPU频率为最高性能模式
    devc-rcar-cpufreq -f 1500000
    
    # 关闭CPU节能特性
    cpumap -d 0 -p 0x0
    
    # 配置中断亲和性
    intr -a 0x1
}

这里有个坑:cpumap的参数别搞错。我曾经有一次把掩码写反了,结果CPU3一直没被调度,性能直接掉了25%。排查了一整天才发现。

注意:SA8295的BSP配置和R-Car不太一样。高通的平台有独立的PMM(Power Management Module),需要在qnx-ipc层额外配置DVFS策略。否则跑benchmark时,CPU频率会忽高忽低。

3.2.2 内存与缓存配置

性能测试最怕什么?内存带宽不够。我建议在BSP里显式配置L2/L3缓存策略:

# 在buildfile中配置缓存
[+type=armv8] .cache = {
    # 设置L2缓存为写回模式
    cache -t l2 -m write-back
    
    # 禁用L3缓存预取(避免干扰测试结果)
    cache -t l3 -p disable
}

为什么要禁用预取?因为有些benchmark工具(比如CoreMark)对预取很敏感,开了预取分数会虚高。我们要的是真实性能,不是跑分好看。

3.3 调试串口与网络连接

环境搭好了,怎么跟板子通信?两个途径:串口和网络。

3.3.1 调试串口

串口是救命用的。系统起不来的时候,只有串口能给你输出。我一般这样配:

# 串口参数(以R-Car为例)
波特率:115200
数据位:8
停止位:1
校验:无
流控:无

# 在buildfile中启用串口
devc-serrcar -b 115200 -e -F -S -c 0xE6E60000/0x20

嗯,这里要注意:-F参数是关闭FIFO。为什么?因为FIFO会缓存数据,导致你按Ctrl+C时系统不能及时响应。调试阶段我建议关掉。

小技巧:用screen或者minicom连串口时,加上-L参数可以记录日志。我每次测试都会把串口日志存下来,方便事后复盘。

3.3.2 网络连接

网络是传数据用的。跑benchmark时,结果文件动不动就几十MB,靠串口传得等到猴年马月。

我建议用静态IP,别用DHCP。为什么?因为有些测试环境没有DHCP服务器,或者分配IP太慢,影响自动化脚本的执行。

# 在buildfile中配置静态IP
io-pkt-v6-hc -d rcar_ether -p tcpip
ifconfig rcar_ether 192.168.1.100 netmask 255.255.255.0 up
route add default 192.168.1.1

SA8295的网络配置稍微复杂一点,因为它用的是PCIe转以太网:

# SA8295网络配置
io-pkt-v6-hc -d qnx_pcie_eth -p tcpip
waitfor /dev/io-pkt
ifconfig qnx_pcie_eth0 192.168.1.101 netmask 255.255.255.0 up

曾经踩过的坑:SA8295的PCIe网卡驱动在QNX 7.1上有个bug,网络吞吐量只有理论值的30%。后来发现是中断处理函数里有个spinlock没释放。解决办法是升级到BSP 1.2.3版本以上。

3.4 环境验证 checklist

配置完了,别急着跑测试。先验证一下环境是否正常:

  1. 串口通信:重启板子,看串口能否正常输出启动日志
  2. 网络连通:从主机ping板子,延迟应小于1ms
  3. CPU频率:用hw-cpuinfo命令查看当前频率是否为目标值
  4. 内存带宽:跑一下memtest,确认带宽在预期范围内
  5. 中断分布:用intr -v查看中断是否均匀分布在各个CPU上

这五步走完,环境才算真正搭好。我见过太多人跳过验证直接跑benchmark,结果数据异常了还找不到原因。

一句话总结:硬件选型看项目定位,BSP配置要稳不要花哨,串口和网络是调试的两条腿,缺一不可。环境验证不是浪费时间,是在帮你省钱。