| |
为嵌入式应用引入浮点运算 | |
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内。 (图片) (图片) (图片) (图片) (图片) | |
电脑版 | 客户端 | 关于我们 |
佳工机电网 - 机电行业首选网站 |