一、简介
本文针对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库,我们只需要找到我们需要的即可。
2、选择合适的DSP库
在DSP库Lib文件夹中,存在三个相应的Lib库,大家根据自己的IDE选择合适的库,本次我们以ARM(KEIL)为例
在ARM文件夹中存在多种内核,我们根据自己的内核进行选择,本次使用的为M7小端模式单浮点精度
3、配置KEIL
首先,我们需要在KEIL中添加该库,点击这个三色彩方块
新建一个组,随便命名(本文使用名称为DSP)
点击添加文件
找到之前所说的Lib文件夹,选择合适的库,点击Add添加完成(注意要修改文件类型,要不然无法看到这些库)
在此处添加ARM_MATH_CM7标志,注意与前面用逗号隔开
再在此处添加引用
找到DSP库下的Include文件夹即可
如果在后续使用中出现问题可以考虑将此处配置改为如图所示
在main函数中引用头文件,未出现报错即可
四、测试过程
本次评测的部分为基础的函数计算,即计算正弦函数,因为计算不同正弦值之间,计算速度不一样,因此本次测试方式为计算100个不同正弦值,来近似得到正弦函数平均计算时间,在计算完成后,单片机会改变端口电平,我们可以通过高低电平时间来估计正弦函数计算时间
1、测评平台
(1)嵌入式开发板——兆易创新GD32H759I-EVAL开发板(主频600MHz)
(2)示波器——梦源璞石示波器
(3)对比开发板——STM32H723ZGT6开发板(主频550MHz)
2、测试结果
GD32H759I未使用DSP库加速,计算100次正弦函数大约需要270微秒,使用DSP库计算大约需要11微秒,加速后计算所需时间大约是原来的1/25
STM32H723ZGT6未使用DSP库加速,计算100次正弦函数大约需要1060微秒,使用DSP库计算大约需要41微秒,加速后计算所需时间也大约是原来的1/25
但我发现STM32实际表现和其频率不符,STM32频率比GD32频率低1/12,但计算速率却低了3/4,于是我重新检查了一下时钟树,并未发现异常,将时钟源由内部RC振荡器改为外部晶振,发现计算速度提升并不明显(时钟树用STM32cubmx编写,应该没有问题),该图展示了使用外部晶振的计算速率
最后我还测试了KEIL自带的编译优化能否加速sin函数的计算,将O0改为了O3
在GD32上,对于不使用DSP库的sin函数而言,因为后续没有使用,计算过程可能被跳过了,因此不具备参考意义,对于使用DSP库的sin函数计算而言,可以看到计算时间由11us降到了9us,时间降低了约20%
为了验证,我修改了代码,将计算的for循环变为空循环,然后进行测量可以看到脉宽大约是65ns,符合猜想。
奇怪的是,在STM32上,并没有优化掉非DSP库加速的运算,但未使用DSP库的运算并没有得到任何优化,而使用DSP库的运算时间大约也缩短了20%
五、总结
GD32H759I是一款十分优秀的芯片,具有极高的主频,不菲的浮点计算能力,以及良好的适配性,在使用过程中,我基本上没有遇到什么问题和BUG,在主频略高于STM32H7系列的情况下,sin函数计算速度是STM32H7系列的4倍左右,十分适合用于各类需要进行较高速数字信号处理的产品