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.

[参考译文] MSP430FG479:双浮点运算不起作用

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1166624/msp430fg479-double-floating-point-not-working

器件型号:MSP430FG479

我继承的最初在版本3.1.1上编译的固件使用多个双浮点数/计算。 当切换到 V21.6或 V21.1.1编译器时、简单的双精度计算不起作用。 这是已知问题吗?

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

    "不起作用"是什么意思? 您是否收到错误消息?

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

    没有错误、只是我得到的结果不正确。 预期结果为0.018675、我得到的结果为-8.8 E+82。 当我使用旧编译器时、我会得到预期的结果。

    感谢您的回复。

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

    尊敬的 Martin:

    如果您在调试模式下单步执行代码、您是否会看到正确的中间结果?  

    如果您对它感到满意、但它不是专有的、您能否共享与您正在执行的浮点计算相关的代码?   在您发布时、"插入"选项下有一个代码块工具、用于格式化 C 代码以提高可读性。

    此致、
    Brandon Fisher

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

    因此、我开始这个过程的原因是、计算的两个双精度数实际上是每次调用函数时计算的常量(同时浪费 RAM)。 我刚刚完成了将计算设为常量的操作、结果双常量是正确的值、这让我惊讶。 因此、编译时双精度计算正确完成、但使用 RAM 的运行时计算不正确。 下面是常数分配和两种计算。  

    	const unsigned int analogInputCounts1 = 5788;   // counts (around 5761)
    	const float analogInputConc1 = 0.5;     // The ppm used for analogInputCounts1.
    
    	const unsigned int analogInputCounts2 = 59308;  // counts (around 59066)
    	const float analogInputConc2 = 1000;    // The ppm used for analogInputCounts2;
    	
    		const double conc_slope = (analogInputConc2 - analogInputConc1) / (float)(analogInputCounts2 -analogInputCounts1); // v2.0.0 moved float outside ()
    	const double conc_yInt = analogInputConc2 - conc_slope * analogInputCounts2;// **double

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

    尊敬的 Martin:

    您是否在某个位置打印/使用这些值来确定计算是否错误、或在运行时在 CCS 的观察窗口中查看这些值?

    此致、
    Brandon Fisher

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

    Brandon、

    我正在使用观察窗口。 当我将斜率和 yInt 更改为 const double 时、它们在观察窗口中是正确的。 此外、当我使用版本3.1.1进行编译时、它们在观察窗口中是正确的(在我这么做时为非常量)。 我注意到的另一件事是、使用版本21.6编译时、浮点计算的执行时间几乎要长10倍。 我继承的代码在多个位置同时具有浮点和双精度。 我的团队正在添加一个将使用浮点的函数、因此我想了解正在发生的情况以及旧编译器和新编译器之间存在差异的原因。

    谢谢、

    Marty

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

    你(们)好、Marty

    如果您在 CCS 监视窗口中验证这些、您可能还需要将它们声明为易失性、以确保这不会由于优化而发生。  

    [引用 userid="541314" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1166624/msp430fg479-double-floating-point-not-working/4389446 #4389446"]我注意到的另一件事是、使用版本21.6编译时、浮点计算的执行时间几乎要长10倍。 我继承的代码在多个位置同时具有浮点和双精度。 我的团队正在添加一个将使用浮点的函数、因此我想了解正在发生的情况以及旧编译器和新编译器之间存在差异的原因。

    我不希望 MSP430上的浮点运算速度会非常快、通常我们建议避免使用浮点运算、但这些编译器版本之间的10倍差异似乎非常大。 为了供我参考、您如何测量该值?

    由于 v3.1.1离现在很远、因此很难通过查看编译器版本之间的差异来确定导致这种情况的变化/更改。 您可能必须在此处通过比较两个编译器版本之间生成的反汇编来执行一些法律工作、以查看它们是否存在显著差异。  如果您要使用该路由、我还建议您在重新创建此问题的绝对最小代码库上执行此操作(即仅您的浮点数学运算)。 不过、在您深入了解之前、您还可以比较您的项目设置、尽管我不知道会导致此情况的任何特定设置或编译器选项。  

    此致、
    Brandon Fisher

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

    Brandon、

    为了测量浮点的时间、我在端口引脚之前和之后分别将其切换为高电平和低电平、并使用示波器来测量时间。 以下是我要测量的代码部分:

    浓度=- 0.26137
    +0.89325*浓度
    +0.00899554*浓度*浓度
    -0.0001734*浓度*浓度*浓度;

    下面是使用 Ver 3.1.1的反汇编:

    90浓度=- 0.26137
    1DEA:403C AC08 MOV.W #0xac08、R12
    1dee:403D 3F64 MOV.W #0x3f64、R13
    1df2:411E 0004 MOV.W 0x0004 (SP)、R14
    1df6:411F 0006 MOV.W 0x0006 (SP)、R15
    1dfa:12B0 5174调用#_FS_mpy
    1dfe:403E D24A MOV.W #0xd24a、R14
    1e02:403F BE85 MOV.W #0xbe85、R15
    1e06:12B0 3DF6调用#_FS_ADD
    1e0a:4C09 MOV.W R12、R9
    1e0c:4D0A MOV.W R13、R10
    1e0e:403C 6208 MOV.W #0x6208、R12
    1e12:403D 3C13 MOV.W #0x3c13、R13
    1e16:411E 0004 MOV.W 0x0004 (SP)、R14
    1e1a:411F 0006 MOV.W 0x0006 (SP)、R15
    1e1e:12B0 5174调用#_FS_mpy
    1e22:411E 0004 MOV.W 0x0004 (SP)、R14
    1e26:411F 0006 MOV.W 0x0006 (SP)、R15
    1e2a:12B0 5174调用#_FS_mpy
    1e2e:4C0E MOV.W R12、R14
    1e30:4D0F MOV.W R13、R15
    1e32:490C MOV.W R9、R12
    1e34:4A0D MOV.W R10、R13
    1e36:12B0 3DF6调用#_FS_ADD
    1e3a:4C09 MOV.W R12、R9
    1e3c:4D0A MOV.W R13、R10
    1e3E:403C D2B5 MOV.W #0xd2b5、R12
    1e42:403D 3935 MOV.W #0x3935、R13
    1e46:411E 0004 MOV.W 0x0004 (SP)、R14
    1e4a:411F 0006 MOV.W 0x0006 (SP)、R15
    1e4e:12B0 5174调用#_FS_mpy
    1e52:411E 0004 MOV.W 0x0004 (SP)、R14
    1e56:411F 0006 MOV.W 0x0006 (SP)、R15
    1e5a:12B0 5174调用#_FS_mpy
    1e5e:411E 0004 MOV.W 0x0004 (SP)、R14
    1e62:411F 0006 MOV.W 0x0006 (SP)、R15
    1e66:12B0 5174调用#_FS_mpy
    1e6A:4C0E MOV.W R12、R14
    1e6c:4D0F MOV.W R13、R15
    1e6e:490C MOV.W R9、R12
    1e70:4A0D MOV.W R10、R13
    1e72:12B0 3DF0调用#_FS_SUB
    1e76:4C81 0004 MOV.W R12、0x0004 (SP)
    1e7a:4D81 0006 MOV.W R13 0x0006 (SP)

    以下是使用版本21.6的相同部分:

    08C:411C 0008 MOV.W 0x0008 (SP)、R12
    2090:411D 000A MOV.W 0x000A (SP)、R13
    2094:12B0 7ABC 呼叫#_mspabi_cvtfd
    2098:4C08 MOV.W R12、R8
    209A:4D09 MOV.W R13、R9
    209c:4E0A MOV.W R14、R10
    209E:4F0B MOV.W R15、R11
    20a0:403C DD2F MOV.W #0xdd2f、R12
    20a4:403D 0624 MOV.W #0x0624、R13
    20a8:403E 9581 MOV.W #0x9581、R14
    20AC:403F 3FEC MOV.W #0x3fec、R15
    20b0:12B0 4180调用#_mspabi_mpyd
    20b4:4C08 MOV.W R12、R8
    20b6:4D09 MOV.W R13、R9
    20b8:4E0A MOV.W R14、R10
    20ba:4F0B MOV.W R15、R11
    20bc:403C F40A MOV.W #0xf40a、R12
    20c0:403D 3C89 MOV.W #0x3c89、R13
    20c4:403E BA49 MOV.W #0xba49、R14
    20c8:403F BFD0 MOV.W #bbbfd0、R15
    20cc:12B0 1100调用#_mspabi_addd
    20d0:4C81 000c MOV.W R12、0x000c (SP)
    20d4:4D81 000E MOV.W R13 0x000e (SP)
    20d8:4E04 MOV.W R14、R4
    20da:4F06 MOV.W R15、R6
    20dc:411C 0008 MOV.W 0x0008 (SP)、R12
    20e0:411D 000A MOV.W 0x000A (SP)、R13
    20e4:12B0 7ABC 调用#_mspabi_cvtfd
    20e8:4C08 MOV.W R12、R8
    20ea:4D09 MOV.W R13、R9
    20EC:4E0A MOV.W R14、R10
    20ee:4F0B MOV.W R15、R11
    20f0:403C FE32 MOV.W #0xfe32、R12
    20f4:403D F0E0 MOV.W #0xf0e0、R13
    20f8:403E 6C40 MOV.W #0x6c40、R14
    20fc:403F 3F82 MOV.W #0x3f82、R15
    2100:12B0 4180呼叫#_mspabi_mpyd
    2104:4C08 MOV.W R12、R8
    2106:4D09 MOV.W R13、R9
    2108:4E0A MOV.W R14、R10
    210A:4F05 MOV.W R15、R5
    210C:411C 0008 MOV.W 0x0008 (SP)、R12
    2110:411D 000A MOV.W 0x000A (SP)、R13
    2114:12B0 7ABC 呼叫#_mspabi_cvtfd
    2118:450B MOV.W R5、R11
    211A:12B0 4180调用#_mspabi_mpyd
    211e:4118 000c MOV.W 0x000c (SP)、R8
    2122:4119 000E MOV.W 0x000e (SP)、R9
    2126:440A MOV.W R4、R10
    2128:460B MOV.W R6、R11
    212A:12B0 1100调用#_mspabi_addd
    212e:4C81 000c MOV.W R12、0x000c (SP)
    2132:4D81 000E MOV.W R13 0x000e (SP)
    2136:4E04 MOV.W R14、R4
    2138:4F05 MOV.W R15、R5
    213A:411C 0008 MOV.W 0x0008 (SP)、R12
    213e:411D 000A MOV.W 0x000A (SP)、R13
    2142:12B0 7ABC 呼叫#_mspabi_cvtfd
    2146:4C08 MOV.W R12、R8
    2148:4D09 MOV.W R13、R9
    214A:4E0A MOV.W R14、R10
    214c:4F0B MOV.W R15、R11
    214e:403C 4169 MOV.W #0x4169、R12
    2152:403D A883 MOV.W #0xa883、R13
    2156:403E BA56 MOV.W #0xba56、R14
    215A:403F 3F26 MOV.W #0x3f26、R15
    215e:12B0 4180调用#_mspabi_mpyd
    2162:4C08 MOV.W R12、R8
    2164:4D09 MOV.W R13、R9
    2166:4E0A MOV.W R14、R10
    2168:4F06 MOV.W R15、R6
    216A:411C 0008 MOV.W 0x0008 (SP)、R12
    216e:411D 000A MOV.W 0x000A (SP)、R13
    2172:12B0 7ABC 呼叫#_mspabi_cvtfd
    2176:460B MOV.W R6、R11
    2178:12B0 4180调用#_mspabi_mpyd
    217c:4C08 MOV.W R12、R8
    217e:4D09 MOV.W R13、R9
    2180:4E0A MOV.W R14、R10
    2182:4F06 MOV.W R15、R6
    2184:411C 0008 MOV.W 0x0008 (SP)、R12
    2188:411D 000A MOV.W 0x000A (SP)、R13
    218c:12B0 7ABC 呼叫#_mspabi_cvtfd
    2190:460B MOV.W R6、R11
    2192:12B0 4180调用#_mspabi_mpyd
    2196:4118 000c MOV.W 0x000c (SP)、R8
    219a:4119 000E MOV.W 0x000e (SP)、R9
    219e:440A MOV.W R4、R10
    21a0:450B MOV.W R5、R11
    21a2:12B0 844E 调用#_mspabi_subd
    21a6:12B0 6EE6调用#_mspabi_cvtdf
    21AA:4C81 0008 MOV.W R12、0x0008 (SP)
    21ae:4D81 000A MOV.W R13 0x000A (SP)

    正如您看到的、这会显著增加。

    谢谢、

    Marty

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

    您好、Marty、  

    两个项目的优化设置是什么? 这应该可以在项目属性下查看。

    此外、您能否在 MSP430 Compiler 选项卡下检查两个项目的构建选项?  

     根据您的共享反汇编、此处的后台似乎存在一些其他处理/检查。

    此致、
    Brandon Fisher

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

    Brandon、

    前两个版本是3.3.1版、后两个版本是21.1.1版。

    谢谢、

    Marty

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

    您好、Marty、

    看起来前两个映像是相同的、但我看到   您的最后一个映像中 USE_HW_mpy 标志设置为 none、但在前两个映像中不存在。 是否可以尝试删除此标志并查看其是否更改了编译器生成的代码?  

    我不希望这与浮点数学关系太大、但鉴于问题的性质、我们似乎不应忽略编译器/工程差异。  

    此致、
    Brandon Fisher

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

    Brandon、

    我刚刚删除了 USE_HW_mpy 标志语句、它根本不会影响反汇编代码。 我甚至检查了计算时间、它是相同的。 顺便说一下、我忘记提到我看到的 ver3.3.1编译器的时间是2.85mS、而对于 ver21.6编译器、时间是33.45mS、

    此致、

    Marty

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

    您好、Marty、

    即使在反汇编中显示的运算存在差异、 看起来像这样的10倍差异也必须是由于在编译器中处理浮点数学运算的方式发生了实际变化。 我认为它不可能以任何方式发生变化、因为对于像这样没有 FPU 的更简单嵌入式器件、浮点运算执行时间并不是一个大优先级。 您可以继续使用 V3、但 在 v3之后发生的18个或以上的编译器版本更新中、存在许多错误修复和权变措施。

    您可能会考虑切换到 此代码的基于 IQMath 的实现。 如果执行时间很关键、您还可以尝试提高优化级别、以尝试使程序作为一个整体更快地运行。  

    此致、
    Brandon Fisher

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

    Brandon、

    感谢您的所有输入。 我查看了 IQMath 页面、它没有列出 MSP430FG479受支持。 我是对的吗?

    谢谢、

    Marty

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

    您好、Marty、

    很好、我正在检查以确保情况确实如此、但如果是这样、您必须进行一些手动处理、以避免在此处执行浮点数学运算。

    此致、
    Brandon Fisher