由于中秋节假期,帖子审批以及工程师回复将会有所延迟,敬请谅解。

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] IQMath

Other Parts Discussed in Thread: C2000WARE

主题中讨论的其他器件:C2000WARE

这篇文章介绍了有关 C2000 IQMath 库的一些常见问题。  C2000Ware 软件包中包含该库的完整文档记录。

问:如何将 IQmath 项目更改为 C28x+FPU 的原生浮点项目?
将 IQmath 应用转换为浮点时,我们发现了以下提示和技巧列表:

编译器版本

  • 使用 C28x 代码生成工具版本0.2 或更高版本。
  • 告诉编译器,它可以生成原生 C28x 浮点代码。为此,请使用 –v28 --float_support=fpu32 编译器开关。
  • 有关与生成本机浮点代码相关的其他编译器开关、请参阅《C2000 编译器用户指南》(http://www.ti.com/cn/lit/spru514)。
  • 如果您的器件有 TMU,则还应启用此编译器开关。

FastRTS 支持库 (RTS)

您的项目中包括两个 RTS 库:

  • 代码生成浮点 RTS 库:对原生 32 位浮点格式使用正确的运行时支持库。RTS 索引库 (libc.a) 将指示链接器使用适合您的版本的 RTS 库。 请参阅《C2000 编译器用户指南》(http://www.ti.com/cn/lit/spru514)
  • FPU FastRTS 库:此库使用器件 ROM 中提供的查找表来提高数学运算性能。有关更多信息,请参阅文档。此库包括在 C2000Ware 中。注意:应在正常 RTS 库之前链接 FastRTS 库。

修改 MATH_TYPE

  • 在 IQmath 头文件中,选择 FLOAT_MATH头文件会将所有 IQmath 函数调用转换为等效的浮点格式。

连接到寄存器

  • 将浮点数写入器件寄存器时,需要将浮点数字转换为整数。同样,从寄存器读取值时,需要将该值转换为浮点格式。在两种情况下,都可以通过将数字乘以换算系数来实现目标。例如,要将浮点数转换为 IQ15,请乘以0。同样,要将 IQ15 值转换为浮点值,请乘以 1/32768.0 或 0.000030518.0。需要注意的一点是:对于 32 位浮点值,整数范围限制为 24 位。

//// 示例:// 从浮点转换为 IQ15// // 如果 MATH_TYPE == IQ_MATH// 使用 IQmath 转换函数 // if MATH_TYPE == IQ_MATHPwmReg = (int16)_IQtoIQ15(Var1);// // 如果 MATH_TYPE == FLOAT_MATH // 乘以 2^15 = 32768.0 // else // MATH_TYPE 为 FLOAT_MATHPwmReg = (int16)(32768.0*Var1);endif

除以一个常数 

  • 使用乘法而不是除以常数。使用除法将调用 RTS 库或 fastRTS 库。

// // 这将使用 RTS 库中的除法例程除以常数 // AdcVal 为 float32 类型 // DEFINE ADC_SCALE 4096.0...AdcVal = AdcMirror.ADCRESULT0/ADC_SCALE;// // 首选解: // 这将执行乘法,而不执行除法 // DEFINE ADC_SCALE 1/4096.0......AdcVal = AdcMirror.ADCRESULT0* ADC_SCALE;

转换为乘以或除以 2 的倍数

  • 如果您的 IQmath 使用移位来除以或乘以 2 的倍数,则需要将其更改为以浮点值相乘。
  • 请记住尽可能使用乘法,而不是除法。例如,使用乘以5,而不是除以 2,这样就不使用除法例程。

固有编译器

  • 当前的 IQmath 头文件不会将以下固有编译器转换为浮点运算。这些必须手动修改或创建宏来执行转换。《MS320C28x Optimizing C/C++ Compiler User's Guide》(www.ti.com/cn/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 运算,请使用lib,而不使用 IQmath.lib。

问:我想在 C28x+FPU 器件上混合 IQmath 和浮点运算。我可以这么做吗?

  • 不要使用lib 库,而使用 IQmath_F32.lib。该库的这个构建可以与使用 --float_support=fpu32 开关构建的代码链接在一起。如果要在使用 C28x+FPU 的器件上混用 IQmath 与原生浮点代码,此功能会非常有用。IQmath_f32.lib 可在 IQmath 库 V1.5 和更高版本中使用。

问:如果我使用 IQmath_F32.lib,它是否会执行原生浮点运算?

  • 否 - 此库中的函数仍使用 _iq 数学类型运行。请记住,所有定点运行在 C28x+FPU 上完全兼容。