本帖最后由 yangyurong 于 2024-12-17 13:26 编辑
很荣幸收到极海电子发放的G32A1465开发板,先看看板子资源,首先G32A1465是一款基于 Arm® Cortex®-M4F 内核的 32 位微控制器,带有FPU的 32位Arm® Cortex®-M4F 内核,具备硬件浮点运算单元,最高 112MHz 工作频率,适合用于高速无刷直流电机FOC控制算法领域。而且这是一款车规级的MCU,安全可靠性也是比一般的消费电子MCU高很多。所以本次测试coremark主要就是以80MHZ和112MHZ来对G32A1465进行CPU性能跑分测试。
一、CoreMark简介
什么是CoreMark?
CoreMark是一个简单而又精密的基准测试程序,是专门为测试处理器核功能而设计的。运行CoreMark会产生一个“单个数字”的分数,(从而)允许用户在(不同)CPU之间进行快速比较。简单来说,就是一个测试CPU性能的程序,类似PC上的Cinebench、CPU-Z之类的CPU性能测试工具。和电脑上的鲁大师测试CPU分数类似。
接下来我们尝试在G32A1465开发板上跑一下CoreMark,看看分数是多少。
二、CoreMark移植
CoreMark是一个基准测试功能程序,在MCU上运行需要[color=rgba(0, 0, 0, 0.75)]打印输出 和定时器计时两部分。
[color=rgba(0, 0, 0, 0.75)]coremark移植有两种方式。
[color=rgba(0, 0, 0, 0.75)]一种是通过coremark官网的github连接进行下载源码导入KEIL工程集成编译,coremark
[color=rgba(0, 0, 0, 0.75)]另一种是通过KEIL里面的安装包RTE环境进行使能安装即可,方便简单,无需加载源文件到工程。
[color=rgba(0, 0, 0, 0.75)]本测评主要采用第二种方式来移植coremark。
[color=rgba(0, 0, 0, 0.75)]为了使用coremark组件,我们需要先安装 [color=rgba(0, 0, 0, 0.75)]GorgonMeducer.perf_counter.2.4.0.pack
GorgonMeducer.perf_counter.2.4.0.zip
(753.2 KB)
上面这个文件,解压缩后如下图
双击安装上面的文件即可,打开KEIL软件,点击这个
弹出下图,选中cmsis的core
然后往下拉,选中Utlities 中的core和benchmark。
点击OK就可以。
KEIL工程中就会出现下面选中组件了
因为我用的是极海提供测demo 程序,里面已经集成好了串口printf打印函数,所以直接使用即可。
定时器使用systick即可。接下来我们移植使用coremark,需要修改core_portme.c文件夹里的头文件和宏,先添加头文件
#include <stdio.h>
#include <stdlib.h>
#include "coremark.h"
#include "perf_counter.h"
core_portme.h头文件中需要增加修改下面三个宏
#define ITERATIONS 3500
#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS "-O0"
//#define COMPILER_FLAGS "-O1"
//#define COMPILER_FLAGS "-O2"
//#define COMPILER_FLAGS "-O3"
//#define COMPILER_FLAGS "-Ofast"
//#define COMPILER_FLAGS "-Os balanced"
//#define COMPILER_FLAGS "-Oz image size"
//#define COMPILER_FLAGS "-Omax"
#endif
#define MAIN_HAS_NOARGC 1
其中COMPILER_FLAGS 对应的是KEIL的优化等级
所以我们要一项一项的测coremark分数,每一项对应80MHZ和112MHZ两个分数。
打开main.c文件,添加一下头文件
#include "user_config.h"
#include "board.h"
#include <stdio.h>
#include <stdbool.h>
#include "perf_counter.h"
#include "coremark.h"
在主程序里面改写相关函数
SystemCoreClockUpdate( );
SystemCoreClock = 80000000 ;
init_cycle_counter(false);
printf("时钟频率为80MHZ时\r\n");
coremark_main( );
printf("--------------------------------\r\n");
SystemCoreClock = 112000000 ;
init_cycle_counter(true);
printf("时钟频率为112MHZ时\r\n");
coremark_main( );
while(1)
{
}
|