查看: 247|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2024-3-17 23:29:13 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 eefocus_3880118 于 2024-3-18 14:23 编辑

    在开箱篇中我们说到,H735最大的特点就是主频来到了550MHz,这个频率在STM32的MCU系列中应该是最高的了,那么这么高的主频就很让人好奇他CoreMark测试评分能到多少,在开发板的盒子上有写到coremark是2777分,那我就要复测一下试试看
    1.jpg


    一.测试环境

    首先介绍一下我的测试环境

    电脑: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下来的仓库)

    2.jpg


    3.jpg


    4.jpg

    看一下当前是否处于最新的提交位置

    5.jpg

    OK,第一步完成


    3.2 CUBEMX配置参数及生成Keil工程

    打开cubemx,我们选择从选择MCU开始工程

    6.jpg

    使用左边的筛选工具,快速找到我们开发板的主控芯片STM32H735IGK6

    7.jpg

    8.jpg

    配置需要使用的外设及时钟树

    先开启SWD调试接口

    9.png

    设置RCC,把高速时钟源选择外部晶振

    10.png


    配置时钟树,高速时钟选择外部晶振,不用默认的内部RC,把主频拉满

    11.png

    配置串口,因为ST-Link有一个虚拟串口连接到H735上,所以我就直接用这一个串口,看一下原理图,是串口3

    12.png

    13.png

    需要特别注意的是,CUBEMX中默认的串口3引脚是PC10、PC11,需要手动去右侧的芯片引脚图上重新定义真正使用的引脚(PD8/PD9)

    14.png

    修改后

    15.png

    最后我们要开启CPU ICache和CPU DCache,这两个一定要开启,否则分数就只有五百多分,低的离谱(这个侧面反映了CPU ICache和CPU DCache对芯片性能的巨大提升)

    我这里提前放一下两个都不开启的分数
    51.png
    16.png
    最后填写一下Project Manager

    17.png

    工程名字我就叫coremarkTest,路径选择一下。然后IDE因为我用Keil就选择MDK-ARM,后面的最小版本我就选择5.32,我用的是5.37,是可以满足的,如果你的Keil版本比较旧,那么这个参数就要小于你的版本。最后Heap和Stack都调的大一点,我看网上别人说会遇到太小导致进Hardfault,我就直接全给调整成0x2000,铁定够用

    然后库我就默认使用HAL库,不改了。其实我最喜欢的还是LL库,一旦有问题,单步调试可以直接看到对寄存器的操作,配合手册查问题很有效,而且他的效率很高。不过这次我外设部分就只用一个串口,那就不换了

    18.png

    OK,点击右上角“GENERATE CODE”生成工程


    3.3 coremark移植

    移植coremark需要用到仓库中的以下几个文件

    19.png

    20.png

    在生成的工程路径下,新建一个文件夹用于存放这几个文件

    21.png

    然后打开Keil工程,创建一个新的组,把coremark的.c全部添加进去,然后再把.h的路径也添加一下

    22.png

    23.png

    24.png

    接下来来实现coremark需要使用的各个接口函数

    首先是重定向printf,因为在coremark中会需要使用printf函数将测试结果输出

    25.png


    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”

    26.png

    然后是main函数的处理,因为我们的工程已经自带一个main了,在coremarkTest\Core\Src\main.c。在coremark中也有一个main,这两个会冲突。大部分的文章都是去除自带的main,但是这样有个问题,如果我还要再用cubemx调整配置,重新生成工程,那么删除的main又会变回来,所以我需要保留自带的main,只需要把coremark的main改名,我就叫coremark_main,然后在自带的main中的while1前调用

    27.png

    28.png

    然后是各个port,在core_portme.c中,主要是一个初始化还有各个与时间相关的接口

    首先是portable_init,这里是用来初始化各种东西,但是因为我们已经在工程自带的main中已经完成时钟、串口等的初始化,所以这个函数我不需要修改

    29.png

    然后是各种timer相关的接口start_time/ stop_time/ get_time。Timer使用的是systick,1ms进入一次中断,在中断中更新计数,从而为coremark提供时间相关的信息

    CUBEMX生成的工程中,已经默认配置了systick,并且时间也刚好是我们所需要的1ms,所以这部分我就不需要去配置和初始化了
    30.png

    32.png

    31.png

    33.png

    start_time/ stop_time/ get_time中的内容我们其实也不用修改,因为里面很多内容都是用来宏定义,所以只需要修改宏定义的对应内容即可,需要修改点如下
    34.png

    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
    35.png
    FLAGS_STR没有被定义,不修改的话,编译时会报error,说找不到FLAGS_STR
    36.png
    我看了一下代码COMPILER_FLAGS都是在ee_printf中使用的,ee_printf就是printf被重新define。这个参数就是用于打印,把编译优化等级打印出来,至于里面的内容是什么与真正的编译优化等级其实无关,你写啥他就打印什么(在这个宏定义的上面还可以修改Compiler version,但是由于编译不报错,我就懒得改了
    37.png

    38.png

    39.png

    他这里给示例了,那我就照着写"-O3"
    40.png

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

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

    41.png

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


    3.4 工程调试

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

    43.png

    42.png

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

    44.png

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

    45.png

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

    46.png


    47.png


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

    48.png

    2384,和2777差了好多。

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

    49.png

    Misc Controls填写

    1. -Omax
    复制代码
    (顺手把之前COMPILER_FLAGS定义的-O3改成-Ofast,不然回头串口打印的还是-O3)
    50.png

    2746,和2777差不多了,这个分数是我能跑出来的极限了。现在唯一可以提升的方法就是更换使用IAR,据说IAR的优化更好,分数是跑的最高的,但是我没有用过IAR就不尝试了

    四.结果
    序号 是否开启CPU ICache 是否开启CPU DCache 优化等级分数 备注
    1 / / / 2777 ST官方的测试分数
    2 -Ofast 2746 /
    3 -O3 2384 /
    4 -O3 533 /
    50.png

    coremark_Github.rar

    1004.04 KB, 下载次数: 0

    coremarkTest.part03.rar

    7.06 MB, 下载次数: 0

    coremarkTest.part01.rar

    20 MB, 下载次数: 0

    coremarkTest.part02.rar

    20 MB, 下载次数: 0

    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-28 12:57 , Processed in 0.134727 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.