上一篇我讲了关于串口和printf的应用,同时还做了固件编译时间的输出,这一操作大大减少了固件升级错误,固件版本不确定等问题,属实很有意义。那么今天就继续针对printf来实现coremark跑分吧。
Coremark是什么?
Coremark是一个基准测试程序,用于衡量处理器或系统在整数操作方面的性能。它被广泛用于评估嵌入式系统和微控制器的性能。Coremark基准测试主要关注矩阵操作、链表操作和状态机操作等任务。
那接下来就将coremark来移植到H5上吧,来看看coremark下的H5究竟有多强悍。
Coremark的代码首先是需要下载的,链接如下:GitHub - eembc/coremark: CoreMark® is an industry-standard benchmark that measures the performance of central processing units (CPU) and embedded microcrontrollers (MCU).
接下来在coremark查找要测试的芯片,评测跑分是跑了多少分。在官网搜到的跑分记录是1023.03。
通过图1来看,跑的分数还是可以的。接下来就做好移植准备吧。本次移植其实就需要一个串口初始化和串口的重定义,其实这些在上一章都做过了,那么就直接用上一章弄好的源码来实现coremark的移植吧。
接下来打开cubemx,找到ICACHE,这里需要使能该功能,否则跑分的数据是不准确的。
接下来添加coremark的代码,这里主要修改的是core_portme.c和core_portme.h文件,还有就是core_main.c之中的main函数与原代码之中的mian冲突了,因此需要修改,这里常规操作就是删除掉原main函数,删除之前复制其里面的初始化函数到core_main.c之中的main函数之内即可。不过我最近学习到了一种新的方法,就是将core_main.c之中的main文件改个名字,然后在原main函数之中调用一下即可,其实我觉得这样更好一些,可以看的更直观。并且很快的改好,不会出现落下某个初始化函数的问题。
接下来就是修改coremark代码的一些基础配置了。这里需要修改迭代次数,优化等级,运行时间还有堆栈大小的设定等等、
接下来就是针对core_portme.c文件函数修改,这里修改的比较简单,就是修改定时器和需要运行的时间等等。
externuint32_t HAL_GetTick(void);
#define NSECS_PER_SEC 1000//CLOCKS_PER_SEC
#define CORETIMETYPE int32_t//clock_t
#define GETMYTIME(_t) (*_t = HAL_GetTick())//(*_t = clock())
#define MYTIMEDIFF(fin, ini) ((fin) - (ini))
#define TIMER_RES_DIVIDER 1
#define SAMPLE_TIME_IMPLEMENTATION 1
#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER)
当以上内容操作完成之后,就可以编译一下试试了。编译0 Error(s), 0 Warning(s).奈斯,看来这次操作没有啥问题嘛。赶紧把代码烧录到开发板之中,发现代码没跑起来,OK,想要给我上一课是吧,这跑不起来可不行,赶紧仿真看看哪里出了问题。通过仿真发现,单步运行的时候多点几下,程序是可以运行到coremark代码的,那咋回事儿呢?后来发现,原来是UseMicroILB没勾选,好嘛,原来是自己的误操作给自己上了一课。勾选上之后,代码就可以正确跑起来了。
这里可以看出,跑的分数是1002.171371,哦豁,和官方标注的数据差不太多,官方是1023.03。官方说过,Coremark的跑分结果可能会存在一定的误差,这是因为多个因素可能会影响测试结果,例如系统负载、缓存状态、编译器优化等。至此,coremark就操作完成啦。需要注意的是,Coremark只是一个基准测试程序,它可以提供一定的性能参考,但并不代表实际应用中的性能表现。因此,在评估系统性能时,还应考虑其他因素和实际应用场景。。
---------------------
作者:yangjiaxu
链接:https://bbs.21ic.com/icview-3318234-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。