定点运算和浮点运算_ECU中的定点与缩放

小数在计算机中通常有两种表示方法,一种是约定所有数据的小数点隐含在某一个固定的位置上,称为定点数,另一种是小数点位置可以浮动的称为浮点数 一般来说,定点格式可表示的数值的范围有限,对处理硬件的要求比较简单。而浮点格式可表示的数值的范围很大,但对处理硬件的要求也更高。

85ccb773a06dd8660f371c9fbc54136b.png

浮点数 VS 定点数

浮点数

与科学计数法相似,任意一个 J 进制数 N ,总可以写成:

N = J^E × M

式中 M 称为 N 的尾数(mantissa),是一个纯小数。E 为 N 的阶码(exponent),是一个整数, J 称为比例因子 J^(E) 的底数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法,C语言中的以float和double就属于这种类型。

d9652f768d246783c14712e6dfcc99c1.png

bf2ff4fb2919143900ac3ad7e3ee643d.png

float 0.15625

定点数

定点数是小数点固定的数,在计算机中没有专门表示小数点的位,所以小数点的位置是约定默认的。一般固定在机器数的最低位之后,或者固定在符号位后。前者称为称为定点整数(下图Q0),后者称为定点纯小数(下图Q15)。

0c5a329bab024a2a89ddaf6d7020e7bf.png

假设用一个 n 位字来表示一个定点数:

X = X0 X1 X2 … Xn-1

其中一位 X0 用来表示数的符号位,其余位数代表它的量值。为了对所有 n 位进行统一处理,符号位 X0 通常放在最左位置,并用数值0和1分别代表正号和负号。对于任意定点数,如果 x 表示的是纯小数,那么小数点位于 X0 和 X1 之间,数的表示范围为:

0 ≤ |X| ≤ (1 - 2 -n)

如果 X 表示的是纯整数,则小数点位于最低位 X n-1  的右边,数的表示范围为: 0 ≤ |X| ≤ (2n-1 - 1) 目前计算机中大多采用定点纯整数表示,因此将定点数表示的运算简称为 整数运算 。 定点计算在ECU中的使用 定点数表示法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大或特别小的数,最终绝大多数现代的计算机系统采纳了浮点数表达方式。但在 汽车ECU中却是定点整数运算占了上风 ,这是因为在ECU中: (1)计算量大

对于汽车控制器ECU而言,其内部拥有大量的数值计算,里面包括着大量数学模型,相比于浮点运算,定点运算的速度要快上一个数量级。而且随着计算量增多,定点的优势会越发明显。

(2)内存与速度

通常执行定点计算需要更少的内存和更少的处理器时间。对于底盘以及传动系统中的ECU对于计算的实时性要求很高,包含着许多1ms,5ms,10ms,20ms的周期process,这就意味着需要着需要在更少的时间内,完成更多的计算任务。

(3)价格低廉

相比于浮点MCU而言,定点MCU的结构更为简单,功耗更低,造价更为低廉。在汽车零配件这种对成本锱铢必较的行业,这对于各个Tier1的诱惑就更不必多说了。

Scaling 缩放

既然ECU中依靠的是定点整型计算,那其中的小数已经是如何实现的?Scaling(缩放)。就好比,在ADC的10位采样中,5V就使用0x3FF 来表示,即1个hex代表了4.886mV(5000mV/1023),也可以说这个物理量的精度为4.886mV。

我们举个例子,下面这个图是一个简单的计算车辆加速度的数学模型,包括驱动力F,阻力f,车身质量m,以及最后期望得到的加速度a。我们用PHY()表示该变量的物理值,HEX()来表示该变量在MCU内存中的数值。

d6bdbb77c559f496d394341d143b1af8.png

驱动力F,精度0.25N:

phy(F)= 0.25 hex(F)

阻力f,精度0.5N:

phy(f)= 0.5 hex(f)

质量m,精度0.1kg:

phy(m)= 0.1 hex(m)

加速度a,精度0.2m/s2:

phy(a)= 0.2 hex(a)

物理公式:

phy(a) = [phy(F) - phy(f)] / phy(m)

将其转化为定点整数运算的同时,也就是将hex值带回到上述公式的过程:

0.2 hex(a) = [0.25 hex(F) - 0.5 hex(f)] / [0.1hex(m)]

遵循着先乘后除的原则,最终在ECU中运行的代码可能是这样的:

hex(a) = [25 hex(F) - 50 hex(f)] / hex(m) / 2

使用Simulink等自动代码生成工具,还会基于此进行进一步优化,比如使用底层库函数来进行算符运算,或者把(÷2)改成右移(>>1)等等。

通过缩放方法,使得在满足MCU定点整数运算的前提下,还高效的实现了小数计算,同时自动代码生成工具又防止了数值溢出的风险,进一步增强了系统的稳定性。至于Scaling到最后标定工具的实现,依靠的是A2L文件,具体可以看之前的这一期(A2L文件介绍),这里就不再赘述了。

往期推荐

555b15b5e0d00a52029d426cc76dda43.png

36bd3e8a6a216608ffb981eca7cc27da.png

69b072bf58b7ac8f9c363ab98f49c71d.png

27dc5309b71acc3faed19f5653cbb69c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值