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.

[参考译文] MSP430FR6047:MSP430的 IAR 中的双精度问题–"__double_size"冲突

Guru**** 2455360 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1467974/msp430fr6047-double-precision-issue-in-iar-with-msp430-__double_size-conflict

器件型号:MSP430FR6047

工具与软件:

我正在 IAR 中处理 MSP430项目、需要更高精度的浮点计算。

在 CCS 工程中、我能够使用 double(64位)、它解决了我的精度问题。 我们已将项目移至 IAR、而在 IAR 中、设置double为64位会导致链接器错误:

错误[e117]:不兼容的运行时模型。 模块 app_metrology (C:\Users\xxx.r43)指定"__double_size"必须为"64"、但模块_atoIQN (C:\Users\xxx\ussSWLib\IQMathlib\IQmathLib_IAR_MPY32_5xx_6xx_CPUx_LARGE_LARGE_DATA.lib)的值为"32"。

IQMath 库似乎需要double为32位、与我的项目设置相冲突。 如何在保持 IAR 64位精度的同时解决此问题? 关于 IQMath 兼容性或替代解决方案的任何指导都将很有帮助。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nandkishor:

    您是否可以转到 "Project Options"->"General Options"->"Floating-point"、尝试将 double size 配置为64位、然后让我知道这是否可以解决问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dylan:

    我只将 double 大小配置为64位。 错误显示: "_double_size"必须为"64"、但模块_atoIQN (C:\Users\xxx\ussSWLib\IQMathlib\IQmathLib_IAR_MPY32_5xx_6xx_CPUx_LARGE_LARGE_DATA.lib)的值为"32"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    噢、我明白了。

    通读 IQMath 用户指南后、我没有看到支持使用64位输入、无论使用何种编译器。 在 CCS 版本中、您也是使用64位值作为 IQMath 函数的输入? 根据我看到的文档、我希望这些功能不会起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    解决此问题的唯一方法是重新编译 IQmath 库。 如果供电方不可用、则不是一个选项。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有直接使用64位值作为 IQMath 函数的输入。 我正在执行该浮点运算、double_sum += float_variable*constant;  
    MSP 没有对浮点 arthimetic 的硬件支持、我认为它在软件级别处理这些运算。  
    TI 为 CCS 和 IAR 提供了不同的 IQmath 库: IQmathLib_CCS_MPY32_5xx_6xx_CPUx_LARGE_CODE_LARGE_DATA 和 IQmathLib_IAR_MPY32_5xx_6xx_CPUx_LARGE_CODE_LARGE_DATA。  

    我没有这些库的源代码。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、您知道 IQ 数学不是浮点、对吧?

    浮点仅用于在 IQ 表示之间来回转换。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    atoIQ (char *)(触发此投诉的例程)在将字符串转换为 IQ 格式时似乎使用浮点。 也许在使用其中一个使用宏的 IQ 转换之前执行显式的字符串到浮点转换、会绕过错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想,只是做你自己的转换.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不明白为什么需要使用字符串到浮点转换、因为我已经在使用浮点。  我没有明确 使用任何 IQ 转换。 可能我不理解这里的确切问题。 您能否说明您建议的解决方案与以下内容的搭配情况

    具体情况如下:

    伪代码:

    浮动流量;
    #define 常量2.777

    放电+=流量*恒定;

    当我使用浮点放电(32位)时、我能够编译代码、而不会出现任何错误。 但当我将放电类型更改为双倍(64位)时、我会从  IQmathLib_IAR_MPY32_5xx_6xx_CPUx_LARGE_LARGE_DATA.lib 中获得该错误


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我 只想使用浮点算术。 但是是的、我需要的其他备份是在固定点进行运算、并自行进行转换。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这不清楚、如果您"仅使用浮点算术运算"、如何进入"执行定点运算"?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的目标是获得一定精度的操作放电+=流速*constant;
    为了 在浮点算术中获得此精度、我需要选择"discharge as of double"类型(这 对我的应用程序来说很容易更改)、但 会遇到一些运行时库错误。  
    因此、另一种权变措施是我采用 IQxx 格式(在我的案例中可用)并计算定点放电。  

    将放电变量类型从 float 更改为 double 是非常基本的(我能够通过提供的 CSS 库在 CCS 中实现这一点)、我希望 IQmathLib_IAR_MPY32库也应有一定的分辨率。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您似乎专注于这一件事(放电+=流速*常量;)、但尚未解决调用导致错误(_atoIQN)的函数的原因。 完成的操作 会提示链接器在该函数中拖动。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在下面附上了上述公式的错误屏幕截图。 运行时库用于此 乘法。 在下面的屏幕截图中、你可以看到处理 E9CC 的子例程(?Mul32fHw32)。 从映射文件中可以明显看出、此地址属于运行时库(IQmathLib_IAR_MPY32_5xx_6xx_CPUx_LARGE_CODE_LARGE_DATA)函数。  

    我使用 IQmathLib_IAR_MPY32_5xx_6xx_CPUx_LARGE_CODE_LARGE_DATA 时面临的问题仅是由于将双精度大小从32位更改为64位所致。

    这篇 e2e 文章还涉及我面临的相同问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    浮点库不会调用定点库中的函数、因此您误解了.map 文件。