1 CoreMark简介
CoreMark是由EEMBC(Embedded Microprocessor Benchmark Consortium)的Shay Gla-On于2009年提出的一项基准测试程序,CoreMark的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。
目前在嵌入式CPU行业中普遍公认的性能测试指标的标准主要使用以下三种,MIPS、Dhrystone、Coremark,而CoreMark与Dhrystone一样,拥有体积小、方便移植、易于理解、免费并且显示单个数字基准分数。与Dhrystone不同的是,Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是实际MCU或CPU的能力,的性能,而CoreMark具有特定的运行和报告规则,从而可以避免由于所使用的编译库不同而导致的测试结果难以比较。
官网地址:
https://www.eembc.org/coremark/index.php
https://github.com/eembc/coremark
2 CoreMark移植
笔者这里使用STM32来演示。
2.1 CoreMark源码下载
首先去CoreMark 官网下载CoreMark源码。
CoreMark 移植所需的如下:
- core_list_join.c
 - core_main.c
 - core_matrix.c
 - core_state.c
 - core_util.c
 - coremark.h
 - simple/core_portme.c
 - simple/core_portme.h
 
2.2 移植CoreMark
1)拷贝CoreMark文件到工程
准备一个STM32工程,将CoreMark所需的文件添加放到工程目录中。
2)添加文件到工程
接下来要做的就是添加 CoreMark 代码。因为 core_main.c 文件里已经包含了一个 main 函数,所以需要在工程中将默认创建的 main.c 文件删除。
完成后的工程文件结构如下:
2.3 配置 Coremark 文件
我们需要在 core_portme.c 中添加初始化的代码,并根据不同的计时方法修改 core_portme.c 中计时相关函数和代码。
2.3.1 添加初始化代码
core_portme.c 中的 portable_init 函数在 core_main.c 的 main 函数中首先被调用, 平台的初始化的函数(时钟,GPIO,串口,缓存) 可以放在这里。
修改前:
void portable_init(core_portable *p, int *argc, char *argv[])
{
    (void)argc; // prevent unused warning
    (void)argv; // prevent unused warning
    if (sizeof(ee_ptr_int) != sizeof(ee_u8 *))
    {
        ee_printf(
            "ERROR! Please define ee_ptr_int to a type that holds a "
            "pointer!\\n");
    }
    if (sizeof(ee_u32) != 4)
    {
        ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\\n");
    }
    p->portable_id = 1;
}
修改后:
void portable_init(core_portable *p, int *argc, char *argv[])
{
    ST_BSP_USART_Dev BSP_USART_Dev0 = USART_DEV0_CONFIG;
    /* Configure the NVIC Preemption Priority Bits */  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    /* USART1 配置模式为 115200 8-N-1,中断接收 */
    BSP_USART_Init(&BSP_USART_Dev0, 115200, 0, 1);
    printf("The CoreMark is runing,Please Wait...\\r\\n");
    if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
        ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\\n");
    }
    if (sizeof(ee_u32) != 4) {
        ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\\n");
    }
    p->portable_id=1;
}
2.3.2 修改计时相关代码
start_time/ stop_time/ get_time 这几个函数是 coremark 程序运行时计算程序运行时间所用。 这里使用 system tick 进行计时, system tick 配置为 1ms 的中断间隔。 system tick 中断函数中更新 Tick 的值,每进一次中断加 1。所以还需要修改system tick 的中断处理函数。
1)在 core_portme.c 中按下表找到需要修改的地方。

2) 在 core_portme.c 文件中添加新定义的变量和函数
#define SysTick_Counter_Disable ((uint32_t)0xFFFFFFFE)
#define SysTick_Counter_Enable ((uint32_t)0x00000001)
#define SysTick_Counter_Clear ((uint32_t)0x00000000)
__IO uint32_t Tick;
system tick 的中断处理函数在 stm32f10x_it.c 中。stm32f10x_it.c 文件包含所有中断处理入口函数。根据不同的平台, 这个文件的名字稍有不同。找到 SysTick_Handler 函数进行修改。
修改前:
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
}
修改后:
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
    extern __IO uint32_t Tick;
    Tick++;
}
2.3.3 CoreMark 运行配置
1)设置迭代次数
CoreMark 要求程序运行的最短时间至少是 10s, 根据使用的系统时钟等情况,可以在 core_portme.h 中修改迭代次数。
#define ITERATIONS 12000
2)设置打印信息
对编译器版本和编译器参数进行定义。这2个宏不会影响跑分结果,只是coremark在打印评测结果的时候会输出定义的值。
修改前:
#ifndef COMPILER_VERSION
#ifdef __GNUC__
#define COMPILER_VERSION "GCC"__VERSION__
#else
#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)"
#endif
#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS FLAGS_STR /*
"Please put compiler flags here (e.g. -o3)"
*/
#endif
修改后
#ifndef COMPILER_VERSION
#ifdef __GNUC__
#define COMPILER_VERSION "GCC"__VERSION__
#else
#define COMPILER_VERSION "ARMCC 5.06"
#endif
#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS "-O3"
#endif
3) 修改优化等级。
Options->C/C++ ->Optimization, 选择O3以达到最优的运行速度。
3 运行结果
接上串口,复位打印信息如下:
STM32F103
STM32F429
GD32F2
- 
                                测试
                                +关注
关注
8文章
5283浏览量
126605 - 
                                嵌入式
                                +关注
关注
5082文章
19111浏览量
304847 - 
                                cpu
                                +关注
关注
68文章
10855浏览量
211605 - 
                                编译
                                +关注
关注
0文章
657浏览量
32853 - 
                                Cortex-M
                                +关注
关注
2文章
229浏览量
29754 
发布评论请先 登录
相关推荐
ARM Cortex-M的音频性能解析
    
为什么说Cortex-M是低功耗应用的首选
    
如何选择正确的Cortex-M处理器?
ARM Cortex-M处理器详解 精选资料分享
Arm Cortex-M处理器—Cortex-M85介绍
【ARM白皮书】ARM Cortex-M处理器入门
米尔科技Cortex-M Prototyping System +介绍
    
          
        
        
基于Cortex-M的CoreMark性能测试
 
    
    
    
           
            
            
                
            
评论