本帖最后由 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
2.CoreMark基准测试
CoreMark基准测试是ARM公司推荐的一个复杂的现代基准测试,在一定情况下反应了处理器的性能。常用于评估处理器的性能并便于在不同处理器之间进行快速比较。
CoreMark的官网是:https://www.eembc.org/coremark,其测试源码可通过https://www.github.com/eembc/coremark以及https://so.gitee.com/?q=coremark下载。
其源码结构如下图
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
004
然后打开VSCode,使用EIDE插件导入第1步拷贝的CoreMark中的eclipse工程,并按"【APM32F402R Micro-EVB开发板测评】2、基于VSCode+Arm GNU Toolchain+pyOCD的开发环境搭建"中的步骤配置工程。
在EIDE插件的"项目资源"中添加"虚拟文件夹"并输入文件夹名"CoreMark"。
005
然后在"项目资源"中找到刚才新建的"CoreMark"文件夹,右键单击选择"添加文件"
006
在新的对话框中找到刚才添加的"core*.c"文件并添加进来。
007
2.1.2源代码修改
删除main.c中有关ADC和DMA的代码,并修改main函数为以下内容:
- int main(void)
- {
- USART_Config_T USART_ConfigStruct;
- /* USART config */
- USART_ConfigStructInit(&USART_ConfigStruct);
- USART_ConfigStruct.baudRate = 115200;
- USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
- USART_ConfigStruct.mode = USART_MODE_TX;
- USART_ConfigStruct.parity = USART_PARITY_NONE;
- USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
- USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
- BOARD_COM_Config(COM1, &USART_ConfigStruct);
- SysTick_Config(SystemCoreClock / 1000);
- printf("start run coremark\r\n");
- coremark_main();
- /* Infinite loop */
- while (1)
- {
- }
- }
同时在main.h中添加#include "coremark.h"包含。
然后在apm32f402_403_int.c中添加以下内容:
- volatile uint32_t SysTickCnt = 0;
- void SysTick_Handler(void)
- {
- ++SysTickCnt;
- if(SysTickCnt == UINT32_MAX) {
- SysTickCnt = 0;
- }
- }
- uint32_t GetSysTick(void)
- {
- return SysTickCnt;
- }
之后修改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);
并修改以下宏定义:
- #define NSECS_PER_SEC 1000
- #define CORETIMETYPE uint32_t
- #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的计算和打印
- #if HAS_FLOAT
- ee_printf("Total time (secs): %f\n", time_in_secs(total_time));
- if (time_in_secs(total_time) > 0) {
- ee_printf("Iterations/Sec : %f\n",
- default_num_contexts * results[0].iterations
- / time_in_secs(total_time));
- ee_printf("Iterations/MHz : %f\n",
- default_num_contexts * results[0].iterations
- / time_in_secs(total_time) / 120);
- }
- #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。
- start run coremark
- 2K performance run parameters for coremark.
- CoreMark Size : 666
- Total ticks : 16678
- Total time (secs): 16.678000
- Iterations/Sec : 299.796139
- Iterations/MHz : 2.498301
- Iterations : 5000
- Compiler version : GCC10.3.1 20210824 (release)
- Compiler flags : -Ofast
- Memory location : STACK
- seedcrc : 0xe9f5
- [0]crclist : 0xe714
- [0]crcmatrix : 0x1fd7
- [0]crcstate : 0x8e3a
- [0]crcfinal : 0xbd59
- Correct operation validated. See README.md for run and reporting rules.
- CoreMark 1.0 : 299.796139 / GCC10.3.1 20210824 (release) -Ofast / STACK
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
10
11
|