上一篇STM32G0的性能测试是基于简单的加法迭代计时的方式测试了G0系列和F0系列的性能差异,但是有坛友表示不太公平,那么这次就来个公平点儿的,跑一下CoreMark。虽然在ST官网和一些公开资料中已经有所提及,STM32G0的CoreMark成绩应该在142左右,但是还是希望自己亲自能够跑一下,这样才能更直观的了解STM32G0的性能。 由于笔者之前没有自己在MCU上跑过CoreMark,所以开始没有什么头绪,只是到CoreMark官网上看看资料,偶然的机会在STM32的中文官网搜索了一下CoreMark关键字,竟然发现官网已经有了一篇《如何将coremark程序移植到STM32上.pdf》,讲述了如何在STM32上移植CoreMark,虽然文章中使用的是STM32F746,但是工程是基于STM32CubeMX生成的,使用的HAL库,所以改文章应该能够适合STM32G0的开发板。改文章虽然写的已经很详细了,但是真正移植的时候还是遇到了一些问题,所以还是想写一篇文章来记录一下过程。 首先下载CoreMark源代码,地址http://github.com/eembc/coremark 在Windows上安装Git,然后在命令行中执行:git clone http://github.com/eembc/coremark.git 很快就可以下载完成了,整个工程也就只有1M多一点儿。 使用STM32CubeMX建立STM32G071的工程。 配置时钟时选择内部16M高速时钟,主时钟设置为最高的64MHz。 配置串口1的参数,这个串口时连接到STLink的,与PC端虚拟的串口是连接在一起的。 配置项目,IDE使用IAR V8,堆和栈大小都设置为0x2000,然后创建代码。 在IAR中打开工程,就可以看到生成的代码了。 在IAR工程中添加CoreMark中的六个文件到工程中,同时删除原工程中的main.c。 添加CoreMark的头文件路径到IAR工程中。 在core_portme.c文件的portable_init函数中粘贴从工程中删掉的main.c文件中主函数的初始化代码。 从main.c文件中拷贝初始化函数的实现到core_portme.c中。 增加printf重定向代码,文件开头添加函数声明,引用main.h 修改start_time,stop_time,get_time三个函数。 修改stm32g0xx_it.c中的SysTick_Handler函数。 在core_portme.h中定义迭代次数,CoreMark要求最少执行10秒钟才算有效,这里的迭代次数要根据芯片性能填写,笔者第一次根据文章中填写了个12000次,结果程序运行了89秒才出结果。根据G0芯片的性能,这里改为2000比较合适。 此外,修改编译器优化参数。 修改优化等级,Options->C/C++ Compiler->Optimizations, 选择High for speed 和No size constraints以达到最优的运行速度。 至此,所有修改完成,根据之前文章中的方法,编译为bin文件后,拖动到G071所在的盘符。写入完成后会自动重启。 重启后经过十几秒钟,在串口调制助手中就可以看到输出结果了,不过好像没有换行。 查看Core_main.c中的串口输出信息,发现换行都是用的"\n",而不是windows下常用的"\r\n"。 把文本信息拷贝到Notepad++中,就能够实现换行了,数据也整齐了。 从数据中可以看到,第一次迭代了12000次,用时89秒。第二次迭代了2000次,用时14.87秒。 两次测试的CoreMark值都是134.4左右,虽然距离官方的142还有一些差距,但是相比较STM32F0的68 CoreMark分要高了不少了。 总结:STM32G0在CoreMark中的跑分相比较STM32F0增加了近乎一倍,在配合其简洁的电源设计,极高的IO利用率,以及相对低廉的价格,相信在今后的MCU市场会有很大作为,甚至可能部分取代已经推出了10年之久的F1系列,在今后新项目的研发中,大家不妨尝试使用该系列的MCU作为主控,应该不会让大家失望。 工程代码: |
2022-04-20
Test-2022-02-21: share
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
原来如此,谢谢指导。
点评
点评
编译器对于跑分结果影响很大,所以大部分厂家跑分都是使用IAR,IAR编译出的程序跑分是最高的。CubeIDE使用的是GCC,这个编译出来的程序性能要比IAR差一些。跑分低很正常。