3464|11

85

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【AT32F421测评】+ CoreMark跑分 [复制链接]

 
 

上篇测评,我们已经搭好了开发所需的环境,并且从0开始新建一个工程,并成功打印 Hello World

接下来,我将给单片机跑个分,现在很多电子产品消费者在选择时都会进行横向对比,比如各种参数性能呀,尤其像现在的手机,电脑,商家在宣传性能时都会展现自家的跑分,比如基于安兔兔的手机跑分,基于CPU-Z AID64的电脑跑分等,虽然跑分并不能完全代表硬件的真实性能,但是也可以做一定程度上的参考。同理选择MCU时,我们一方面当然是要满足自身项目的要求,另一方面更偏向于选择性价比更高的MCU。

那么,基于单片机的性能跑分就应运而生了,说到性能测试,最著名的就是CoreMark和Dhrystone。虽然Dhrystone的测试可以作为参考,但更容易受到其他因素的影响下。

CoreMark能接近实际地反应出工作能力。它是由嵌入式微处理器基准测试联盟(EEMBC)开发,为了取代过时的Dhrystone标准ARM官方也是建议使用CoreMark而不是Dhrystone来进行基准测试。

软件使用C语言编写,是一个免费使用,易于移植的基准测试程序。目前CoreMark已经成为测量与比较各类处理器性能的业界标准基准测试。CoreMark得分越高,意味着性能更高。下图为CoreMark与Dhrystone对比

来源于网络

CoreMark的模拟工作负载主要包含几种常用的算法:

矩阵操作模拟常用的运算;

链表操作模拟指针的各种用法;

状态机操作模拟程序分支运行操作;

循环冗余校验(CRC)嵌入式系统常见的功能。

接下来,我们开始移植CoreMark。

第一步,先去官网在相应位置下载源代码,网站为www.eembc.org 下好的文件如下图所示,

第二步,打开我在上一篇测评新建的工程“AT32_Demo”(https://bbs.eeworld.com.cn/thread-1163406-1-1.html)新建一个子文件夹CoreMarkcore_list_join.c、core_main.c、core_matrix.c、core_state.c、core_util.c、coremark.h放入其中,再新建一个子文件夹CoreMark_Test,simple文件夹中的core_portme.c和core_portme.h放入其中。同时打开工程,将上述的c文件添加到工程,记得不要忘了添加路径哦。最终效果如下,(在此工程中,我将串口相关配置和使用都单独放在了USART.c里,并将其放在HARDWARE文件夹里,这里说明一下)

第三步,因为在core_main.c文件里已经有main()函数,所以我们要将原来工程中的main函数屏蔽或删除,我这里选择屏蔽,选择main.c,右键选择第一个,将下图include in Target Build勾选去掉,如下图所示,

最重要的移植工作是适配core_portme.c,

首先,添加

#define SysTick_Counter_Disable ((uint32_t)0xFFFFFFFE)

#define SysTick_Counter_Enable ((uint32_t)0x00000001)

#define SysTick_Counter_Clear ((uint32_t)0x00000000)

__IO uint32_t Ticks;

#define ITERATIONS 2500;

ITERATIONS这个视情况而定,如果出现ERROR! Must execute for at least 10 secs for a valid result!,那么需要将此数值变大使程序运行时间至少在10秒以上。

同时,将以下代码屏蔽
#define NSECS_PER_SEC              CLOCKS_PER_SEC

#define CORETIMETYPE               clock_t

#define GETMYTIME(_t)              (*_t = clock())

#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)

static CORETIMETYPE start_time_val, stop_time_val;

添加

#define EE_TICKS_PER_SEC 1000.0

将原有这三个函数修改为以下内容

void start_time(void)

{

     Ticks++;

  SysTick_Config(SystemCoreClock / 1000);//1ms中断

}

void stop_time(void)

{

    /* Stop the Timer and get the encoding time */

 SysTick->CTRL &=SysTick_Counter_Disable;

 /* Clear the SysTick Counter */

 SysTick->VAL = SysTick_Counter_Clear;

}

CORE_TICKS get_time(void)

{

    CORE_TICKS elapsed=(CORE_TICKS) Ticks;//(MYTIMEDIFF(stop_time_val, start_time_val));

    return elapsed;

}

同时由于core_main.c中的main函数执行时先调用core_portme.c中的portable_init函数,因此需要将原来main函数中的 RCC_Configuration、GPIO_Configuration、 NVIC_Configuration、assert_failed放到core_portme.c 同时在portable_init函数里调用,如下图所示(USART_Configuration在USART.c里,记得添加USART.h哦)

第四步,修改core_portme.h和coremark.h.首先要适配ee_printf打印函数,因为我们的板子已经实现了printf函数,所以保持coremark.h下面代码块不变

#if HAS_PRINTF

#define ee_printf printf

#endif

这样程序调用时会将ee_printf替换成printf实现打印功能

如果板子没有printf函数,得自己实现打印函数并进行相应替换.

同时,将core_portme.h中的下列函数改成你对应的编译器版本和优化等级

#ifndef COMPILER_VERSION

#ifdef __GNUC__

#define COMPILER_VERSION "GCC"__VERSION__

#else

#define COMPILER_VERSION "ARM Compiler 5.06 update 7 (build 960)"//changed

#endif

#endif

#ifndef COMPILER_FLAGS

 #define COMPILER_FLAGS "-g -O3 -Otime"//changed  /* "Please put compiler flags here (e.g. -o3)" */

#endif  

#ifndef MEM_LOCATION

#define MEM_LOCATION "STACK"

#endif

最后,因为我们是用系统滴答定时器来计时的,也就是start_time、stop_time、CORE_TICKS get_time所需要定时基准,所以要将at32f4xx_it.c 中的SysTick_Handler修改成以下代码;

extern __IO uint32_t Ticks;

void SysTick_Handler(void)

{

    Ticks++;

}

最后一步,将Optimization,也就是优化等级改成Level 3,同时将芯片频率改成120MHZ,这样跑分更高。这里需要注意的是运行CoreMark需要很大的栈内存,所以我们要将startup_at32f421c8t7.s启动文件中的Stack_Size   EQU  0x00000400改成了Stack_Size  EQU   0x00001000

这里说明一点,有些移植细节我可能讲忘了,比如各种头文件,但重要的步骤我已经都讲了,具体可用的程序见我上传的文件。

编译,下载好后,如果都正常的话,用串口助手观察会出现以下信息

最后分数为201分,这里我要说明一点,可能由于IDE版本不同,编译链不同或者其他硬件原因,又或者个人能力有限,没考虑到一些细节,导致CoreMark分数不一样或者并不是AT32F421的真正性能,所以我只对我所运行的程序及配套软硬件负责。作为对比,我还测试了STM32F103RCT6,跑分只有86分,不及官方宣称的分数。

------------------------------------------------------------------

CoreMark Test Begin!

Transplant CoreMark programs By DMZ!

CoreMark Test is runing, Plase Wait!

2K performance run parameters for coremark.

CoreMark Size    : 666

Total ticks      : 17303

Total time (secs): 17.303000

Iterations/Sec   : 86.690169

Iterations       : 1500

Compiler version : ARM Compiler 5.06 update 7 (build 960)

Compiler flags   : -g -O3 -Otime

Memory location  : STACK

seedcrc          : 0xe9f5

[0]crclist       : 0xe714

[0]crcmatrix     : 0x1fd7

[0]crcstate      : 0x8e3a

[0]crcfinal      : 0x25b5

Correct operation validated. See readme.txt for run and reporting rules.

CoreMark 1.0 : 86.690169 / ARM Compiler 5.06 update 7 (build 960) -g -O3 -Otime / STACK


补充一下,在后来的查阅相关资料时,发现MDK 5的优化选项有一个Optimize for time, 当勾选时,CoreMark跑分会变高,原因大概是在keil中,在不选择"Optimize for time"编译选项时,局部float变量占用8个字节(编译器默认自动扩展成double类型),,一旦你使用"Optimize for time"编译选项,局部float变量只会占用4个字节.也就是优化了很多不必要的累赘变量定义,能大大优化编译速度,具体我也不太懂,这个应该是各个编译器的特点吧,我也不太懂其中的原理.但是我还是要尝试一下,当我将Optimize  for time勾选,跑分竟然提高了50%多,如下图,当然此时要将ITERATIONS改大,我这里选择3500,不然不足10S

同时,我写修改了一下STM32F103的程序,也勾选了Optimize for time,跑分也提高了50%多,虽然还没到官方宣称的,但比原来更接近了,如下面展示的

------------------------------------------------------------------

CoreMark Test Begin!

Transplant CoreMark programs By DMZ!

CoreMark Test is runing, Plase Wait!

2K performance run parameters for coremark.

CoreMark Size    : 666

Total ticks      : 11323

Total time (secs): 11.323000

Iterations/Sec   : 132.473726

Iterations       : 1500

Compiler version : ARM Compiler 5.06 update 7 (build 960)

Compiler flags   : -g -O3 -Otime

Memory location  : STACK

seedcrc          : 0xe9f5

[0]crclist       : 0xe714

[0]crcmatrix     : 0x1fd7

[0]crcstate      : 0x8e3a

[0]crcfinal      : 0x25b5

Correct operation validated. See readme.txt for run and reporting rules.

CoreMark 1.0 : 132.473726 / ARM Compiler 5.06 update 7 (build 960) -g -O3 -Otime / STACK

------------------------------------------------------------------

 

CoreMark(同一测试程序和IDE及相关配置)

未勾选Optimize for time

勾选Optimize for time

AT32F421C8T7(120MHZ)

201.3

316.9

STM32F103RCT6(72MHZ)

86.7

132.7

 

 

根据上面的表格,最后得出结论,仅限我本人的软硬件和手头的测试板,120MHZ的AT32F421性能(基于CoreMark)可以说是72MHZ的STM32F103的两倍有余。

本次测评完毕,总的来说雅特力的超值型AT32F421性价比还是非常不错的

 

 

 

参考资料:

http://mcu.eetrend.com/content/2019/100046454.html

https://www.bilibili.com/read/cv7196931/

https://bbs.eeworld.com.cn/thread-610349-1-1.html

最新回复

学习了,楼主给了很详细的移植说明,收藏一下,以后自己试着移植一下。   详情 回复 发表于 2021-6-10 08:48
点赞(2) 关注
 
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

谢谢分享

楼主这个源代码的具体链接位置在哪里

点评

https://github.com/eembc/coremark  详情 回复 发表于 2021-4-27 10:09
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
Jacktang 发表于 2021-4-27 09:02 谢谢分享 楼主这个源代码的具体链接位置在哪里

https://github.com/eembc/coremark

 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(高级)

4
 

AT32_CoreMark.zip (12.85 MB, 下载次数: 4)

 
 
 

回复

2万

帖子

74

TA的资源

管理员

5
 

楼主这个跑分科普文赞。之前厂商一发布MCU时,就提到coremark,但是这么详细对coremark 做详细解说的,我还是第一次看到,多谢分享,涨知识啦!

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

1372

帖子

2

TA的资源

五彩晶圆(初级)

6
 

如果AT32F421 (M4)用FPU计算浮点数,STM32F103 (M3)用软件方法计算的话,估计性能差距会不止这点。

但若M4不用FPU,跟M3同频率下应该差不太多。

点评

我看了AT32F421的数据手册 它好像没有FPU 但是有DSP 请问DSP怎么开启呀  详情 回复 发表于 2021-4-27 23:29
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(高级)

7
 
cruelfox 发表于 2021-4-27 20:57 如果AT32F421 (M4)用FPU计算浮点数,STM32F103 (M3)用软件方法计算的话,估计性能差距会不止这点。 但若 ...

我看了AT32F421的数据手册 它好像没有FPU 但是有DSP 请问DSP怎么开启呀

点评

哦,AT32F421 是 M4, 不是 M4F, 没有FPU,我习惯性忽略了(STM32F4/L4都是M4F)。 我印象中FPU才需要写个寄存器来开启,DSP指令M4本身支持的。  详情 回复 发表于 2021-4-27 23:42
 
 
 

回复

1372

帖子

2

TA的资源

五彩晶圆(初级)

8
 
dmzdmz666666 发表于 2021-4-27 23:29 我看了AT32F421的数据手册 它好像没有FPU 但是有DSP 请问DSP怎么开启呀

哦,AT32F421 是 M4, 不是 M4F, 没有FPU,我习惯性忽略了(STM32F4/L4都是M4F)。

我印象中FPU才需要写个寄存器来开启,DSP指令M4本身支持的。

点评

有DSP功能是支持DSP指令,就是说我在数学运算时可以调用DSP指令来加速运算,但是CoreMark它的运算过程是它自带的 应该不好修改吧 我是这么理解的  详情 回复 发表于 2021-4-28 09:55
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(高级)

9
 
cruelfox 发表于 2021-4-27 23:42 哦,AT32F421 是 M4, 不是 M4F, 没有FPU,我习惯性忽略了(STM32F4/L4都是M4F)。 我印象中FPU才需要 ...

有DSP功能是支持DSP指令,就是说我在数学运算时可以调用DSP指令来加速运算,但是CoreMark它的运算过程是它自带的 应该不好修改吧 我是这么理解的

点评

是否用DSP指令取决于编译器及库,C源代码里面不会体现出来。 浮点运算跟DSP没多大关系。  详情 回复 发表于 2021-4-28 10:46
 
 
 

回复

1372

帖子

2

TA的资源

五彩晶圆(初级)

10
 
dmzdmz666666 发表于 2021-4-28 09:55 有DSP功能是支持DSP指令,就是说我在数学运算时可以调用DSP指令来加速运算,但是CoreMark它的运算过程是它 ...

是否用DSP指令取决于编译器及库,C源代码里面不会体现出来。

浮点运算跟DSP没多大关系。

 
 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

11
 

谢谢分享,不带浮点这配置节省不了多少钱呀。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

71

帖子

2

TA的资源

一粒金砂(中级)

12
 

学习了,楼主给了很详细的移植说明,收藏一下,以后自己试着移植一下。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表