请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
主题中讨论的其他器件:C2000WARE
这篇文章介绍了有关 C2000 IQMath 库的一些常见问题。 C2000Ware 软件包中对该库进行了全面说明。
问:如何将 IQmath 项目更改为 C28x+FPU 的原生浮点项目?
以下是将 IQmath 应用转换为浮点时发现的提示和技巧列表:
编译器版本
- 使用 C28x 代码生成工具版本5.0.2或更高版本。
- 告诉编译器它可以生成本机 C28x 浮点代码。 为此、请使用–v28 -float_support=fpu32编译器开关。
- 有关与生成本机浮点代码相关的其他编译器开关、请参阅 C2000编译器用户指南(www.ti.com/.../spru514)。
- 如果您的器件具有 TMU、则还应启用此编译器开关。
FastRTS 支持库(RTS)
在项目中包含两个 RTS 库:
- CodeGen 浮点 RTS 库:为原生32位浮点使用正确的运行时支持库。 RTS 索引库(libc.a)将指示链接器使用适合您的编译的 RTS 库。 请参阅 C2000编译器用户指南(http://www.ti.com/lit/spru514)
- FPU FastRTS 库:该库使用器件 ROM 中提供的查找表来增强数学运算。 有关详细信息、请参阅文档。 此库包含在 C2000Ware 中。 注意:应在正常 RTS 库之前链接 FastRTS 库。
修改 MATH_TYPE
- 在 IQmath 头文件中、选择 FLOAT_MATH。 头文件会将所有 IQmath 函数调用转换为等效的浮点函数。
连接到寄存器
- 将浮点数写入器件寄存器时、需要将浮点数转换为整数。 同样、从寄存器读取值时、需要将其转换为浮点值。 在这两种情况下、这都是通过将数字乘以转换因子来实现的。 例如、要将浮点数转换为 IQ15、请乘以32768.0。 同样、要将 IQ15值转换为浮点值、请乘以1/32768.0或0.000030518.0。 需要注意的一点是:对于32位浮点值、整数范围限制为24位。
// //示例: //从 float 转换为 IQ15 // // If MATH_TYPE == IQ_MATH //使用 IQmath 转换函数// if MATH_TYPE == IQ_MATH PwmReg =(Int16)_IQtoIQ15 (VAR1); // If MATH_TYPE == float_MATH_MAT// Scale =(Int16)/^VAR68.0 = 32716 (Varm1) 字节序
除以常数
- 使用乘法、而不是除以常量。 使用除法将调用 RTS 库或 fastRTS 库。
// //这将使用 RTS 库中的除法例程除以常量 // AdcVal 类型为 float32 // 定义 ADC_scale 4096.0... AdcVal = AdcMirror.ADCRESULT0/ADC_SCALE; // 首选解决方案: //这将执行乘法而不是除法 // 定义 ADC_SCALE 1/4096.0... (笑声) AdcVal = AdcMirror.ADCRESULT0* ADC_SCALE;
移位为乘以或除以2的倍数
- 如果您的 IQmath 使用移位来除以或乘以2的倍数、则需要将其更改为浮点乘法。
- 请记住尽可能使用乘法而不是除法。 例如、不使用除以2、而是使用乘以.5、因此不使用除法例程。
编译器内在函数
- 当前的 IQmath 头文件不会将以下内在编译器转换为浮点运算。 这些必须手动修改或创建宏以执行转换。 《MS320C28x 优化 C/C++编译器用户指南》(www.ti.com/lit/spru514)对此进行了说明。
long __qmpy32 (long src32a、long src32b、int q); long __qmpy32by16 (long src32、int src16、 int q);
问:我收到一个错误、表明库与--float_support=fpu32构建选项不兼容。 我该怎么做?
- 链接器不允许您将使用浮点支持构建的库与不使用浮点支持构建的库混合使用。 如果它是您具有源代码的库、则可以使用--float_support=f32开关重新编译它。 如果它是 TI 提供的没有源代码的库、则检查是否已提供源代码。 例如、如果要混合 IQmath 和 float32数学运算、请使用 IQmath_F32.lib 而不是 IQmath.lib。
问:我想在 C28x+FPU 器件上混合 IQmath 和浮点数学运算。 我可以这么做吗?
- 不要使用 IQmath.lib 库、而是使用 IQmath_F32.lib。 此库构建可与使用--float_support=fpu32开关构建的代码链接。 这对于在具有 C28x+FPU 的器件上将 IQmath 与原生浮点代码混合使用非常有用。 IQmath 库 V1.5和更高版本中提供了 IQMath 函数 F32.lib。
问:如果我使用 IQmath_F32.lib、它是否执行本机浮点运算?
- 否-此库中的函数仍在_IQ 数学类型上运行。 请记住、所有定点运算在 C28x+FPU 上都100%兼容。