yang377156216 发表于 2021-1-20 10:55

【GD32E503评测】——step03.国产M33做FFT也很快

本帖最后由 yang377156216 于 2021-1-20 12:54 编辑

<p><strong><span style="font-size:20px;"><span style="font-family:宋体;">【ARM Cortex M33白皮书节选】</span></span></strong></p>

<p><strong>DSP拓展</strong></p>

<p>选配的整数DSP拓展可以为系统增加85个新指令。大多数情况下,DSP指令可将性能平均提升3倍,让所有以数字信号控制为中心的应用性能突飞猛进。</p>

<p>为帮助设计师加速软件开发,ARM将在CMSIS项目中提供免费的DSP库,包含整套过滤、转换和数学功能(如矩阵),并支持多种数据类型。CMSIS项目是开源的,其开发详情发布在github上。<br />
<strong>单精度浮点单元</strong></p>

<p>基于FPv5的选配单精度浮点拓展单元包括一份额外的16-入口 64位寄存器文件。该拓展新增45个与IEEE754-2008兼容的单精度浮点指令。使用浮点指令通常可将软件库平均性能提升10倍。FPU位于单独的电源域,负责在整个单元不使用的时候切断电源。</p>

<p>Cortex-M33是一款能在性能、功耗和安全之间实现最佳平衡的处理器。</p>

<p>嵌入式解决方案日益复杂,而它们带来的价值也不断凸显,当今设计师面临的挑战是在相冲突的设计要素之间找到最佳平衡。此外,片上系统包含的软件数量正在显著增加,但项目开发时间却不断缩短。为了用更短的时间交付合格的产品,保证性能,减少成本,我们必须踏出正确的第一步。</p>

<p>Cortex-M33应运而生,为了迈出正确的第一步量身打造,ARM将过往经验与现有的Cortex-M生态系统完美结合,实现了开发成本降低。得益于采用了多种低功耗技术的全新设计,首先降低的是系统功耗;对打造安全方案的用户,TrustZone技术则为其应用和宝贵的IP提供保驾护航的坚实基础。升级后的MPU和TrustZone共同提升系统的可靠性和保护能力。最后值得一提的是,我们永远不会停止追求生产力的脚步。TrustZone的设计初衷便是保证当前用户能够像从前一样,继续在非安全领域内开发。Cortex-M33还强化了调试与追踪性能,使复杂代码的操作更便捷。与所有其它Cortex-M处理器一样,Cortex-M33的所有编程都可以在C语言环境下完成,包括全部异常处理程序。<strong>总而言之,上述功能诞生的目的都是为了帮助开发者提高生产力,在更短的时间内设计出更复杂的解决方案。</strong></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;"><strong><span style="font-family:宋体;">【使用ARM官方DSP库】</span></strong></span></p>

<p><a href="https://www.arm.com/why-arm/technologies/cmsis" target="_blank">CMSIS</a>是 Cortex-M 处理器与供应商无关的硬件抽象层软件接口,主要包括以下:</p>

<p><strong>CMSIS-RTOS:</strong>主要用于RTOS的API,可与中间件和库组件实现一致的软件层。</p>

<p><strong>CMSIS-DSP:</strong>Arm针对各种Cortex-M处理器内核进行了优化的丰富DSP功能的集合。</p>

<p><strong>CMSIS-Driver:</strong>接口可用于许多微控制器系列。</p>

<p><strong>CMSIS-Pack:</strong>定义了包含软件组件的软件包。</p>

<p><strong>CMSIS-SVD:</strong>可通过当前寄存器状态显示设备外设的详细视图。</p>

<p><strong>CMSIS-DAP:</strong>Cortex调试访问端口(DAP)的标准化接口。</p>

<p><strong>CMSIS-NN:</strong>高效的神经网络内核的集合。</p>

<p>CMSIS的应用场景非常广泛,稍微从事底层一点开发的工程师应该都看到过一些地方有CMSIS相关的应用,目前(2020.02)最新CMSIS版本为V5.6.0,而且开源在Github:</p>

<p><a href="https://github.com/ARM-software/CMSIS_5/releases/tag/5.6.0" target="_blank">https://github.com/ARM-software/CMSIS_5/releases/tag/5.6.0</a></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;"><strong><span style="font-family:宋体;">【移植ARM官方DSP库】</span></strong></span></p>

<p>GD32E503 基于Cortex-M33内核,Armv8-M with Mainline extension指令集,具有单精度浮点运算单元 (FPU),所有数据类型支持ARM单精度数据处理指令,支持完整的DSP指令。具有优秀的数字信号处理性能。我们找到 CMSIS包中的 DSP库,获取得到以下文件:</p>

<p>在之前串口工程中,将FFT相关的lib文件以及.c文件添加进去,如下:</p>

<p></p>

<p>其中, arm_fft_bin_data.c 文件包含了 参与运算的复数数组&nbsp;testInput_f32_10khz , 官方默认大小为 2048,意味着 参与FFT运算的采样点数据个数最大只能到 1024,且为 2的N次方 N大于1;arm_ARMv8MMLldfsp_math.lib&nbsp; 为官方提供的 M33内核的DSP库 ;arm_fft_bin_example_f32.c 为实际的测试函数入口所在文件 。另外,还需要将&nbsp;arm_math.h 和&nbsp;arm_const_structs.h头文件包含进测试.c文件中,且添加路径:</p>

<p></p>

<p></p>

<p>除此之外,在keil 工程设置中还需要添加 预处理定义&nbsp; :&nbsp;&nbsp;ARM_MATH_CM33,_FPU_USED=1U&nbsp; &nbsp;;&nbsp; 在 Misc Controls 一栏中还需要添加相关命令避免编译器报错 :&nbsp;-fshort-enums -fshort-wchar</p>

<p>在systick 1ms中断中添加计数全局变量&nbsp;guiSysTick_Tick ,通过该变量的差值来体现出 计算完 1024个点的FFT运算所花费的时间 ,</p>

<p></p>

<p>上述设置和配置完成后,主函数调用测试函数接口&nbsp;FFT_1024_Test() 即可完成测试,通过串口工具打印出实际时长,从测试结果可见,只需要1毫秒即可完成1024点FFT计算,DSP性能算是相当强大了:</p>

<p></p>

<p><br />
<br />
&nbsp;</p>

数码小叶 发表于 2021-1-20 16:13

<p>&quot;systick 1ms中断中添加计数全局变量&nbsp;guiSysTick_Tick&quot;,看了半天为啥是1ms,原来原因在这,时间测量长了,1024点不到1ms</p>

mig29 发表于 2021-1-25 23:19

<p>多谢楼主的示范工程。</p>

<p>简单修改一下,循环执行1000次,结果如下:</p>

<p>收&larr;◆FFT_1024 test ok ^_^ 666!,spend time=1286 ms</p>

zh_tao518 发表于 2022-9-21 23:58

<p>好文章,支持一下</p>
页: [1]
查看完整版本: 【GD32E503评测】——step03.国产M33做FFT也很快