0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C2000浮点运算注意事项之CPU和CLA的差异及误差处理技巧

电子设计 来源:德州仪器 作者:德州仪器 2021-12-10 10:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

C28x+FPU架构的C2000微处理器在原有的C28x定点CPU的基础上加入了一些寄存器和指令,来支持IEEE 单精度浮点数的运算。对于在定点微处理器上编写的程序,浮点C2000也完全兼容,不需要对程序做出改动。浮点处理器相对于定点处理器有如下好处:

编程更简单

性能更优,比如除法,开方,FFT和IIR滤波等算法运算效率更高。

程序鲁棒性更强。

一、IEEE754格式的浮点数

C28x+FPU的单精度浮点数遵循IEEE754格式。它包括:

1位符号位:0表示正数,1表示负数。

8位阶码

23位尾数

31 30 23 22 0
符号位 阶码 尾数

表1:IEEE单精度浮点数

符号位S 阶码E 尾数M
0 0 0 正0
1 0 0 负0
0或1 0 非0 非规格化数(1)
0 1-254 0x00000-0x7FFFF 正常范围正数(2)
1 1-254 0x00000-0x7FFFF 正常范围负数(2)
0 255 0 正无穷大
1 255 0 负无穷大
0或1 255 非0 非数值(NaN)

(1)非规格化数值非常小,计算公式为(-1)sx2(E-126)x0.M

(2)正常范围数值计算公式为(-1)sx2(E-127)x1.M

正常范围数值落在± ~1.7 x 10 -38 to ± ~3.4 x 10 +38范围内。从表1可以看出,IEEE754标准包括:

标准数据格式和特殊值,比如非数值(NaN)和无穷大

标准舍入模式和浮点运算

多平台支持,包括德州仪器C67x系列芯片。

C2000对该标准作了一些简化:

状态标志位和比较运算不区分正0和负0

非规格化数值被认为是0

对非数值(NaN)处理方式和无穷大一样。

IEEE754标准有5种舍入模式,C28x+FPU只支持其中两种:

--截断:小数位不管大小全部舍去

--就近舍入向偶舍入:这种模式下如果小数位小于5就舍去,大于5就进位,如果小数位为5,则舍入到最近的偶数。

表2展示了不同的舍入模式对数据的影响。C28x+FPU编译器默认将微处理器配置为就近舍入向偶舍入模式[1]。

表2:不同舍入模式示例

模式/实际值 +11.5 +12.5 −11.5 −12.5
就近舍入向偶舍入 +12.0 +12.0 −12.0 −12.0
就近舍入远离0舍入 +12.0 +13.0 −12.0 −13.0
截断 +11.0 +12.0 −11.0 −12.0
向上舍入 +12.0 +13.0 −11.0 −12.0
向下舍入 +11.0 +12.0 −12.0 −13.0

二、浮点C2000芯片运算技巧和注意点

浮点数的精度由尾数位决定,绝大多数的数在用浮点数表示时都会有误差,这些误差很小,多数情况下可以忽略,但是在经过多次计算后这个误差可能会大到无法接受。

下面用实例来进行说明,下面一段代码定义float类型变量,分别在TI最新的Delfino芯片F28379D的CPU1和CLA1上,将11.7加20001次。

floatCLATMPDATA=0;

intindex=20001;

while(index--)

{

CLATMPDATA=CLATMPDATA+11.7;

}

得到如下结果:

其中CLATMPDATA1是在CLA中将11.7加20001次得到的结果,CLATMPDATA2是在CPU中将11.7加20001次得到的结果。可以看出两者所得到的结果不同,并且都和正确结果234011.7有较大差距。

为何CPU和CLA计算结果不同?

CPU和CLA运算结果的不同是由于其对浮点数的舍入模式的不同造成的,前文已经说过,C28x+FPU 编译器默认将CPU配置为就近舍入向偶舍入模式。而CLA不同,CLA默认为截断舍入模式[2]。在CLA的代码中,我们可以通过增加下述代码:

__asm(" MSETFLG RNDF32=1");//1为就近舍入向偶舍入,0为截断舍入

将CLA的舍入模式更改为就近舍入向偶舍入模式,然后再运行代码,可以得到和CPU同样的结果。

2. 为何CPU和CLA计算结果都有较大误差?如何解决?

11.7在用IEEE754格式的浮点数表示时为0x413b3333,其对应的实际值为11.69999980926513671875,可以看出误差很小,但是经过多次累加多次舍入后得到的结果误差较大,对此,我们可以将CLATMPDATA定义为long double型变量(64位),再次运行相同的代码,可以得到如下结果,可以看到误差很小可以忽略。

需要指出的是,现有的C28x CPU只支持单精度(32位)的硬件浮点运算,对于64位双精度浮点数的运算都是通过软件实现的,所以其运算速率会慢很多。另外CLA不支持64位数。

在这个实例中,我们可以分别观察float类型变量和long double类型变量的汇编代码如下:

C code: CLATMPDATA2=CLATMPDATA2+11.7;

如果CLATMPDATA2是float型变量,则相应的汇编代码为:

00c08d: E80209D8 MOVIZ R0, #0x413b 1cycle

00c08f: E2AF0112 MOV32 R1H, @0x12, UNCF 1cycle

00c091: E8099998 MOVXI R0H, #0x3333 1cycle

00c093: E7100040 ADDF32 R0H, R0H, R1H 2cycle

00c095: 7700 NOP 1cycle

00c096: E2030012 MOV32 @0x12, R0H 1cycle

如果CLATMPDATA2是long double型变量,则相应的汇编代码为:

00c08b: 7680005A MOVL XAR6, #0x00005a 1cycle

00c08d: 8F00005A MOVL XAR4, #0x00005a 1cycle

00c08f: 8F40C26A MOVL XAR5, #0x00c26a 1cycle

00c091: FF69 SPM #0 1cycle

00c092: 7640C0C9 LCR FD$$ADD 4cycle(跳转耗时)

+25cycle(FD$$ADD函数内部需要25cycle)

可以看出CPU对float类型数执行一次加法耗时7个cycle,对long double类型数执行一次加法耗时33个cycle。

三、结论

1. C2000的CPU和CLA默认的舍入模式不同,在计算浮点数时可能会得到不同的结果,但是我们可以通过代码改变其舍入模式得到相同的结果。

2. 单精度浮点数经过多次计算后可能会有较大误差,可以通过将变量定义为64位long double型解决精度问题。

3. C28x CPU只支持单精度(32位)的硬件浮点运算,对于64位双精度浮点数的运算都是通过软件实现的,所以其运算速率会慢很多。在下一代的C2000产品中我们会实现对64位双精度浮点数运算的硬件支持。

编辑:金巧

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11382

    浏览量

    226562
  • 嵌入式处理
    +关注

    关注

    0

    文章

    341

    浏览量

    10564
  • Cla
    Cla
    +关注

    关注

    0

    文章

    15

    浏览量

    11071
  • FPU
    FPU
    +关注

    关注

    0

    文章

    46

    浏览量

    23008
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Delta C2000系列交流电机驱动器的卓越性能与应用解析

    Delta C2000系列交流电机驱动器的卓越性能与应用解析 在工业自动化领域,电机驱动器的性能直接影响着整个系统的效率和稳定性。Delta C2000系列交流电机驱动器以其强大的功能和出色的性能
    的头像 发表于 05-13 16:30 134次阅读

    不同产品做 METI 备案的注意事项

    METI 备案是日本《电气用品安全法(DENAN)》下的强制性行政申报。但在实际操作中,并不是所有产品都“按同一套逻辑”备案。不同产品类别,在资料、责任划分、平台审核重点上差异明显。本文将从产品类型维度,系统梳理 METI 备案的关键注意事项,帮助企业避免反复补资料和合规
    的头像 发表于 02-10 12:00 337次阅读
    不同产品做 METI 备案的<b class='flag-5'>注意事项</b>

    三防漆怎么使用?有什么注意事项

    梳理三防漆从前期准备到最终固化的操作流程,帮助您掌握三防漆的使用方法。三防漆怎么使用?有什么注意事项?一、施工前的预处理在使用三防漆前,充分的准备是成功施工的基础,
    的头像 发表于 01-20 17:07 1016次阅读
    三防漆怎么使用?有什么<b class='flag-5'>注意事项</b>?

    请问CW32F030的硬件注意事项有哪些?

    CW32F030的硬件注意事项有哪些
    发表于 12-25 08:20

    请问IAP功能升级流程中有哪些注意事项

    IAP 功能升级流程中有哪些注意事项
    发表于 12-23 07:55

    BNC转接头接线注意事项

    本文从工程角度总结BNC转接头接线过程中的关键注意事项,涵盖阻抗匹配、接线规范、工艺选择及检测要点,帮助用户避免常见接线问题。
    的头像 发表于 12-19 14:04 740次阅读
    BNC转接头接线<b class='flag-5'>注意事项</b>

    迅为RK3588开发板Android系统烧写及注意事项

    迅为RK3588开发板Android系统烧写及注意事项
    的头像 发表于 12-03 15:17 7560次阅读
    迅为RK3588开发板Android系统烧写及<b class='flag-5'>注意事项</b>

    驱动板PCB布线的注意事项

    PCB Layout 注意事项 1)布局注意事项: ●● 整体布局遵循功率回路与小信号控制回路分开布局原则,功率部分和控制部分的 GND 分开回流到输入 GND。 ●● 芯片的放置方向优先考虑驱动
    发表于 12-02 07:40

    Enclustra瑞苏盈科产品使用注意事项

    我们准备了关于瑞苏盈科产品使用的注意事项,旨在帮助客户更快,更好的使用瑞苏盈科的产品,实现以最小化的成本提供理想的解决方案,帮助客户打造独树一帜的产品并减少上市时间。瑞苏盈科核心板使用注意事项:电子
    的头像 发表于 11-28 10:28 903次阅读
    Enclustra瑞苏盈科产品使用<b class='flag-5'>注意事项</b>

    CW32F030在使用中的注意事项有哪些?

    CW32F030在使用中的注意事项有哪些?
    发表于 11-18 06:20

    信号调理设备的接地和环境适配有哪些注意事项

    信号调理设备的接地和环境适配,核心是“阻断干扰传导、适应场景特性”—— 接地不当会引入电磁干扰,环境适配不足会导致器件参数漂移,两者都会直接破坏暂态信号的完整性,让分辨率提升失效。具体注意事项
    的头像 发表于 11-14 16:15 4110次阅读
    信号调理设备的接地和环境适配有哪些<b class='flag-5'>注意事项</b>?

    浮点运算单元的设计和优化

    的,和整数长度一致。 2.浮点运算指令实现:蜂鸟E203可以通过在EXU内添加一个与ALU平行的模块:浮点处理单元(float point unit),专用于
    发表于 10-22 07:04

    emWin AppWizard 开发注意事项有哪些?

    emWin AppWizard 开发注意事项
    发表于 09-04 06:18

    别让这些细节毁了PCBA!焊接注意事项清单

    一站式PCBA加工厂家今天为大家讲讲PCBA加工中电子元器件焊接注意事项有哪些?PCBA加工中电子元器件焊接注意事项。 电子元器件焊接关键注意事项 在PCBA加工中,焊接工艺直接影响电路板的可靠性
    的头像 发表于 07-23 09:26 1664次阅读

    智多晶PLL使用注意事项

    在FPGA设计中,PLL(锁相环)模块作为核心时钟管理单元,通过灵活的倍频、分频和相位调整功能,为系统提供多路高精度时钟信号。它不仅解决了时序同步问题,还能有效消除时钟偏移,提升系统稳定性。本文将深入探讨智多晶PLL在实际应用中的关键注意事项,帮助工程师规避常见设计风险。
    的头像 发表于 06-13 16:37 1869次阅读
    智多晶PLL使用<b class='flag-5'>注意事项</b>