You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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最方便:

  1. 安装交叉编译工具链
    sudo apt install gcc-arm-linux-gnueabihf
    
  2. 编译你的程序:针对目标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
    
  3. 用QEMU运行并统计性能
    用Ubuntu自带的perf工具统计指令数和执行时间,直观对比:
    perf stat qemu-arm ./your_program_a53
    
    输出里的instructions(总指令数)、task-clock(执行时间)等数据,直接用来做对比参考就行。

场景2:测试Cortex M3/M4(裸机环境)

M系列是裸机环境,需要用qemu-system-arm模拟对应开发板:

  1. 安装裸机交叉编译工具链
    sudo apt install gcc-arm-none-eabi
    
  2. 编译裸机程序
    • 针对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
      
    (如果你的程序是纯数据处理、不需要外设,这样简单编译成ELF就能在QEMU里运行,不用额外的链接脚本或启动文件)
  3. 用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参数:
    qemu-system-arm -M stm32f407-discovery -kernel your_program_m4.elf -icount shift=0 -D qemu_m4_count.log
    
    日志里会给出总执行周期数,结合目标CPU的主频(比如M4通常168MHz)就能估算出大致执行时间。

关键注意事项

  • 优化级别统一:所有测试必须用相同的编译优化级别(比如-O2),否则对比结果没有意义。
  • FPU参数匹配:M3必须用-mfloat-abi=soft,M4要开启硬件FPU参数,否则会强制软件模拟,结果失真。
  • 输入数据一致:测试时用完全相同的输入数据集,确保对比的是同一任务的性能。
  • 结果参考性:QEMU仿真的结果是趋势性的,和真实硬件会有误差,但用来选CPU足够——比如A系列的double运算肯定比M3快很多,M4又比M3快,这个性能差异趋势是准确的。

内容的提问来源于stack exchange,提问作者Zhang Li

火山引擎 最新活动