如何使用QEMU评估C语言算法在不同ARM嵌入式处理器上的执行性能?
针对Cortex M/A系列的QEMU性能测试简易指南
刚好做过类似的嵌入式性能对比测试,给你梳理一套简单可行的方案,顺便解答你提到的几个核心疑问:
先理清你的几个关键疑问
- Cortex M系列能不能跑Linux? 绝大多数M3/M4是没有MMU的,而标准Linux内核依赖MMU实现虚拟内存、进程隔离等核心功能,所以这些型号跑不了Linux,一般是跑裸机或者轻量RTOS(比如FreeRTOS)。少数高端M7型号带MMU,理论上能跑裁剪版Linux,但不是主流用法。
- QEMU两种模式怎么选?
qemu-user:用户态仿真,不需要模拟整个操作系统,直接在你的Ubuntu主机上运行目标架构的用户程序(比如A系列的Linux可执行文件),设置简单、速度快,适合快速对比性能趋势。qemu-system-arm:全系统仿真,模拟完整的硬件(CPU、内存、外设),更接近真实嵌入式环境,适合裸机/RTOS程序的测试,设置稍复杂,但能模拟M3/M4这类无MMU的硬件。
分步测试指南(分两种场景)
场景1:测试Cortex A系列(支持Linux)
A系列带MMU能跑Linux,用qemu-user最方便:
- 安装交叉编译工具链:
sudo apt install gcc-arm-linux-gnueabihf - 编译你的程序:针对目标A系列CPU(比如Cortex-A53,带双精度FPU),保持和你Ubuntu上一致的优化级别:
arm-linux-gnueabihf-gcc -O2 -mcpu=cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8 your_program.c -o your_program_a53 - 用QEMU运行并统计性能:
用Ubuntu自带的perf工具统计指令数和执行时间,直观对比:
输出里的perf stat qemu-arm ./your_program_a53instructions(总指令数)、task-clock(执行时间)等数据,直接用来做对比参考就行。
场景2:测试Cortex M3/M4(裸机环境)
M系列是裸机环境,需要用qemu-system-arm模拟对应开发板:
- 安装裸机交叉编译工具链:
sudo apt install gcc-arm-none-eabi - 编译裸机程序:
- 针对Cortex-M3(无硬件FPU,double运算全靠软件模拟):
arm-none-eabi-gcc -O2 -mcpu=cortex-m3 -mthumb -mfloat-abi=soft your_program.c -o your_program_m3.elf - 针对Cortex-M4(带单精度FPU,double仍需软件模拟):
arm-none-eabi-gcc -O2 -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 your_program.c -o your_program_m4.elf
- 针对Cortex-M3(无硬件FPU,double运算全靠软件模拟):
- 用QEMU全系统仿真并统计指令:
- 模拟M3:用QEMU支持的
lm3s6965evb开发板:qemu-system-arm -M lm3s6965evb -kernel your_program_m3.elf -d exec -D qemu_m3.log - 模拟M4:用
stm32f407-discovery开发板:qemu-system-arm -M stm32f407-discovery -kernel your_program_m4.elf -d exec -D qemu_m4.log
wc -l qemu_m3.log就能统计近似指令数;如果要更精确的周期计数,可以加-icount参数:
日志里会给出总执行周期数,结合目标CPU的主频(比如M4通常168MHz)就能估算出大致执行时间。qemu-system-arm -M stm32f407-discovery -kernel your_program_m4.elf -icount shift=0 -D qemu_m4_count.log - 模拟M3:用QEMU支持的
关键注意事项
- 优化级别统一:所有测试必须用相同的编译优化级别(比如
-O2),否则对比结果没有意义。 - FPU参数匹配:M3必须用
-mfloat-abi=soft,M4要开启硬件FPU参数,否则会强制软件模拟,结果失真。 - 输入数据一致:测试时用完全相同的输入数据集,确保对比的是同一任务的性能。
- 结果参考性:QEMU仿真的结果是趋势性的,和真实硬件会有误差,但用来选CPU足够——比如A系列的double运算肯定比M3快很多,M4又比M3快,这个性能差异趋势是准确的。
内容的提问来源于stack exchange,提问作者Zhang Li




