在线工博会

为嵌入式应用引入浮点运算
Olivier Ferrand, Stephane Rainsard
为节省流量,手机版未显示文章中的图片,请点击此处浏览网页版
硬件浮点运算功能长期以来一直是充当计算主力的高端MPU和DSP处理器的可选配置,而基于MCU的嵌入式系统则通常采用定点实现。
这种市场格局是由多种原因造成的。嵌入式系统的计算简单,定点运算足以胜任。定点代码不仅适用于MCU原生运算功能,其执行速度和存储器占用率也都优于与之相当的浮点代码。定点算法的唯一缺点是数值范围与计算精度之间的取舍问题,在大多数情况下这个缺点可以容忍。
今天的嵌入式系统完全不同于以往的嵌入式系统。其时钟速度比以往高出很多,数学运算也比以前更加复杂。虽然处理性能和存储器占用率还是设计人员的主要考虑因素,但是更有用的数值范围和更高的运算精度已经成为很多应用的关键要求。
例如,要输出高品质音频,MCU需要支持宽动态范围,这样系统才会有良好的高低音。心率监视仪和血糖仪等医疗仪器需要检测更细微的信号。在工业应用领域,高精度MCU能够让开发人员在系统其它部分使用低成本器件,降低系统总体成本。随着电容式触摸感应技术日益普及,嵌入式应用也同样受益于这项技术,能够在尺寸有限的屏幕上精确地检测输入信号。
浮点与定点对比
在一个定点数内,动态范围与运算精度的均衡组合取决于指数与尾数的分离运算。当一个数保存成定点数格式时,指数的位置被假定,且所有位都用于保存尾数(即表示该数的实际数字)。定点格式的问题与读取ADC的问题相似:所表示的数值范围越大,数值小的一端的分辨率就越低。如果需要捕捉非常小的数值变化,就必须缩窄数值范围。因此,开发人员必须在分辨率与数值范围之间进行取舍。
浮点方法通过给指数分配几个专用位,跟踪十进制的小数点,可以解决这些难题。例如,STM32 F4支持的单精度格式使用1位存储符号,使用8位存储指数,剩余的23+1位用于存储尾数(采用的规格化格式在保存成浮点数的23位上增加1个隐含位)。因此,单精度浮点数可以更好地均衡数值范围和计算精度,而8位、16位或32位定点数不是数值范围大而精度低,就是精度高而数值范围小。
32位单精度格式是IEEE 754浮点运算标准的组成部分。这个标准代表了数十年的浮点技术研发经验,提供一个支持浮点运算的通用方法,统一了处理器、编译器和高级设计工具。特别是,754标准是C语言所使用的浮点数据类型的基础。因此,MATLAB和Scilab等高级建模/元语言工具生成的代码采用浮点C格式。
使用浮点的一个主要好处是,开发人员能够更高效地使用过去只有DSP和MPU设计才能使用的C语言和功能强大的算法开发工具。总之,在C语言中很容易操作浮点数。高级工具可以进一步加快并简化开发过程,让开发人员能够用方程描述复杂算法,然后快速生成高效的C代码,而无需采用汇编语言手写算法。此外,这些高级工具提供极大的灵活性,让开发人员能够快速修改算法,无需重写和重新优化全部算法代码。这样节省了很多的成本和时间。这些工具是开发人员测试验证应用设计的强大利器。
软件浮点
过去,开发人员在MCU设计中使用浮点技术提高运算精度的方法十分有限。增加第二个处理器执行运算的成本太高,而不会考虑。即便设计可以移植到MPU或DSP,这两种处理器都不能像MCU一样处理嵌入式系统的实时要求。
高性能MCU的问世让开发人员能够在设计中引入浮点库,用软件方法实现浮点运算。这些库虽然让开发人员能够使用浮点算法,但是必须以降低系统吞吐量为代价。
这些库通常非常大,导致系统开销大幅增加。例如,两个数之间的每次运算首先需要对准数字,取得相同的指数,然后,在完成浮点运算后,对计算结果进行舍入计算,再把结果还原成定点数。虽然这些运算全都是由浮点库完成,开发人员看不见运算过程,但是性能却大幅降低,处理延时和存储器占用率大幅增加。
如果这些方案缺少可行性,而开发人员仍然需要具有高级建模工具的设计灵活性,他们可以选择将工具生成的C代码中的浮点运算人工转换到定点实现。这种方法的不利之处是需要投入大量的时间调整代码,以及缺乏在设计周期后期修改算法的灵活性。
STM32 F4优点:集成浮点技术
为保持市场竞争力,高性能精密嵌入式系统的开发人员需要使用浮点运算功能,但是不能像使用软件浮点库那样牺牲性能或存储器效率,或者必须人工把代码转换成定点代码。
有了STM32 F4微控制器架构,开发人员就可以选择把浮点效率引入各种低成本嵌入式应用。STM32 F4集成一个浮点单元(FPU),在本地硬件执行浮点运算。FPU完全兼容IEEE.754标准,拥有自己的32位单精度寄存器来处理操作数和运算结果。这些寄存器可视为双字寄存器,能够执行更高效的装载和存储操作。根据应用架构及寄存器是否需要保存,开发人员可以使用多种方法把FPU的上下文保存到CPU堆栈。
FPU支持754标准定义的5类不同的数字:规格化数、非规格化数、零、无穷和非数(NaN)。它也支持五种标准的异常(上溢、下溢、不准确、除以零和无效运算),准许应用程序处理异常运算,例如,计算一个负数的平方根(即导致NaN+无效运算异常)。但是,“未捕获”是一个例外,意味着FPU将返回754标准规定的结果,并将异常标志置位。必要时,开发人员也可以使用STM32 F4的浮点全局中断解决这个问题。
STM32 F4的集成FPU给嵌入式设计人员带来很多好处,包括:获得浮点带来的更有用的数值范围和计算精度;支持格式更自然的数字,降低编码复杂度;吞吐量高于软件浮点库;可使用高级工具生成的C代码,无需修改或打包,加快应用开发速度;由于软件库的多行代码指令变成了单行指令,代码占用存储空间更小;无需浮点库的宏调用,简化了调试过程。
实际上,对于基于MCU的设计,STM32 F4的FPU对换了定点和浮点之间的价值主张。
无缝集成
图1描述了有FPU的MCU与无FPU的MCU在汇编代码上的差别。这个示例的运算很简单:把number1与number2相加,结果保存在temp1内。然后,用number1除以temp1,把结果保存在temp2内。

(图片)

图1:有集成FPU时(左侧代码),代码长度较没有集成FPU(右侧代码)时明显减少

当MCU有FPU时,编译器可直接使用原生FPU指令(见左侧代码内的加法和除法指令)。然而,当没有FPU时,编译器在软件浮点库内插入宏调用指令,执行这个函数运算(见右侧代码)。这些函数包含多条指令,需要更多的时钟周期才能完成计算。虽然两者之间只是几条指令的差别,但是在CPU承担的算法总负荷中,额外开销占比很高。从应用整体考虑,这对处理效率的影响相当大。

(图片)

图2:利用STM32 F4的硬件浮点功能,无需修改算法代码(这里是Julia集)。

(图片)

图3:Julia集的主视图

运算性能
下面的示例充分说明了集成FPU的好处。图2描述了被称为Julia集的简单数学分形(图3)的代码,它由以下公式给出:
Zn+1=Zn2+c
其中,每个x+i.y点的序列用下面公式计算:
c=cx+i.cy
这个算法能够有效说明STM32 F4的FPU对性能造成的影响,因为使用这个算法无需修改代码。实际上,唯一的区别是在编译过程中FPU是否被激活。
图4描述了在使用不同的缩放倍数时Julia集计算所用时间。如图所示,FPU的存在导致性能提高到11.5~17倍。同样,不需要对代码进行修改,只要在编译器选项内选择FPU即可。

(图片)

图4:在使用不同缩放倍数时Julia集计算所用时间

对于需要实现信号处理功能或需要并行处理多个数据的应用,STM32 F4 MCU拥有一个可实现硬件DSP功能的多功能架构。STM32 F4的FPU单元和DSP指令为设计人员提供了强大的处理性能,执行嵌入式应用所需的各种算法。它们都可以加快不同类型的处理,并且合在一起相互补充,能够优化处理性能、存储器效率和编程简易性。
利用STM32 F4的集成FPU功能无缝移植现有应用设计也十分重要。以执行基于ARM提供的CMSIS DSP库的浮点FIR滤波器的STM32 F2应用为例,图5所示是在STM32 F2上执行100次FIR滤波器运算所用的相对时间(没有FPU和DSP功能,采用一个纯软件解决方案执行所需的浮点运算)。

(图片)

图5:采用STM32 FR FPU时,执行FIR滤波器运算快10倍。如需更多余量,
使用16位定点SIMD优化指令可提升至17倍性能。

当以STM32 F4为目标设备编译同一代码时,可以充分发挥硬件FPU的优势,相对性能(即分离出时钟速度的影响)立即提高10倍。仅更换处理器,激活FPU,性能优势即可大幅提升。根据具体应用情况,这样修改设计可以释放更多的处理器资源去处理更多的任务。
如果需要更多余量,使用16位定点SIMD(单指令流多数据流)优化指令可进一步提高FIR滤波器的性能,该指令是STM32 F4的DSP功能的一部分。例如,当使用ARM的CMSIS软件库的SIMD优化FIR算法时,不考虑时钟速度,性能是原来的17.9倍。
无与伦比的灵活性
过去,在设计基于DSP的系统时,开发人员必须在定点和浮点架构之间选择。浮点成本高,而定性应用开发复杂,厂商必须在两者之间权衡。FPU是ARM Cortex-M4架构的一个选件,意法半导体(ST)公司的STM32 F4系列全系列配备FPU。这样,开发人员总是可以获得浮点的运算性能和精度,无需以牺牲其它重要特性为代价。
STM32 F4为开发人员提供了一个灵活的高性能MCU架构,融合实时响应性、精确浮点运算和数字信号处理于一体,可以满足今天的嵌入式系统对MCU的要求。STM32 F4的FPU能够对基于C语言的浮点类型数据进行数学运算,对于回路控制、音频处理、传感器信号调整、数字媒体解码和数字滤波器等对精度有要求的应用任务,这是一个非常重要的优势。
从高级设计工具开始一直到软件代码生成,FPU功能可以加快复杂算法开发过程。对浮点运算的硬件原生支持通过实现最高的数学运算效率,简化了编程任务,大幅缩减了产品开发周期。这些工具生成的供FPU直接使用的代码可以实现最高的性能。
MCU集成FPU可以加快应用设计的处理速度,为处理器提供更多的余量以支持新功能,或者让能耗敏感型应用更快地进入休眠模式。此外,集成FPU还能让开发人员在应用设计中引入以前MCU无法实现的更先进的处理性能和功能。因此,在STM32 F4上实现数学算法时,开发人员无需在处理性能和开发周期之间徘徊。
作者:Olivier Ferrand,Stephane Rainsard,Abdelhamid Ghith 意法半导体公司 11/21/2012


电脑版 客户端 关于我们
佳工机电网 - 机电行业首选网站