本帖最后由 yuyy1989 于 2023-8-24 09:24 编辑
#申请原创# @21小跑堂
CoreMark是由EEMBC的Shay Gla-On于2009年提出的一项基准测试程序,CoreMark的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好,接下来以CW32F030为例介绍如何使用CoreMark来跑分
先到https://github.com/eembc/coremark下载源码
在你的工程文件夹下建立CoreMark目录
将源码根目录中的这几个文件拷贝到新建的文件夹中
barebones目录中的.c和.h也拷贝过去
将CoreMark目录中的.c文件添加至工程中,如果想使用stdio提供的printf可以不添加ee_printf.c和cvt.c
在工程配置的头文件路径中也添加这个文件夹
在core_portme.h中添加宏定义和头文件,根据你的工程配置修改编译器版本和优化级别的定义,如果要使用stdio的printf输出结果最下面两个宏定义改为1,并勾选工程设置中的Use MicroLIB,由于有种说法是用MicroLIB会损失性能我这里就没用,重定向printf的方法这里就不介绍了
编译器版本和优化级别这两个需要自己改成工程设置里的参数,和下面的MEM_LOCATION都是输出最后结果用的字符串,对程序本身的编译运行没影响CLOCKS_PER_SEC每一秒的计数次数,根据你设定的定时器给coremark提供的计数周期进行调整
ITERATIONS 迭代次数,因为coremark要求最少运行10秒才能得到结果,可以根据你的mcu性能增大或减少这个值,性能好的可以增大这个值,性能差的可以减少这个值以减少等待跑分完成的时间
MAIN_HAS_NOARGC表示你的main函数是否有输入参数,单片机裸机开发一般都没有
main.h增加定义
其中main_ms_count是给coremark提供时间计数的,放在定时中断函数里自增,这个值的计数周期乘以CLOCKS_PER_SEC要等于1秒
core_app_uart_sendbyte是为coremark的打印函数提供的串口发送方法
在ee_printf.c中调用串口发送方法
如果单片机内存比较小减小一下ee_printf.c中这个数组的大小,默认是1024,这里改成128测试是没问题的
在core_portme.c中barebones_clock()这个方法中返回时间计数,coremark将根据这个计数来计算跑分时间
可以在这里调用初始化方法,记得注释掉#error开头的
如果你想在原来的main函数中调用跑分,修改core_main.c中的main函数名
新建个core_main.h,在core_main.c和你自己的main文件中包含它
在原来的main函数中完成初始化和跑分调用,我这里用LED闪烁提示跑分完成
还要修改启动文件中堆栈大小,太小的话跑不起来,太大的话又可能编译出错
编译烧录后用USB转串口连接设置的串口引脚,打开串口软件并设置正确的参数,将芯片上电后等待一会就会输出跑分结果
如果运行时间不满10秒可以调大ITERATIONS的值,一直卡住不动调大堆栈的值再尝试
不同编译器和优化级别最后跑出的分数也会不同,可以多换几个设置试试
|
大佬这篇申请原创,字数不满800哦~可以扩充下内容,扩充后@21小跑堂哦