本帖最后由 yuyy1989 于 2023-10-31 20:33 编辑
#申请原创# @21小跑堂
手机电脑在评测性能的时候总会跑 分来比较,其实单片机也可以跑 分。CoreMark是由EEMBC的Shay Gla-On于2009年提出的一项基准测试程序,CoreMark的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好,在https://github.com/eembc/coremark可以下载源码
在工程文件夹下建立CoreMark目录
将源码根目录中的这几个文件拷贝到新建的文件夹中
barebones目录中的.c和.h也拷贝过去
将CoreMark目录中的.c文件添加至工程中,如果想使用stdio提供的printf可以不添加ee_printf.c和cvt.c
在工程配置的头文件路径中也添加这个文件夹
在core_portme.h中添加宏定义和头文件,根据你的工程配置修改编译器版本和优化级别的定义
编译器版本和优化级别这两个需要自己改成工程设置里的参数,和下面的MEM_LOCATION都是输出最后结果用的字符串,对程序本身的编译运行没影响CLOCKS_PER_SEC每一秒的计数次数,根据你设定的定时器给coremark提供的计数周期进行调整
ITERATIONS 迭代次数,因为coremark要求最少运行10秒才能得到结果,可以根据你的mcu性能增大或减少这个值,性能好的可以增大这个值,性能差的可以减少这个值以减少等待跑 分完成的时间
main.h增加定义
extern uint32_t main_ms_count;
void core_app_uart_sendbyte(uint8_t dat);
其中main_ms_count是给coremark提供时间计数的,放在定时中断函数里自增,这个值的计数周期乘以CLOCKS_PER_SEC要等于1秒
void timer6_ov()
{
main_ms_count += 1;
}
core_app_uart_sendbyte是为coremark的打印函数提供的串口发送方法
void core_app_uart_sendbyte(uint8_t dat)
{
while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
usart_data_transmit(USART1, dat);
}
在ee_printf.c中调用串口发送方法
如果单片机内存比较小减小一下ee_printf.c中这个数组的大小,默认是1024,这里改成128测试是没问题的
在core_portme.c中barebones_clock()这个方法中返回时间计数,coremark将根据这个计数来计算跑 分时间
如果你想在原来的main函数中调用跑 分,修改core_main.c中的main函数名,新建个core_main.h,在core_main.c和自己的main文件中包含它,在原来的main函数中完成初始化和跑 分调用,另外还要修改启动文件中堆栈大小,太小的话跑不起来,太大的话又可能编译出错
编译烧录后,打开串口软件并设置正确的参数,将芯片上电后等待一会就会输出跑 分结果
如果运行时间不满10秒可以调大ITERATIONS的值,一直卡住不动调大堆栈的值再尝试
不同编译器和优化级别最后跑出的分数也会不同,可以多换几个设置试试
|