前言
CoreMark是一项测试处理器性能的基准测试。代码使用C语言写成,包含:列举,数学矩阵操作和状态及CRC等运算法则。目前CoreMark已迅速成为测量与比较处理器性能的业界标准基准测试。CoreMark的得分越高,意味着性能更高。在CoreMark的官网上可以大家可以看到各家处理器型号的CoreMark得分。也可以从CoreMark的官网上下载测试代码,亲自测一下自己手中的片子的性能。
移植前准备
在正式移植之前需要准备一个具有uart打印功能和1ms中断周期的定时器(使用systick也可以)。
我这里已经准备好了,并且也对uart进行了printf重定向。
下载CoreMark源代码
CoreMark源代码可以点击上面的链接进入下载:
开始移植
提取CoreMark源代码并添加工程
下载好的源代码有很多文件和文件夹,但是我们需要的只有很少的几个文件,如下:
其中simple文件夹下面有两个文件需要用到。
所有需要的文件整理如下:
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
将如上几个文件添加到工程中,其中core_portme.c和core_portme.h是需要进行修改的文件,我就放在app文件夹下,另外几个文件不需要做修改,就放在coremark文件夹下,同时工程配置中添加文件夹路径,配置好的工程如下:
配置CoreMark文件
我们已经添加了所有需要的文件,但现在程序还是不能正常运行,需要进行一些代码改造。
添加硬件初始化代码
因为core_main.c里面有了一个main函数,所有我们要把我们工程自己的main函数删除,只保留一个main函数,同时需要把硬件初始化代码移到core_main.c的main函数里面去。main函数会先调用portable_init函数来进行相关的初始化,所有我们可以将硬件初始化代码放在portable_init函数的最开始,如下:
修改计时相关代码
start_time/ stop_time/ get_time这几个函数,是coremark程序运行时计算程序运行时间所用。我这里使用TIM1进行计时,中断周期为1ms,重写start_time/ stop_time/ get_time这几个函数。
void
start_time(void)
{
coremark_cnt_clear();
TIM_ClearCounterValue((TIM_Type *)TIM1);
TIM_Start((TIM_Type *)TIM1);
}
void
stop_time(void)
{
TIM_Stop((TIM_Type *)TIM1)
}
CORE_TICKS
get_time(void)
{
CORE_TICKS elapsed
= (CORE_TICKS)get_cormark_cnt();
return elapsed;
}
注释掉不用的宏
CoreMark运行配置
设置迭代次数
CoreMark要求程序运行的最短时间至少是10s, 根据使用的系统时钟等情况,可以在Core_portme.h中修改迭代次数。
#define ITERATIONS 12000
设置打印信息
根据具体所用的编译器版本,优化配置进行修改。
设置优化等级
运行结果
程序已经完全配置好,并编译成功。
现在我们连接MM32F5270开发板,打开串口调试助手,看看运行结果。
每秒运行了400次,比官方提供的coremark数据要高一点,可能与编译器和优化等级有一些关系。
官方跑出来的数据如下:
Profile generation run parameters for coremark.
CoreMark Size : 400
Total ticks : 38377
Total time (secs): 38.377000
Iterations/Sec : 312.687287
Iterations : 12000
Compiler version : GCC 10.3.1
Compiler flags : -0hs -no_size_constraints
Memory location : STACK
seedcrc : 0x4eaf
[0]crclist : 0x6a79
[0]crcmatrix : 0x5608
[0]crcstate : 0xe5a4
[0]crcfinal : 0x8d4c
Correct operation validated. See README.md for run and reporting rules.
done.
原作者:心梦