本帖最后由 Lacrimosa 于 2024-3-30 18:46 编辑

一、简介

本文针对GD32H759I-EVAL开发板,进行了ARM DSP库的适配,并与同为Cortex-M7内核的STM32H723进行了性能比较

二、DSP库介绍

1、DSP简介

数字信号处理(Digital Signal Processing,简称DSP)是一门研究用数字方法对信号进行分析、变换、滤波、检测、调制、解调以及快速算法的学科。它利用数字运算方法实现信号的处理,包括但不限于变换、滤波、检测、估值、调制解调和快速算法等。

2、ARM DSP库简介

ARMDSP为ARM实现的一套通用信号处理函数,可用于基于Cortex-M处理器的设备,其中包括了基本的数学函数、快速的数学函数、复杂的数学函数、数字滤波器、矩阵函数、电机控制功能函数、统计函数、插值函数等函数门类。

三、ARM DSP适配过程

1、DSP库下载

下载后的文件夹内容物,其中核心为Include文件夹(包含了DSP库的头文件)和Lib文件夹,包含了Cortex所有型号的DSP库,我们只需要找到我们需要的即可。

184030nu9f95z7f6fxcu4g

2、选择合适的DSP库

在DSP库Lib文件夹中,存在三个相应的Lib库,大家根据自己的IDE选择合适的库,本次我们以ARM(KEIL)为例

184030jp7ci9c6jc6n9pcp

在ARM文件夹中存在多种内核,我们根据自己的内核进行选择,本次使用的为M7小端模式单浮点精度

184030zaigaiagxmoodavx

3、配置KEIL

首先,我们需要在KEIL中添加该库,点击这个三色彩方块

184031pm0wawpkatpl5lps

新建一个组,随便命名(本文使用名称为DSP)

184031ete677v9616zv98g

点击添加文件

184031hqe09e6n8ux8q0rj

找到之前所说的Lib文件夹,选择合适的库,点击Add添加完成(注意要修改文件类型,要不然无法看到这些库)

184033ypzowigyps9og3ff

在此处添加ARM_MATH_CM7标志,注意与前面用逗号隔开

184033lhbdjahohjzdb3ch

再在此处添加引用

184033utlh0ewzcm0zwy0j

找到DSP库下的Include文件夹即可

184034yd8tslcn3gxu9c2s

如果在后续使用中出现问题可以考虑将此处配置改为如图所示

184034sj9n80nj9v3w9rp8

在main函数中引用头文件,未出现报错即可

184034q38bvbe870u0vjvf

四、测试过程

本次评测的部分为基础的函数计算,即计算正弦函数,因为计算不同正弦值之间,计算速度不一样,因此本次测试方式为计算100个不同正弦值,来近似得到正弦函数平均计算时间,在计算完成后,单片机会改变端口电平,我们可以通过高低电平时间来估计正弦函数计算时间

1、测评平台

(1)嵌入式开发板——兆易创新GD32H759I-EVAL开发板(主频600MHz)

184034u9yw8dw3ttd9tjja

(2)示波器——梦源璞石示波器

184034liki0kt0tri5irri

(3)对比开发板——STM32H723ZGT6开发板(主频550MHz)

184035iaikm14yhizuec34

2、测试结果

GD32H759I未使用DSP库加速,计算100次正弦函数大约需要270微秒,使用DSP库计算大约需要11微秒,加速后计算所需时间大约是原来的1/25

184035pkxlbbzrxb7fb7fy

STM32H723ZGT6未使用DSP库加速,计算100次正弦函数大约需要1060微秒,使用DSP库计算大约需要41微秒,加速后计算所需时间也大约是原来的1/25

184035x0rcdcscsku5nbvs

但我发现STM32实际表现和其频率不符,STM32频率比GD32频率低1/12,但计算速率却低了3/4,于是我重新检查了一下时钟树,并未发现异常,将时钟源由内部RC振荡器改为外部晶振,发现计算速度提升并不明显(时钟树用STM32cubmx编写,应该没有问题),该图展示了使用外部晶振的计算速率

184035bndmfzqdrniezdzi

最后我还测试了KEIL自带的编译优化能否加速sin函数的计算,将O0改为了O3

184036ufgfhp0pz1hx1p7g

在GD32上,对于不使用DSP库的sin函数而言,因为后续没有使用,计算过程可能被跳过了,因此不具备参考意义,对于使用DSP库的sin函数计算而言,可以看到计算时间由11us降到了9us,时间降低了约20%

184036ep04mu4s0vp5f49a

为了验证,我修改了代码,将计算的for循环变为空循环,然后进行测量可以看到脉宽大约是65ns,符合猜想。

184036dh053h3vddkb1o31

奇怪的是,在STM32上,并没有优化掉非DSP库加速的运算,但未使用DSP库的运算并没有得到任何优化,而使用DSP库的运算时间大约也缩短了20%

184036sgvwwgbbb0or04lv

五、总结

GD32H759I是一款十分优秀的芯片,具有极高的主频,不菲的浮点计算能力,以及良好的适配性,在使用过程中,我基本上没有遇到什么问题和BUG,在主频略高于STM32H7系列的情况下,sin函数计算速度是STM32H7系列的4倍左右,十分适合用于各类需要进行较高速数字信号处理的产品