本帖最后由 shenxiaolin 于 2023-8-18 09:51 编辑
今天小管家催我更新进度了,实在有点不好意思,所以今天来更新一下,因为小管家说的需要做其他厂家的性能对比的东西,所以这里就移植CoreMark来做一下对比,很久以前作了AT32的CoreMark移植,这里就再复述一次如何在STM32H5系列单片机上移植Coremark,这样能够更加方便的来对比两个厂家的性能,AT32de型号是AT32F437,主频是288M,STM32H563的时钟我也已经升到250M了,所以整体对比下来还是有一定的意义的,
首先我们还是找到STM32H563的.s文件,首先对文件进行解锁,然后将堆栈的大小修改0x1000大小,因为CoreMark有个要求就是堆栈大小不得低于1K,
整体修改好了如下图
我们在左边的项目管理栏里卖弄新增一栏,并且在文件夹下添加COREMARK的源码,源码在哪里下载,如何修改在我的其他文章中有说明,大家可以去搜索一下还是可以的。
然后就是需要修改我们在CoreMARK的函数。
首先就是修改MAIN函数的内容,需要包含进定时器,串口初始化这两个基本的外设的端口,然后还有就是需要串口完成串口的重定向工作,在我的上一篇文章中已经实现了重定向的测试,所以这里的话就不多说了,
然后就是需要修改一下CoreMark的一些关于定时器起始和停止函数的封装,具体的操作如下面的函数所示,还有一个就是需要设定定时器的中断为1ms计数一次,然后设置一个全局变量完成计数的增加的工作,方面CoremARK完成分数的计算。
这里的只做计数的增加,不做计数的清零工作,切记,否则会导致计数不准确的,从而导致分数计算有误。
完成了上述工作,就是还要增加定时器的初始化的还有串口的初始化的工作。
需要在portable_init函数中完成定时器,串口的初始化。
还有一点,就是我们原有的main函数需要全部注释掉
这样是因为CoreMark已经有一个Main函数了,好了完成上述步骤了,需要添加CoreMark文件夹的路径,还有头文件包含等步骤,这个比较简单就不多说饿了,然后我们就对整个项目进行编译。
好了,接下来就是见证奇迹的时候了,我们就将程序下载到板子上,查看运行的结果。需要注意的是,我目前使用的是-O1的优化,先看看对比效果怎么样。
然后卡在不知道什么地方了……这个问题还需要查一下……我们把GPIO的电灯的功能加上,看看是否中途跑飞了。结果发现灯一直在闪烁,因为电灯是在终端内部的,所以相对来说不是那么严谨,然后……跑了三分钟之后除了结果
先来看看O1的结果
跑分才94.34分,想了一下,自己在中断内部点了个灯,说实话多少会有影响的,所以这里把电灯的代码去掉。再来跑一次。
然而,这次才93.6
然后我们吧优化等级提升到-O3然后在测试一下(上面两个都是-O1的结果)。
好吧,见证奇迹的时刻到了(下面这一个是-O3的结果)
看来优化等级还是起到了很好的作用!!!竟然达到了442.12的分数,相对原来的-O1的结果快了接近4倍我的妈呀……看来的确是Hall库导致延迟太大?(瞎猜的)
然后我们看看跑288M的AT32F437 的结果(这里直接给出结果哈-下面这个事AT32F437)
288M的M4的单片机跑了482,和STM32H563的M33内核的单片机跑了442分相差了差不多有40分,在频率高出38M的情况下,跑分只多了40分左右。然后我们来查一下STM32H563的官方跑分。
查了一下官方的跑分,竟然是1023分!!!!!!不知道这个分数怎么来的,我的编译器的版本是5.63
我们进一步来测试一下 -OFAST的测试结果,看看会到什么程度。
fast的结果是446.97 相当于447,比刚才多了6分
刚刚有查了一下,我这个没有开硬件浮点运算,我们把硬件浮点运算加上看看测试效果。
看来,这个跑分还是查了一点……好了,就到这里了,不知道什么原因导致跑分差一半,希望大家一起跑一下来看看。
今天的分享到这里了。
8-18 更新
查找网上的一些原因,要开Cache,并且需要做优化选项的配置
现在跑分是509分。509.388021
那么我们继续优化,按照网上的说法是需要这样设置并且开Icache
然后软件开CACHE,
果然,开恶劣CACHE的x效果要好得多。
1002.064252
和官方对比的1023 差了23分
现在可以了!!!!!!!
|