Skip to content

概念先知道

  • 跑分(Benchmark):用标准程序量化 CPU 性能,结果可跨芯片对比。嵌入式最常用的是 CoreMarkDhrystone
  • CoreMark:EEMBC 推出的现代跑分,综合测试列表处理、矩阵运算、状态机与 CRC;结果是 CoreMark/MHz,越接近满分越强。
  • Dhrystone:经典整数运算跑分,结果用 DMIPS(每秒百万条 Dhrystone 指令)和 DMIPS/MHz 表示,反映整数处理能力。
  • 迭代次数自动调整:CoreMark 会先试跑确定迭代数,让总时长落在 10~100 秒区间,避免时间太短测不准。
  • 主频归一化:两个跑分都把分数除以主频(/MHz),这样不同主频芯片可以公平比较。

例程功能简介

本页对应博流官方 SDK 的 coremark_v1.01dhrystone 两个例程:

  • 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 高出不少。跨芯片对比时请保持编译器与优化等级一致。

操作步骤

1
进入 CoreMark 例程目录

在终端进入 SDK 的 CoreMark 例程目录(前提:已按快速开始(Linux)Windows搭建好环境):

cd examples/coremark_v1.01
2
编译 CoreMark

执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:

make CHIP=bl616 BOARD=bl616dk
3
烧录并运行 CoreMark

烧录(make flash CHIP=bl616 COMX=/dev/ttyUSB0),串口助手波特率 2000000。CoreMark 自动跑完一轮(约 10~100 秒),串口打印 CoreMark 1.0 : N / CoreMark/MHz = X.XXX,记录分数。

4
运行 Dhrystone

回到 SDK 根目录,进入 Dhrystone 例程同样编译烧录:

cd examples/dhrystone && make CHIP=bl616 BOARD=bl616dk && make flash CHIP=bl616 COMX=/dev/ttyUSB0
5
对比结果

Dhrystone 串口会打印 Dhrystone Benchmark, Version 2.1DMIPS 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 完整代码
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 完整代码
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)。

Released under the MIT License. Build Time 2026-09-11 14:52:23