本帖最后由 淹死的鱼yang 于 2026-1-4 00:43 编辑
【G32R501 Micro-EVB测评】zidian指令加速器运算性能测试 补充说明:此账号与TCSYANG均为本人,评测活动是在TCSYANG账号下参与的,由于该账号暂时无法登录,无法在TCSYANG发表。
最近有幸参与 G32R501 Micro-EVB开发板的测评活动,开发板主控芯片是极海微电子的G32R501,基于ARM Cortex M52内核的双核同构实时控制器,数据手册中说主频最大可以到250MHz,稳定运行到200MHz应该是没有问题的。这颗芯片还有一个亮眼的地方就是“紫癜”指令加速器了,做过电力电子开发的人都知道在控制环路和SVPWM发波算法中会多次使用到三角函数运算,纯数学三角函数运算是比较耗时的操作,普通单片机倒是可以采用Q格式定点数方式实现,不过精度差了些意思。本人后来使用过TI公司C2000系列的TMS320F28377D双核DSP,这颗芯片的主频同样是可以稳定达到200MHz,支持TMU三角函数加速单元。经过本人实际测试使用,对比普通的浮点数处理器FPU数**算,TMU的表现还是相当亮眼,截图如下:
可以看到相比普通的浮点数数**算,使用TMU硬件加速器的情况下,运算速度提升了将近3倍,TI官方说是5个时钟周期,限于本人的测试条件和测试方法,实际测试结果在10个时钟周期左右,表现还是很亮眼。不得不说,一旦吃上了硬件加速器这种细粮,还觉得定点数计算那种粗粮香的绝对是二百五。言归正传,开始对比测试一下我们的主角——G32R501的zidian加速指令,看看国产芯片的算力如何。 拿到评测主办方寄来的开发板,从极海官网上下载了SDK,安装好最新版本的keil MDK5.43a,首先编译烧录一个点灯例程,程序能够正常烧录运行,证明我搭建的测试环境和开发板都是OK的。接下来,要达到我的最终目的,首先要基本搞明白官方SDK的代码结构,工程配置等,便于我在现有例程的基础上,编写三角函数指令运行时间的测试程序。研究了SDK的代码结构,和TMS320F28377D的底层代码结构基本一致,底层外设驱动代码提供了两种对芯片外设的操作代码,一种接近于寄存器操作,在SDK的device_support/example目录下的外设例程,另一种封装程度较高,在SDK的drivelib/example目录下的外设例程,经过本人实际调试,需要注意两套代码不可以混合使用,否则会出现不可预知的效果,建议使用后者,代码结构清晰,便于开发,我后边的测试代码也是基于后者实现的。理解清楚SDK的组织结构,接下来就是打通UART外设,实现printf函数,便于通过串口调试助手打印我的测试结果,过程都是烂了大街的,此处不再赘述。
接下来干正事,编写代码测试zidian指令时间,zidian扩展指令的使用可以直接参照SDK目录下的doc文档,官方已有详细说明,代码运行时间测量这里直接使用内核自带的系统时钟计数器DWT,在system_g32r501_dwtmeasure.h头文件中已经提供了相关操作函数,直接调用即可。我这里只测试了扩展指令__sin()和__cos(),其他的方法类似,测试过程和结果如下图所示 从串口调试助手的打印接结果来看,sin和cos的计算时间是一致的,角度未归一化到[0, 2π的指令__sin和__cos运行速度更快,时间为0.215us-0.135us=0.08us,能达到TI的TMS320F28377D的TMU单元实测值的一半,还是比较亮眼的,以上是代码优化等级为-o0时的测试结果,如果采用-o3优化等级,测试结果如下:
角度未归一化到[0, 2π的指令__sin和__cos运行速度能达到10ns,归一化时能达到25ns,相当于2~5个时钟周期,计算速度相当亮眼
|