本帖最后由 eefocus_3880118 于 2024-3-18 14:23 编辑
在开箱篇中我们说到,H735最大的特点就是主频来到了550MHz,这个频率在STM32的MCU系列中应该是最高的了,那么这么高的主频就很让人好奇他CoreMark测试评分能到多少,在开发板的盒子上有写到coremark是2777分,那我就要复测一下试试看
一.测试环境
首先介绍一下我的测试环境
电脑:Win10 64位
开发板:STM32H735-DK
CUBEMX:6.8.1
STM32Cube MCU Package for STM32H7 Series:1.11.1
IDE:Keil 5.37.0.0 + AC6
Keil Pack:STM32H7xx_DFP 3.1.0
二.coremark介绍
在coremark的官网对coremark的定义:“CoreMark is a simple, yet sophisticated benchmark that is designed specifically to test the functionality of a processor core. Running CoreMark produces a single-number score allowing users to make quick comparisons between processors.”,翻译过来就是“CoreMark是一个简单而复杂的基准测试,专门用于测试处理器核心的功能。运行CoreMark产生一个单数字分数,允许用户快速比较处理器。”比较朴素的理解就相当于单片机界的“鲁大师”,他是一套基准的测试程序,用于测试CPU的性能,通过它就可以侧面体现CPU的性能。
三.工程创建及移植调试
这里是实战部分,默认大家已经准备好了测试环境的所有软件。这部分大致分为以下几个部分:coremark源码下载、CUBEMX配置参数及生成Keil工程、coremark移植、工程调试
3.1 coremark源码下载
首先来到coremark的官网,点击download,会跳转github,我们需要把仓库clone下来,以获取源码(具体clone操作就不赘述了,如果打开github或者clone遇到问题的,我会在附件中上传clone下来的仓库)
看一下当前是否处于最新的提交位置
OK,第一步完成
3.2 CUBEMX配置参数及生成Keil工程
打开cubemx,我们选择从选择MCU开始工程
使用左边的筛选工具,快速找到我们开发板的主控芯片STM32H735IGK6
配置需要使用的外设及时钟树
先开启SWD调试接口
设置RCC,把高速时钟源选择外部晶振
配置时钟树,高速时钟选择外部晶振,不用默认的内部RC,把主频拉满
配置串口,因为ST-Link有一个虚拟串口连接到H735上,所以我就直接用这一个串口,看一下原理图,是串口3
需要特别注意的是,CUBEMX中默认的串口3引脚是PC10、PC11,需要手动去右侧的芯片引脚图上重新定义真正使用的引脚(PD8/PD9)
修改后
最后我们要开启CPU ICache和CPU DCache,这两个一定要开启,否则分数就只有五百多分,低的离谱(这个侧面反映了CPU ICache和CPU DCache对芯片性能的巨大提升)
我这里提前放一下两个都不开启的分数 最后填写一下Project Manager
工程名字我就叫coremarkTest,路径选择一下。然后IDE因为我用Keil就选择MDK-ARM,后面的最小版本我就选择5.32,我用的是5.37,是可以满足的,如果你的Keil版本比较旧,那么这个参数就要小于你的版本。最后Heap和Stack都调的大一点,我看网上别人说会遇到太小导致进Hardfault,我就直接全给调整成0x2000,铁定够用
然后库我就默认使用HAL库,不改了。其实我最喜欢的还是LL库,一旦有问题,单步调试可以直接看到对寄存器的操作,配合手册查问题很有效,而且他的效率很高。不过这次我外设部分就只用一个串口,那就不换了
OK,点击右上角“GENERATE CODE”生成工程
3.3 coremark移植
移植coremark需要用到仓库中的以下几个文件
在生成的工程路径下,新建一个文件夹用于存放这几个文件
然后打开Keil工程,创建一个新的组,把coremark的.c全部添加进去,然后再把.h的路径也添加一下
接下来来实现coremark需要使用的各个接口函数
首先是重定向printf,因为在coremark中会需要使用printf函数将测试结果输出
- int fputc(int ch, FILE *f)
- {
- HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff);
- return ch;
- }
复制代码然后需要在魔法棒里勾选“Use Micro LIB”
然后是main函数的处理,因为我们的工程已经自带一个main了,在coremarkTest\Core\Src\main.c。在coremark中也有一个main,这两个会冲突。大部分的文章都是去除自带的main,但是这样有个问题,如果我还要再用cubemx调整配置,重新生成工程,那么删除的main又会变回来,所以我需要保留自带的main,只需要把coremark的main改名,我就叫coremark_main,然后在自带的main中的while1前调用
然后是各个port,在core_portme.c中,主要是一个初始化还有各个与时间相关的接口
首先是portable_init,这里是用来初始化各种东西,但是因为我们已经在工程自带的main中已经完成时钟、串口等的初始化,所以这个函数我不需要修改
然后是各种timer相关的接口start_time/ stop_time/ get_time。Timer使用的是systick,1ms进入一次中断,在中断中更新计数,从而为coremark提供时间相关的信息
CUBEMX生成的工程中,已经默认配置了systick,并且时间也刚好是我们所需要的1ms,所以这部分我就不需要去配置和初始化了
start_time/ stop_time/ get_time中的内容我们其实也不用修改,因为里面很多内容都是用来宏定义,所以只需要修改宏定义的对应内容即可,需要修改点如下
- extern uint32_t HAL_GetTick(void);
- #define NSECS_PER_SEC 1000
- #define CORETIMETYPE int32_t
- #define GETMYTIME(_t) (*_t = HAL_GetTick())
- #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)
复制代码最后一个文件就是core_portme.h,需要修改一个宏定义,增加一个宏定义 需要修改的是#define COMPILER_FLAGS FLAGS_STR FLAGS_STR没有被定义,不修改的话,编译时会报error,说找不到FLAGS_STR。 我看了一下代码COMPILER_FLAGS都是在ee_printf中使用的,ee_printf就是printf被重新define。这个参数就是用于打印,把编译优化等级打印出来,至于里面的内容是什么与真正的编译优化等级其实无关,你写啥他就打印什么(在这个宏定义的上面还可以修改Compiler version,但是由于编译不报错,我就懒得改了)
他这里给示例了,那我就照着写"-O3"
- #define COMPILER_FLAGS "-O3"
复制代码最后还要添加一个宏定义,这个参数并没有想上个参数那样,有一个define,需要我们手动添加(搞不懂coremark源码里为什么要这么搞,两个不一致,强迫症表示很难受)
这个参数直译是迭代次数,我根据实践的理解是,计算的总次数。coremark要求至少跑10s,但是他跑的总时间并不是用一个timer控制,时间到了停止。而是使用加减ITERATIONS的值来改变总运行时间,换而言之性能越好的芯片,这个值要越大,否则无法运行到10S。所以这个值具体填多少要根据你的芯片性能来决定。
到此为止,所有工作都完成了
3.4 工程调试
尝试编译一下,很好,没有error,只有一个警告,这个警告问题不大
但是这个编译无敌慢,原因是工程默认使用AC5,现在最新的是AC6了,切换成AC6就可以编译的很快
切换AC6,从1:46变成0:28,快了好多
然后还需要在魔法棒里设置一下,下载好程序后自动复位并运行。然后在coremark_main前面手动加一句printf,用来指示开始运行coremark(这里我又要吐槽了,为什么他开始运行coremark前不能打印一句告诉我开始了)
- printf("Start CoreMark Test\r\n");
复制代码终于成功跑起来了,结果如下
2384,和2777差了好多。
为了更高的分数,还要再提升一下优化等级为-Ofast(这个要使用AC6,AC5最高只能-O3)
Misc Controls填写
(顺手把之前COMPILER_FLAGS定义的-O3改成-Ofast,不然回头串口打印的还是-O3)
2746,和2777差不多了,这个分数是我能跑出来的极限了。现在唯一可以提升的方法就是更换使用IAR,据说IAR的优化更好,分数是跑的最高的,但是我没有用过IAR就不尝试了
四.结果 序号 | 是否开启CPU ICache | 是否开启CPU DCache | 优化等级 | 分数 | 备注 | 1 | / | / | / | 2777 | ST官方的测试分数 | 2 | 是 | 是 | -Ofast | 2746 | / | 3 | 是 | 是 | -O3 | 2384 | / | 4 | 否 | 否 | -O3 | 533 | / |
|