1回答

0收藏

[评测分享] 【STM32H735-DK 测评】②CoreMark测试评分

#板卡评测 #板卡评测 3503 人阅读 | 1 人回复 | 2024-03-17

本帖最后由 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的性能。

其官网链接:https://www.eembc.org/coremark/,我们可以在这里看到各个芯片的分数,以及文档、代码等信息


三.工程创建及移植调试

这里是实战部分,默认大家已经准备好了测试环境的所有软件。这部分大致分为以下几个部分: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函数将测试结果输出



  1. #include "stdio.h"
复制代码
  1. int fputc(int ch, FILE *f)
  2. {
  3.   HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff);
  4.   return ch;
  5. }
复制代码
然后需要在魔法棒里勾选“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中的内容我们其实也不用修改,因为里面很多内容都是用来宏定义,所以只需要修改宏定义的对应内容即可,需要修改点如下

  1. #include "stdint.h"
复制代码
  1. extern uint32_t HAL_GetTick(void);
  2. #define NSECS_PER_SEC              1000
  3. #define CORETIMETYPE               int32_t
  4. #define GETMYTIME(_t)              (*_t = HAL_GetTick())
  5. #define MYTIMEDIFF(fin, ini)       ((fin) - (ini))
  6. #define TIMER_RES_DIVIDER          1
  7. #define SAMPLE_TIME_IMPLEMENTATION 1
  8. #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"

  1. #define COMPILER_FLAGS  "-O3"
复制代码
最后还要添加一个宏定义,这个参数并没有想上个参数那样,有一个define,需要我们手动添加(搞不懂coremark源码里为什么要这么搞,两个不一致,强迫症表示很难受)

  1. #define ITERATIONS 40000
复制代码
这个参数直译是迭代次数,我根据实践的理解是,计算的总次数。coremark要求至少跑10s,但是他跑的总时间并不是用一个timer控制,时间到了停止。而是使用加减ITERATIONS的值来改变总运行时间,换而言之性能越好的芯片,这个值要越大,否则无法运行到10S。所以这个值具体填多少要根据你的芯片性能来决定。


到此为止,所有工作都完成了


3.4 工程调试

尝试编译一下,很好,没有error,只有一个警告,这个警告问题不大



但是这个编译无敌慢,原因是工程默认使用AC5,现在最新的是AC6了,切换成AC6就可以编译的很快


切换AC6,从1:46变成0:28,快了好多


然后还需要在魔法棒里设置一下,下载好程序后自动复位并运行。然后在coremark_main前面手动加一句printf,用来指示开始运行coremark(这里我又要吐槽了,为什么他开始运行coremark前不能打印一句告诉我开始了)





  1. printf("Start CoreMark Test\r\n");
复制代码
终于成功跑起来了,结果如下


2384,和2777差了好多。

为了更高的分数,还要再提升一下优化等级为-Ofast(这个要使用AC6,AC5最高只能-O3)


Misc Controls填写

  1. -Omax
复制代码
(顺手把之前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 /

50.png (13.01 KB, 下载次数: 3)

50.png

coremark_Github.rar

1004.04 KB, 下载次数: 5

coremarkTest.part03.rar

7.06 MB, 下载次数: 6

coremarkTest.part01.rar

20 MB, 下载次数: 6

coremarkTest.part02.rar

20 MB, 下载次数: 5

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

yzp1

发表于 2024-7-19 12:03:42 | 只看该作者

您好,请问再main中调用从coremark_main需要加一些头文件吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

1112 积分
20 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条