FPU

01、引言

客户在使用 STM32G474 时,希望使用 FPU 进行浮点运算,并最大化其性能。本文 从 STM32G474 系统的角度、ARM DSP Lib、编译选项的影响等几个方面探讨如何提升整体性能,并介绍如何使用 KEIL 工具进行测量。

02、STM32G474 FPU 运算性能优化 

2.1. STM32G474 系统性能优化 

STM32G474 使用的是 ARM Cortex-M4 内核(+FPU)。一般代码会放在 FLASH 区, 通过 I-Bus 读取。这里 STM32G474 有 FLASH 预取指及 CACHE Line, 无需放入 IRAM 或 CCM。因为 Cortex-M4 DSP 指令中没有运算指令与加载指令并行的混合指令,所以数据 存放区域及 Bus 的选择理论上对性能的影响不大。如下图 1 所示,可将 FPU 运算数据放 在 SRAM1。另外还需尽量避免 SRAM 的并发访问,如使能了 DMA,DMA 传输目的地 可以使用 SRAM2,从而减少潜在的 SRAM 并发访问产生的性能下降。应用则需要根据实 际情况,合理使用内存区域。

1.png

▲ 图1. STM32G474 架构 2.2. ARM DSP Lib 的使用 

在 ARM DSP 库实现了很多 math 算法,可进行浮点乘加、点积、卷积、FFT、NN 等 多种算法 API,可以使用 ARM DSP 库高效使用 FPU。ARM DSP 代码位置如下:

2.png

▲ 图2. ARM DSP Lib 目录结构 

2.3. 示例代码 

下面示例代码中对浮点乘法运算进行了测试。用户可以使用 STM32CubeMX 生成 STM32G474 KEIL 工程,在 main.c 文件中加入如下示例代码:

__attribute__((section (".TEST_INPUT_A"))) float32_t testInputA[1024] = 
{
    0.623234f, 0.799049f, 0.940890f, -0.992092f, 0.212035f, 0.237882f, -1.007763f, -0.742045f,
    ~~ 这里数组使用动态生成的float数据,数据量较大,略
    -0.417470f, -0.205806f, -0.174323f, 0.217577f, 1.684295f, 0.119528f,0.650667f, 2.080061f
};
__attribute__((section (".TEST_INPUT_B"))) float32_t testInputB[1024] = 
{
    -2.423957f, -0.223831f, 0.058070f, -0.424614f, -0.202918f, -1.513077f, -1.126352f, -0.815002f,
    
    ~~ 这里数组使用动态生成的float数据,数据量较大,略
     -0.447001f, -0.725993f, 0.354045f, -0.506772f, -2.103747f, -0.664684f, 1.450110f, -0.329805f 
 }; 
 
__attribute__((section (".TEST_RESULT_D"))) float32_t testResult[1024]; 

float32_t* pA;
float32_t* pB; 
float32_t* pR; 
/* Private user code --------------------------------------------------*/ 
/* USER CODE BEGIN 0 */ 
void test_normal_mul(uint32_t kLoops, float32_t* 
pSrcA, float32_t* pSrcB, float32_t*
pResult, uint32_t lenVector) 
{ 
    for (uint32_t j = 0; j < kLoops; j++) 
    { 
        pA = pSrcA; 
        pB = pSrcB; 
        pR = pResult; 
        for (uint32_t i = 0; i < lenVector; i++) 
        { 
            *pR++ = (*pA++) * (*pB++) ;    
        }   
    } 
} 

#if defined (__FPU_USED) && (__FPU_USED == 1U) 
/* Use arm dsp lib to test basic operation Multiply, FPU enabled */ 
void test_arm_math_mul(uint32_t kLoops, float32_t* pSrcA, float32_t* pSrcB, float32_t* pResult, uint32_t lenVector) 
{ 
    for (uint32_t j = 0; j < kLoops; j++) 
    { 
        pA = pSrcA; //Code alignment with the function without FPU 
        pB = pSrcB; 
        pR = pResult;arm_mult_f32(pA, pB, pR, lenVector); 
    } 
} 
#endif 

/** 
    * @brief The application entry point. 
    * @retval int 
*/ 

int main(void) 
{ 
    /* MCU Configuration------------------------------------------------*/ 
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 
    HAL_Init(); 
    /* Configure the system clock */ SystemClock_Config(); 
    
    … 
    
    HAL_Delay(100); 
    
    /* USER CODE BEGIN 2 */ 
    test_normal_mul(10, testInputA, testInputB, testResult, 1024);
    test_normal_mul(10, testInputA, testInputB, testResult, 1024); 
    
    #if defined (__FPU_USED) && (__FPU_USED == 1U) 
    // Multiply calculation with arm dsp lib 
    test_arm_math_mul(10, testInputA, testInputB, testResult, 1024);
    test_arm_math_mul(10, testInputA, testInputB, testResult, 1024); 
    #endif 
    
    /* USER CODE END 2 */ 
    /* Infinite loop */ 
    /* USER CODE BEGIN WHILE */ 
    while (1) 
    {
        /* USER CODE END WHILE */ 
        /* USER CODE BEGIN 3 */ 
    } 
    /* USER CODE END 3 */ 
}

2.4. 工程配置 

通过 KEIL 工程 Options / Target, Floating Point Hardware, 确定 FPU On/Off。

3.png

▲ 图3. KEIL 项目工程 FPU 单精度浮点设置 

通过 STM32G474_FPU_TEST.sct 文件配置 Data 存放区域,如下例,将测试数据置 于 SRAM2。

RW_IRAM1 0x20000000 0x00014000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x20014000 0x00004000 {
*(.TEST_INPUT_A)
*(.TEST_INPUT_B)
*(.TEST_RESULT_D)
}
RW_CCM 0x20018000 0x00008000 {
}

完成后,进行编译链接,即可进行 STM32G474 FPU 性能的测试。

2.5. 编译选项 

本文中我们使用的是 KEIL IDE,设置使用的是 KEIL Compiler V5。为了获得代码最 大程度上优化,我们使用了-O3 优化选项,与-Otime(Optimize for Time)结合使用。该组合选项意味着会进行更多代码优化,如循环展开,更激进的函数内联和自动函数内联 (-O3 默认使用--autoinline)等,当然副作用是二进制代码大小会有所增加。另外,增 加设置 --loop_optimization_level=2 来控制循环展开的优化等级。(注意:-- loop_optimization_level=2 选项只能与-O3 -Otime 一起使用。)如果您对 FPU 架构比 较熟悉,也可以尝试增加—fpu=fpv4-sp(Cortex-M4F FPU 实现的是 FPv4-SP 浮点运 算扩展)等选项,不过一般使用默认即可。

4.png

▲ 图4. KEIL 工程,编译选项设置

03、使用 KEIL Trace 工具进行测量 

3.1. KEIL 工程设置 

KEIL 工程下,首先选择工程选项设置,在 Debug 选项页中,右上部使用 Debugger  工具栏中选 Settings,如下图 5 和图 6 设置。注意 KEIL Trace 设置的时钟必须要与实际 STM32 使用的系统时钟相一致,如图 6 中,STM32G474 使用了 170MHz 的系统时钟, KEIL Trace 中也要相应设置为 170MHz。

5.png

▲ 图5. KEIL 工程,Debugger 设置入口

6.png

▲ 图6. KEIL 工程,Cortex-M Trace 功能设置 

运行KEIL debugger,如下图7所示,将断点设置在要测量的语句前及其后,执行 代码,当Debugger停在断点时,其状态栏中t1指示的即为当前代码的已执行时间。测试代码起止时间差即为代码执行用时。该Trace功能计时是比较准确的。当然如果您希望掌控更多,也可以通过代码来实现,如增加诸如如下代码:

nStart = DWT->CYCCNT; 
~~~需测试执行时间的代码~~~ 
nStop = DWT->CYCCNT;

然后用(nStop – nStart)/系统时钟,换算成时间即可。(我们这里没有考虑中断,一 般测量前需要禁用中断)

7.png

▲ 图7. KEIL 工程,Debug 模式下 Trace 程序执行时间 

3.2. 测试结果

下表列出了STM32G474 10K次 浮点“乘”用时统计。

8.png

▲ 表1. STM32G474 10K 次 浮点“乘”用时统计表

  • 10 X 1024次浮点乘 

  • 增加--loop_optimization_level=2 编译选项 

FPU 核心汇编代码的比较,见图8和图9。

9.png

▲ 图8. 使用--loop_optimization_level=2 编译选项的常规代码汇编 

10.png

▲ 图9. ARM DSP 库 arm_mult_f32 函数汇编 

使用loop_optimization_level=2, 常规代码使用KEIL compiler V5编译结果与 arm DSP Lib 的核心汇编基本相同。如果不使用loop_optimization_level=2编译选项, 则可以看到其主要区别在于KEIL Compiler V5 与ARM库对loop的unroll 处理程度不 同。在实际应用时,需要根据应用自身需求判断是否需要使用ARM DSP Lib,基本上 ARM DSP Lib是很高效的。

04、小结 

本文介绍了使用 STM32G474 FPU 进行浮点运算,从系统的角度、ARM DSP Lib、 编译选项的影响等几个方面探讨如何提升整体性能,并介绍了如何利用 KEIL Trace 工具进 行测量。以供在系统性能方面有需求的客户参考借鉴。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 22

浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标准的算法来完成运算,对于8位单片机来说已经完全是噩梦,对32为单片机来说也不会有多大改善。虽然将浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。对于有FPU(浮点运算单元)的单片机或者CPU来说,浮点加法只是几条指令的事情。

现在又FPU或者硬件浮点运算能力的主要有高端DSP(比如TI F28335/C6000/DM6XX/OMAP等),通用CPU(X87数学协处理器)和高级的ARM+DSP处理器等。

STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置:

1.编译控制选项:虽然STM32F4XX固件库的例程之system_stm32f4XXX.c文件中添加了对应的代码,但给用户评估使用的STM32F4-Discovery例程中却没有,因此MDK4.23编写浮点运算程序时,虽然编译器正确产生了V指令来进行浮点运算,但是因为system_stm32f4XXX.c文件没有启用FPU,因此CPU执行时只认为是遇到非法指令而跳转到HardFault_Handler()中断中原地踏步。因此要保证这个错误不发生,必须要在system_init()函数里面添加如下代码:

/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif

因为这个选项是有条件编译控制的,因此需要在工程选项(Project->Options for target "XXXX")中的C/C++选项卡的Define中加入如下的语句:__FPU_PRESENT=1,__FPU_USED =1。这样编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。

但这还远远不够。对于复杂运算,比如三角函数,开方等运算,如果编程时还是使用math.h头文件,那是没法提升效率的:因为math.h头文件是针对所有ARM处理器的,其运算函数都是基于定点CPU和标准算法(IEEE-754),并没有预见使用FPU的情况,需要很多指令和复杂的过程才能完成运算,也就增加了运算时间。因此要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h,这个文件根据编译控制项(__FPU_USED == 1)来决定是使用那一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。

在arm_math的开头部分是有这些编译控制信息:

#ifndef _ARM_MATH_H
#define _ARM_MATH_H

#define __CMSIS_GENERIC /* disable NVIC and Systick functions */

#if defined (ARM_MATH_CM4)
#include "core_cm4.h"
#elif defined (ARM_MATH_CM3)
#include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
#include "core_cm0.h"
#else
#include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
#endif

#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */
#include "string.h"
#include "math.h"

就是说如果不使用CMSIS的,就会调用keil自带的标准库函数。否则就用CMSIS的定义。这里因为是用的STM32F4,所以应该要ARM_MATH_CM4控制,即加入core_cm4.h,否则就用使用ARMCM4.h——但在编译时keil会提示找不到这文件。因此需要在工程选项之C/C++选项卡的define中继续加入语句ARM_MATH_CM4。

加入上述编译控制项之后,高级数学函数的使用基本没问题了,比如正余弦三角函数的计算。但需要注意,如果你直接使用sin()、cos()、sqrt()这样的函数,那结果还算调用keil的math.h,你可以在debug时看对应的代码,其汇编指令为BL.W __hardfp_xxx。因此这时要完成三角函数的计算就要使用arm_sin_f32()或者arm_cos_f32(),用法不变,这两个函数的原型分别在arm_sin_f32.c和arm_cos_f32.c中。通过对256点三角函数表的查询和插值算法得到任意角度的精确函数值,这就比“原装”的sin()、cos()快多了。

当然有些例外的是开发函数sqrt(),在arm_math.h中是这么定义的:

static __INLINE arm_status arm_sqrt_f32(float32_t in, float32_t *pOut)
{
if(in > 0)
{
// #if __FPU_USED
#if (__FPU_USED == 1) && defined ( __CC_ARM )
*pOut = __sqrtf(in);
#else
*pOut = sqrtf(in);
#endif
return (ARM_MATH_SUCCESS);
}
else
{
*pOut = 0.0f;
return (ARM_MATH_ARGUMENT_ERROR);
}
}

即开方用的函数是arm_sqrt_f32(),其中首先判断被开发的书是否大于0,只有大于0的才能进行运算,否则输出结果为0并返回“错误”标志。如果大于0,并且实用了FPU和__CC_ARM控制项,那调用__sqrtf()来完成编译,否则调用sqrtf()——这个sqrtf()是能在keil的math.h中找到的,即调用子函数来完成运算,而__sqrtf()呢?新出现的,相信大家都能猜到是什么玩意儿:对,就是VSQRT指令!因此要把这点性能也要发挥出来,就需要工程选项之C/C++选项卡的define中继续加入语句__CC_ARM才行。大家可以比较一下是否加入__CC_ARM编译后会汇编代码的差别巨大差别。

当然,对于arm_sqrt_f32()函数还是有些麻烦,如果你确认被开方的书是大于等于0的,那就直接使用__sqrtf()函数完成运算,即一条简单的VSQRT指令。

STM32F4固件库还提供了其他很有用的数学函数,都位于DSP_Lib文件夹,请大家慢慢探索,Discovery!

转自:http://blog.renren.com/blog/256814551/844695191

围观 1012

微控制器(MCU)深入人们应用生活,几乎大小设备都看得到MCU踪影,在MCU导入DSP数位讯号处理器、FPU浮点运算单元功能后,MCU更大幅扩展 元件可适用范围,这几年来,在众多MCU大厂纷纷针对旗下商品推出多样整合方案,不管是产品策略还是市场区隔,也让MCU市场更加丰富多元。
  
MCU(Microcontroller Unit)深入生活应用是不容易质疑的趋势,尤其是MCU在功能优化或市场区隔目的下,进行DSP(digital signal processor)数位讯号处理器或FPU(Floating Point Unit)浮点运算单元功能整合,使得MCU的可应用场域大幅扩展。
  
如果以FPU或DSP导入目的,一般在MCU中追加FPU、DSP整合架构,主要目的还是在考量成本下的设计方向,尤其在早期半导体元 件,SOC(System on Chip)系统单芯片与MCU存在一段价格差距,如果仅需要SDP或FPU进行运算加速,又不想选用高单价SOC,这时整合DSP或FPU硬件加速单元的 MCU产品、不仅可以更好的提供运行效能,同时又能在成本控制上表现更加优异。
  
MCU整合芯片封装成本骤降 增加MCU功能扩充应用空间
  
以早期的SOC产品来看,搭载DSP与FPU硬件加速器是SOC产品的重要特性,其中DSP与FPU的应用方向主要以音讯、影像等处理加速运算为主,而在制 程技术持续优化,SOC的成本逐步与MCU拉近,MCU在32位元甚至64位元架构下,也开始有结合DSP或是FPU硬件加速单元的解决方案。
  
先看看MCU加上硬件加速单元的优点,在MCU追加FPU导入,最直接的效益是早期利用MCU处理类似FPU运算内容,会因为MCU本身的运算架构限制,让 运算结果得出时间会相对拉长,而在导入硬件加速器处理浮点运算时,因为硬件呼叫或是资料传递就能透过硬件算出数据,MCU本身耗在浮点运算的记忆体资源可 以因硬件加速整合减少至少10%。
  
当然,从目的性来看,不管MCU有无整合FPU硬件加速单元,浮点运算需求使用MCU现有的运算能力也 能得出结果,只是前提是计算过程会耗用较多运算时间与硬件资源,对于可等待、无需提供即时反应的系统自然可以不考虑整合FPU的MCU方案,但若是对系统 效能、回馈反应速度要求高的整合需求,MCU结合FPU的效益提升不仅仅是运算资源耗用优化、节能优势等效果,反而是加快系统回应与效能提升的效用,才是 MCU结合FPU硬件加速最直接、重要的功能改进,也让MCU可以因应更高复杂度的整合工作。
  
高阶数值运算 运用硬件加速满足设计需求
  
在早期MCU元件仍以8位元架构为主流的应用方向,MCU在资料处理与运算处理上,本来就有因架构的问题而有其处理限制,例如,MCU进行小数点、分数处理 运算时,因为4位元或是8位元位数有限,就必须采用有限数值进行处理,透过数值结果的限制换取处理复杂度简化与效能要求目的,而这种因为数值处理产生的误 差即“截断误差”,截断误差也会因为使用MCU进行数据运算的限制,而令误差数值产生扩大现象。
  
而在MCU整合FPU硬件加速,在运算同类型的数据处理时,例如在IoT物联网或是终端感测器应用中,常有将外部类比感测数据转换成数位资料的资料撷取、处理需求,这时透过MCU整合的 FPU/DSP硬件加速单元,不仅可将感测数据更快速处理完成、加快系统回应,同时,也能导入进阶运算减少数据演算的误差。
  
在实际应用 中,FPU硬件加速器本身并无法完全解决误差扩大问题,所以会有FPU、DSP等不同硬件加速整合架构下的应用目的考量,举例来说,透过DSP硬件加速 器,可针对特殊数据类型更高速、可靠的运算处理输出,像是DSP可利用指令来进行多种运算,处理如快速快速傅立叶转换(fast Fourier transform;FFT)或有限脉冲回应(Finite impulse response;FIR)进阶运算中重要且耗资源的运算需求,甚至透过单周期的指令便能处理单一指令多重资料(Single Instruction Multiple Data;SIMD)运算需求,MCU在进行进阶数值处理方面还可获得进阶增强效益。
  
FPU/DSP不同硬件加速单元具互补作用
  
虽说整合FPU或DSP基本在架构与应用方向就不同,但实际上两者分别是针对数据运算、讯号处理对应至各式演算法应用,两者功能可以说是各有互补效用,比较 难被独立拆分。以ARM Cortex-M4来看,若仅提供DSP硬件加速处理器反而没设置FPU浮点运算加速器反而会造成应用限制,因为在Cortex-M4应用场合如果仅有数 位信号处理加速硬件支援,少了浮点运算支援,对开发需求端若碰到需要数值进阶运算加速,就会造成设计上的弹性限制,或是导致还需透过外部功能芯片支援,或 利用原有的运算资源因应数值进阶计算需求,反而会因为数值处理效能限制了Cortex-M4的应用可能性。
  
同样的状况也发生在仅有FPU而没有设置DSP的微控制器应用方案上,对DSP或是FPU应用功能是相辅相成,独立整合对于微控制器的配置并未能产生综效,反而会成为发展路径的限制。
  
再者,从新一代IoT产品发展方向,透过感测器融合(Sensor Fusion)应用方向为例,若是Sensor Fusion概念为将多感测器整合在单一系统中协同运行,系统需要高阶数值与讯号处理能力,才可以将关键数值讯号自复杂数据中提取出来。
  
至于感测器融合可以再搭配即时的调整、控制与校正处理,由DSP加上FPU协同处理达到高精密度、高效率进行撷取数据的精密分析,尤其是现有的Sensor Fusion已做到陀螺仪、加速度器、温度、压力甚至触控感测都做在同一个模组中,必须透过DSP与FPU预先筛出相对精密且兼顾处理效率的讯号撷取与预 处理的感测数据,提供相对高效的系统更具效率的感测数值处理机制。
  
DSP数位滤波应用 可提升感测讯号撷取品质
  
此外,在MCU整合FPU的另一个优势在于可在系统中善用其运算特性,例如,运用数位演算法进行撷取数值的数位滤波应用,针对处理讯号进一步以基于硬件加速 的数位演算法进行波形或数据再处理,形成一提升数据噪讯比(SNR)的便捷作法,数位滤波器还可利用演算机制优化提供不同程度大小的滤波效果,这在于微控 制器用于感测热门的心率、血液含氧量、运动数值等生理资讯,或是数位电表、智能电表等应用,解决末端数据因为杂讯或环境噪讯影响,倒置讯号失真的数据优化 回补效用,优化终端取得的讯号波形信号品质,更利于后续处理或数据使用。
  
为了优化末端应用,微控制器整合硬件加速单元也蔚为一股风潮,不 只是DSP或是FPU硬件加速单元,例如就有微控制器在架构上加入了VMU硬件加速单元,处理因应马达应用重点的三角函数数值运算需求,或是对应无线电通 讯需求整合的数据分析演算支援,与现有FPU浮点运算硬件加速功能区隔,采取协同分工的方式加速整体微控制器的应用效能。
  
有趣的是,针对不同的市场与运算需求定位,微控制器除在运算时脉进行差异区隔,以最实际的运算效能区分不同应用场合、市场切分外,整合不同应用所需的硬件加速单元也成为 产品市场定位的重要分界,例如针对穿戴式运算应用市场的微控制器,在要求功耗、感测器融合、元器件成本方面就可仅整合FPU、DSP硬件加速定位市场区 隔,在高阶的微控制器应用上,甚至有解决方案直接整合硬件绘图引擎,直接看准工业用人机介面终端的应用需求,另针对如车用电子、IoT物联网等不同市场需 求,也有五花八门的硬件加速单元配置组合,满足不同整合需求的应用架构。
  
另一个微控制器整合DSP、FPU硬件加速单元的目的,其实加入 硬件加速单元整合而不采行外部解决方案来组构硬件加速运算需求,其最大的优点在于成本方面的极致优化,因为电子电路板可以更节省载板空间,运用单一芯片就 能改善运算的整体效率,而在软体开发层面,可在整合架构下运用简单呼叫与资料传递的再处理,便能满足应用服务的数据计算产出效能要求,甚至于开发完成的成 品还可运用一致性侦错分析工具,直接针对系统进行全面分析与勘误,在开发设计的效率与速度都能获得改善。

来源:网络(版权归原著作者所有)

围观 505

微控制器(MCU)深入人们应用生活,几乎大小设备都看得到MCU踪影,在MCU导入DSP数位讯号处理器、FPU浮点运算单元功能后,MCU更大幅扩展元件可适用范围,这几年来,在众多MCU大厂纷纷针对旗下商品推出多样整合方案,不管是产品策略还是市场区隔,也让MCU市场更加丰富多元。

MCU(Microcontroller Unit)深入生活应用是不容易质疑的趋势,尤其是MCU在功能优化或市场区隔目的下,进行DSP(digital signal processor)数位讯号处理器或FPU(Floating Point Unit)浮点运算单元功能整合,使得MCU的可应用场域大幅扩展。
 
MCU整合FPU可以在进阶数值运算的精密度大幅提升、处理效能也能获得改善。
  
针对IoT应用开发的MCU方案,整合DSP可优化感测器数据撷取品质与提升信号处理效能。
  
如果以FPU或DSP导入目的,一般在MCU中追加FPU、DSP整合架构,主要目的还是在考量成本下的设计方向,尤其在早期半导体元件,SOC(System on Chip)系统单晶片与MCU存在一段价格差距,如果仅需要SDP或FPU进行运算加速,又不想选用高单价SOC,这时整合DSP或FPU硬体加速单元的MCU产品、不仅可以更好的提供运行效能,同时又能在成本控制上表现更加优异。
  
MCU整合晶片封装成本骤降 增加MCU功能扩充应用空间
  
以早期的SOC产品来看,搭载DSP与FPU硬体加速器是SOC产品的重要特性,其中DSP与FPU的应用方向主要以音讯、影像等处理加速运算为主,而在制程技术持续优化,SOC的成本逐步与MCU拉近,MCU在32位元甚至64位元架构下,也开始有结合DSP或是FPU硬体加速单元的解决方案。
  
先看看MCU加上硬体加速单元的优点,在MCU追加FPU导入,最直接的效益是早期利用MCU处理类似FPU运算内容,会因为MCU本身的运算架构限制,让运算结果得出时间会相对拉长,而在导入硬体加速器处理浮点运算时,因为硬体呼叫或是资料传递就能透过硬体算出数据,MCU本身耗在浮点运算的记忆体资源可以因硬体加速整合减少至少10%。
  
当然,从目的性来看,不管MCU有无整合FPU硬体加速单元,浮点运算需求使用MCU现有的运算能力也能得出结果,只是前提是计算过程会耗用较多运算时间与硬体资源,对于可等待、无需提供即时反应的系统自然可以不考虑整合FPU的MCU方案,但若是对系统效能、回馈反应速度要求高的整合需求,MCU结合FPU的效益提升不仅仅是运算资源耗用优化、节能优势等效果,反而是加快系统回应与效能提升的效用,才是MCU结合FPU硬体加速最直接、重要的功能改进,也让MCU可以因应更高复杂度的整合工作。

高阶数值运算 运用硬体加速满足设计需求
  
在早期MCU元件仍以8位元架构为主流的应用方向,MCU在资料处理与运算处理上,本来就有因架构的问题而有其处理限制,例如,MCU进行小数点、分数处理运算时,因为4位元或是8位元位数有限,就必须采用有限数值进行处理,透过数值结果的限制换取处理复杂度简化与效能要求目的,而这种因为数值处理产生的误差即“截断误差”,截断误差也会因为使用MCU进行数据运算的限制,而令误差数值产生扩大现象。
  
而在MCU整合FPU硬体加速,在运算同类型的数据处理时,例如在IoT物联网或是终端感测器应用中,常有将外部类比感测数据转换成数位资料的资料撷取、处理需求,这时透过MCU整合的FPU/DSP硬体加速单元,不仅可将感测数据更快速处理完成、加快系统回应,同时,也能导入进阶运算减少数据演算的误差。
  
在实际应用中,FPU硬体加速器本身并无法完全解决误差扩大问题,所以会有FPU、DSP等不同硬体加速整合架构下的应用目的考量,举例来说,透过DSP硬体加速器,可针对特殊数据类型更高速、可靠的运算处理输出,像是DSP可利用指令来进行多种运算,处理如快速快速傅立叶转换(fast Fourier transform;FFT)或有限脉冲回应(Finite impulse response;FIR)进阶运算中重要且耗资源的运算需求,甚至透过单周期的指令便能处理单一指令多重资料(Single Instruction Multiple Data;SIMD)运算需求,MCU在进行进阶数值处理方面还可获得进阶增强效益。
  
FPU/DSP不同硬体加速单元具互补作用
  
虽说整合FPU或DSP基本在架构与应用方向就不同,但实际上两者分别是针对数据运算、讯号处理对应至各式演算法应用,两者功能可以说是各有互补效用,比较难被独立拆分。以ARM Cortex-M4来看,若仅提供DSP硬体加速处理器反而没设置FPU浮点运算加速器反而会造成应用限制,因为在Cortex-M4应用场合如果仅有数位信号处理加速硬体支援,少了浮点运算支援,对开发需求端若碰到需要数值进阶运算加速,就会造成设计上的弹性限制,或是导致还需透过外部功能晶片支援,或利用原有的运算资源因应数值进阶计算需求,反而会因为数值处理效能限制了Cortex-M4的应用可能性。
  
同样的状况也发生在仅有FPU而没有设置DSP的微控制器应用方案上,对DSP或是FPU应用功能是相辅相成,独立整合对于微控制器的配置并未能产生综效,反而会成为发展路径的限制。
  
再者,从新一代IoT产品发展方向,透过感测器融合(Sensor Fusion)应用方向为例,若是Sensor Fusion概念为将多感测器整合在单一系统中协同运行,系统需要高阶数值与讯号处理能力,才可以将关键数值讯号自复杂数据中提取出来。
  
至于感测器融合可以再搭配即时的调整、控制与校正处理,由DSP加上FPU协同处理达到高精密度、高效率进行撷取数据的精密分析,尤其是现有的Sensor Fusion已做到陀螺仪、加速度器、温度、压力甚至触控感测都做在同一个模组中,必须透过DSP与FPU预先筛出相对精密且兼顾处理效率的讯号撷取与预处理的感测数据,提供相对高效的系统更具效率的感测数值处理机制。

DSP数位滤波应用 可提升感测讯号撷取品质
  
此外,在MCU整合FPU的另一个优势在于可在系统中善用其运算特性,例如,运用数位演算法进行撷取数值的数位滤波应用,针对处理讯号进一步以基于硬体加速的数位演算法进行波形或数据再处理,形成一提升数据噪讯比(SNR)的便捷作法,数位滤波器还可利用演算机制优化提供不同程度大小的滤波效果,这在于微控制器用于感测热门的心率、血液含氧量、运动数值等生理资讯,或是数位电表、智能电表等应用,解决末端数据因为杂讯或环境噪讯影响,倒置讯号失真的数据优化回补效用,优化终端取得的讯号波形信号品质,更利于后续处理或数据使用。
  
为了优化末端应用,微控制器整合硬体加速单元也蔚为一股风潮,不只是DSP或是FPU硬体加速单元,例如就有微控制器在架构上加入了VMU硬体加速单元,处理因应马达应用重点的三角函数数值运算需求,或是对应无线电通讯需求整合的数据分析演算支援,与现有FPU浮点运算硬体加速功能区隔,采取协同分工的方式加速整体微控制器的应用效能。
  
有趣的是,针对不同的市场与运算需求定位,微控制器除在运算时脉进行差异区隔,以最实际的运算效能区分不同应用场合、市场切分外,整合不同应用所需的硬体加速单元也成为产品市场定位的重要分界,例如针对穿戴式运算应用市场的微控制器,在要求功耗、感测器融合、元器件成本方面就可仅整合FPU、DSP硬体加速定位市场区隔,在高阶的微控制器应用上,甚至有解决方案直接整合硬体绘图引擎,直接看准工业用人机介面终端的应用需求,另针对如车用电子、IoT物联网等不同市场需求,也有五花八门的硬体加速单元配置组合,满足不同整合需求的应用架构。
  
另一个微控制器整合DSP、FPU硬体加速单元的目的,其实加入硬体加速单元整合而不采行外部解决方案来组构硬体加速运算需求,其最大的优点在于成本方面的极致优化,因为电子电路板可以更节省载板空间,运用单一晶片就能改善运算的整体效率,而在软体开发层面,可在整合架构下运用简单呼叫与资料传递的再处理,便能满足应用服务的数据计算产出效能要求,甚至于开发完成的成品还可运用一致性侦错分析工具,直接针对系统进行全面分析与勘误,在开发设计的效率与速度都能获得改善。

来源: DIGITIMES

围观 375
订阅 RSS - FPU