我继承的最初在版本3.1.1上编译的固件使用多个双浮点数/计算。 当切换到 V21.6或 V21.1.1编译器时、简单的双精度计算不起作用。 这是已知问题吗?
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.
我继承的最初在版本3.1.1上编译的固件使用多个双浮点数/计算。 当切换到 V21.6或 V21.1.1编译器时、简单的双精度计算不起作用。 这是已知问题吗?
因此、我开始这个过程的原因是、计算的两个双精度数实际上是每次调用函数时计算的常量(同时浪费 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
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、
即使在反汇编中显示的运算存在差异、 看起来像这样的10倍差异也必须是由于在编译器中处理浮点数学运算的方式发生了实际变化。 我认为它不可能以任何方式发生变化、因为对于像这样没有 FPU 的更简单嵌入式器件、浮点运算执行时间并不是一个大优先级。 您可以继续使用 V3、但 在 v3之后发生的18个或以上的编译器版本更新中、存在许多错误修复和权变措施。
您可能会考虑切换到 此代码的基于 IQMath 的实现。 如果执行时间很关键、您还可以尝试提高优化级别、以尝试使程序作为一个整体更快地运行。
此致、
Brandon Fisher