概念先知道
- 跑分(Benchmark):用标准程序量化 CPU 性能,结果可跨芯片对比。嵌入式最常用的是 CoreMark 和 Dhrystone。
- CoreMark:EEMBC 推出的现代跑分,综合测试列表处理、矩阵运算、状态机与 CRC;结果是
CoreMark/MHz,越接近满分越强。 - Dhrystone:经典整数运算跑分,结果用 DMIPS(每秒百万条 Dhrystone 指令)和 DMIPS/MHz 表示,反映整数处理能力。
- 迭代次数自动调整:CoreMark 会先试跑确定迭代数,让总时长落在 10~100 秒区间,避免时间太短测不准。
- 主频归一化:两个跑分都把分数除以主频(/MHz),这样不同主频芯片可以公平比较。
例程功能简介
本页对应博流官方 SDK 的 coremark_v1.01 与 dhrystone 两个例程:
coremark_v1.01/main.c调用core_mark()(实现位于core_main.c),运行完整 CoreMark 基准;dhrystone/main.c调用dhrystone_test()(实现位于dhry_1.c),运行经典 Dhrystone 2.1 基准;- 两者都是“烧录即自动跑”,无需串口命令,完成后打印分数并进入死循环;
- 结果可用作芯片选型、超频验证、编译优化开关(-O2/-Os)对比。
提示
跑分结果与编译优化选项强相关:同一芯片开 -O2 通常比 -O0 高出不少。跨芯片对比时请保持编译器与优化等级一致。
操作步骤
在终端进入 SDK 的 CoreMark 例程目录(前提:已按快速开始(Linux)或Windows搭建好环境):
cd examples/coremark_v1.01执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:
make CHIP=bl616 BOARD=bl616dk烧录(make flash CHIP=bl616 COMX=/dev/ttyUSB0),串口助手波特率 2000000。CoreMark 自动跑完一轮(约 10~100 秒),串口打印 CoreMark 1.0 : N / CoreMark/MHz = X.XXX,记录分数。
回到 SDK 根目录,进入 Dhrystone 例程同样编译烧录:
cd examples/dhrystone && make CHIP=bl616 BOARD=bl616dk && make flash CHIP=bl616 COMX=/dev/ttyUSB0Dhrystone 串口会打印 Dhrystone Benchmark, Version 2.1 与 DMIPS per MHz 等结果。CoreMark 分数越高表示综合性能越强,Dhrystone 反映整数运算能力;可与同主频的其他芯片对比。
代码执行流程
CoreMark 从启动到打印分数的流程如下:
例程调用的 API 介绍
core_mark()
CoreMark 基准主函数(core_main.c):初始化便携层、确定种子与迭代数,依次运行列表处理、矩阵、状态机、CRC 测试,最后 ee_printf 打印分数。
参数:无
返回值:无(main.c 中直接调用)
dhrystone_test()
Dhrystone 2.1 基准主函数(dhry_1.c):初始化全局数据后循环执行 Proc_0/Proc_1/Proc_2 核心过程,计时并打印 DMIPS 与 DMIPS/MHz。
参数:无
返回值:无
ee_printf / printf(...)
跑分结果输出函数:CoreMark 用 ee_printf(core_portme.h 重映射),Dhrystone 用标准 printf,结果都打到串口 0。
参数:格式化字符串
返回值:输出字符数
完整代码
以下为两个例程的 main.c 完整源码,与官方示例一致,默认折叠,点击展开(基准实现分别在 core_main.c / dhry_1.c,未贴出):
📜 点击展开 coremark_v1.01/main.c 完整代码
#include "bflb_mtimer.h"
#include "board.h"
extern void core_mark();
int main(void)
{
board_init();
core_mark();
while (1) {
bflb_mtimer_delay_ms(1000);
}
}📜 点击展开 dhrystone/main.c 完整代码
/**
* @file main.c
* @brief
*
* Copyright (c) 2021 Bouffalolab team
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
#include "bflb_mtimer.h"
#include "board.h"
extern void dhrystone_test();
int main(void)
{
board_init();
dhrystone_test();
while (1) {
bflb_mtimer_delay_ms(100);
}
}FAQ
CoreMark 跑很久没出结果?
正常。程序会先试跑把迭代数调到让总时长落在 10~100 秒;若串口一直无输出,检查波特率是否为 2000000、固件是否烧录成功。
分数受什么影响?
主频、编译器优化等级(-O0/-O2/-Os)、是否开启 DSP 扩展指令、运行在 Flash(XIP)还是 RAM 都会影响结果。对比时保持这些条件一致才有意义。
CoreMark 和 Dhrystone 哪个更准?
CoreMark 更贴近现代嵌入式负载(列表/矩阵/状态机/CRC),是行业推荐基准;Dhrystone 偏重纯整数运算,年代久远但被广泛引用(DMIPS)。两个都跑、结合应用场景看更有参考价值。
能用来做超频验证吗?
可以。调高 CPU/PSRAM 时钟后跑 CoreMark,若结果异常或系统复位,说明时序余量不足;但跑分不能替代长期稳定性测试(可配合「内存压力测试」页的 memtester)。

