[APM32F4] 【APM32F402R Micro-EVB开发板测评】5、CoreMark基准测试及橫向对比

[复制链接]
52|1
slytherinsun 发表于 2025-8-27 19:25 | 显示全部楼层 |阅读模式
本帖最后由 slytherinsun 于 2025-8-28 21:07 编辑

1.概述
MCU的基准测试一般在裸机环境下进行,只需要提供基础的计时及printf打印即可运行CoreMark基准测试。本次移植是在ADC例程中的ADC_TemperatureSensor基础上进行的。首先需要在SDK例程的根目录"APM32F402_403_SDK_V1.0.2\Examples\Board_APM32F402_Tiny"下创建BenchMark文件夹,拷贝ADC_TemperatureSensor例程到BenchMark文件夹下,并修改文件夹名字为CoreMark。

002

002


2.CoreMark基准测试
CoreMark基准测试是ARM公司推荐的一个复杂的现代基准测试,在一定情况下反应了处理器的性能。常用于评估处理器的性能并便于在不同处理器之间进行快速比较。
CoreMark的官网是:https://www.eembc.org/coremark,其测试源码可通过https://www.github.com/eembc/coremark以及https://so.gitee.com/?q=coremark下载。
其源码结构如下图

001

001

除了测试算法的公共文件外,并针对各个平台提供了各自的移植文件,其中在MCU上的移植可以使用barebones文件夹或simple文件夹下的对应移植文件。
网上的教程中多数使用的是simple文件夹中的移植文件。
2.1CoreMark移植
2.1.1CoreMark工程添加
将下载的coremark源码包根目录中的"core_list_join.c","core_main.c","core_matrix.c","core_state.c","core_util.c"文件及"simple"文件夹下的"core_portme.c"文件拷贝到第0步创建的CoreMark工程的"APM32F402_403_SDK_V1.0.2\Examples\Board_APM32F402_Tiny\BenchMark\CoreMark\Source\"路径下,然后将coremark源码包根目录中的"coremark.h"和"simple"文件夹下的"core_portme.h"文件拷贝到CoreMark工程的"APM32F402_403_SDK_V1.0.2\Examples\Board_APM32F402_Tiny\BenchMark\CoreMark\Include\"路径下。如下图:

003

003

004

004

然后打开VSCode,使用EIDE插件导入第1步拷贝的CoreMark中的eclipse工程,并按"【APM32F402R Micro-EVB开发板测评】2、基于VSCode+Arm GNU Toolchain+pyOCD的开发环境搭建"中的步骤配置工程。
在EIDE插件的"项目资源"中添加"虚拟文件夹"并输入文件夹名"CoreMark"。

005

005

然后在"项目资源"中找到刚才新建的"CoreMark"文件夹,右键单击选择"添加文件"

006

006

在新的对话框中找到刚才添加的"core*.c"文件并添加进来。

007

007

2.1.2源代码修改
删除main.c中有关ADC和DMA的代码,并修改main函数为以下内容:
  1. int main(void)
  2. {
  3.     USART_Config_T USART_ConfigStruct;
  4.     /* USART config */
  5.     USART_ConfigStructInit(&USART_ConfigStruct);
  6.     USART_ConfigStruct.baudRate = 115200;
  7.     USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  8.     USART_ConfigStruct.mode = USART_MODE_TX;
  9.     USART_ConfigStruct.parity = USART_PARITY_NONE;
  10.     USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
  11.     USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
  12.     BOARD_COM_Config(COM1, &USART_ConfigStruct);

  13.     SysTick_Config(SystemCoreClock / 1000);

  14.     printf("start run coremark\r\n");
  15.     coremark_main();

  16.     /* Infinite loop */
  17.     while (1)
  18.     {

  19.     }
  20. }
同时在main.h中添加#include "coremark.h"包含。
然后在apm32f402_403_int.c中添加以下内容:
  1. volatile uint32_t SysTickCnt = 0;
  2. void SysTick_Handler(void)
  3. {
  4. ++SysTickCnt;
  5. if(SysTickCnt == UINT32_MAX) {
  6. SysTickCnt = 0;
  7. }
  8. }

  9. uint32_t GetSysTick(void)
  10. {
  11. return SysTickCnt;
  12. }
之后修改core_portme.h中的以下宏定义

#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS \
    "-Ofast" /* "Please put compiler flags here (e.g. -o3)" */
#endif

#ifndef MAIN_HAS_NOARGC
#define MAIN_HAS_NOARGC 1
#endif


然后在core_portme.c中增加extern uint32_t GetSysTick(void);
并修改以下宏定义:
  1. #define NSECS_PER_SEC              1000
  2. #define CORETIMETYPE               uint32_t
  3. #define GETMYTIME(_t)              (*_t = GetSysTick())
之后在coremark.h中定义 #define ITERATIONS 5000
并声明
MAIN_RETURN_TYPE
coremark_main(void);
ITERATIONS是用来控制coremark的迭代次数,直接影响coremark的运行时间,coremark要求至少运行10秒才能得出有效分数。
之后修改core_main.c中的main函数为coremark_main(void)
然后找到ee_printf("Total time (secs): %f\n", time_in_secs(total_time));
并把后面的代码增加Iterations/MHz的计算和打印
  1. #if HAS_FLOAT
  2.     ee_printf("Total time (secs): %f\n", time_in_secs(total_time));
  3.     if (time_in_secs(total_time) > 0) {
  4.         ee_printf("Iterations/Sec   : %f\n",
  5.                   default_num_contexts * results[0].iterations
  6.                       / time_in_secs(total_time));
  7.         ee_printf("Iterations/MHz   : %f\n",
  8.                   default_num_contexts * results[0].iterations
  9.                       / time_in_secs(total_time) / 120);
  10.         }
  11. #else
用来计算并显示CoreMark/MHz分数。
2.2运行CoreMark基准测试
移植后即可将编译完成的代码下载到MCU中运行,等待10-20秒即可看到结果,其中Iterations/Sec对应的是每秒的迭代次数,即当前120MHz频率下的CoreMark基准测试分数,除以频率120即为CoreMark/MHz的分数,本次运行的测试CoreMark/MHz分数为2.498301,对应编译器为GCC10.3.1 20210824,编译优化选项为-Ofast。
  1. start run coremark
  2. 2K performance run parameters for coremark.
  3. CoreMark Size    : 666
  4. Total ticks      : 16678
  5. Total time (secs): 16.678000
  6. Iterations/Sec   : 299.796139
  7. Iterations/MHz   : 2.498301
  8. Iterations       : 5000
  9. Compiler version : GCC10.3.1 20210824 (release)
  10. Compiler flags   : -Ofast
  11. Memory location  : STACK
  12. seedcrc          : 0xe9f5
  13. [0]crclist       : 0xe714
  14. [0]crcmatrix     : 0x1fd7
  15. [0]crcstate      : 0x8e3a
  16. [0]crcfinal      : 0xbd59
  17. Correct operation validated. See README.md for run and reporting rules.
  18. CoreMark 1.0 : 299.796139 / GCC10.3.1 20210824 (release) -Ofast / STACK

8

8

其中使用不同的优化项测试的分数也不同,一般测试想要达到最高分可以使用-Ofast。
3.CoreMark基准测试对比及分析
CoreMark官网上https://www.eembc.org/coremark/scores.php列出了一些MCU和CPU的跑分情况,可以通过筛选来查看与APM32F402R同内核的MCU跑分情况。
通过筛选同内核K40、K60、STM32F4(Cortex-M4)的MCU跑分,经过对比,本次测试APM32F402的2.49CoreMark/MHz分数优于K20和部分K40及STM32F4的CoreMark/MHz分数。同时可以发现基准测试受配置、编译器类型、运行介质等影响较大,且gcc编译器相较IAR、Keil等商业编译器存在一定的性能差距。

9

9

10

10

11

11





真的问题不大 发表于 2025-8-29 14:11 | 显示全部楼层
有看到402的好几个跑分测试帖,数据出来还是蛮不错的,挺能打
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部