#申请原创#@21小跑堂
上一篇我讲了关于串口和printf的应用,同时还做了固件编译时间的输出,这一操作大大减少了固件升级错误,固件版本不确定等问题,属实很有意义。那么今天就继续针对printf来实现coremark跑分吧。
Coremark是什么?
Coremark是一个基准测试程序,用于衡量处理器或系统在整数操作方面的性能。它被广泛用于评估嵌入式系统和微控制器的性能。Coremark基准测试主要关注矩阵操作、链表操作和状态机操作等任务。
那接下来就将coremark来移植到H5上吧,来看看coremark下的H5究竟有多强悍。
Coremark的代码首先是需要下载的,链接如下:https://github.com/eembc/coremark
接下来在coremark查找要测试的芯片,评测跑分是跑了多少分。在官网搜到的跑分记录是1023.03。
图1 官方coremark关于H503的跑分数据 通过图1来看,跑的分数还是可以的。接下来就做好移植准备吧。本次移植其实就需要一个串口初始化和串口的重定义,其实这些在上一章都做过了,那么就直接用上一章弄好的源码来实现coremark的移植吧。
首先这里要将下载好的coremark源码解压,然后将用到的源码C文件复制到H503的基础串口输出工程之中。在下载好的coremark资源包之中,找到以下的源码,将这些源码复制到准备好的工程中来。 图2 将需要的coremark文件拷贝到工程中来 接下来打开cubemx,找到ICACHE,这里需要使能该功能,否则跑分的数据是不准确的。
图3 打开ICACHE 接下来添加coremark的代码,这里主要修改的是core_portme.c和core_portme.h文件,还有就是core_main.c之中的main函数与原代码之中的mian冲突了,因此需要修改,这里常规操作就是删除掉原main函数,删除之前复制其里面的初始化函数到core_main.c之中的main函数之内即可。不过我最近学习到了一种新的方法,就是将core_main.c之中的main文件改个名字,然后在原main函数之中调用一下即可,其实我觉得这样更好一些,可以看的更直观。并且很快的改好,不会出现落下某个初始化函数的问题。
图4 修改core_main.c之中的main函数名字 图5 在原main之中调用coremark的main函数 接下来就是修改coremark代码的一些基础配置了。这里需要修改迭代次数,优化等级,运行时间还有堆栈大小的设定等等、
图6 core_portme.h文件之中的修改 接下来就是针对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)
图7 core_portme.c文件之中的修改 图8 启动文件之中的堆栈数据修改 当以上内容操作完成之后,就可以编译一下试试了。编译0 Error(s), 0 Warning(s).奈斯,看来这次操作没有啥问题嘛。赶紧把代码烧录到开发板之中,发现代码没跑起来,OK,想要给我上一课是吧,这跑不起来可不行,赶紧仿真看看哪里出了问题。通过仿真发现,单步运行的时候多点几下,程序是可以运行到coremark代码的,那咋回事儿呢?后来发现,原来是UseMicroILB没勾选,好嘛,原来是自己的误操作给自己上了一课。勾选上之后,代码就可以正确跑起来了。
图9 coremark跑起来啦 这里可以看出,跑的分数是1002.171371,哦豁,和官方标注的数据差不太多,官方是1023.03。官方说过,Coremark的跑分结果可能会存在一定的误差,这是因为多个因素可能会影响测试结果,例如系统负载、缓存状态、编译器优化等。至此,coremark就操作完成啦。需要注意的是,Coremark只是一个基准测试程序,它可以提供一定的性能参考,但并不代表实际应用中的性能表现。因此,在评估系统性能时,还应考虑其他因素和实际应用场景。
|