我在使用TMS320F2.8335万时遇到了一个奇怪的问题。
当我对浮点数执行简单的'大于'比较时,比较有时似乎给出了错误的结果。
为了精确定位问题,我测试了以下代码:
如果(test_variable > 100.0)
{
pjup++;
asm (" MOV32 @_pregvalue, R0H");
pjumpvalue = test_variable;
test_variable = 100.0 ;
}
IF (test_variable < 0.0)
{
njump++;
ASM(" MOV32 @_nregvalue, R0H");
njumpvalue = test_variable;
test_variable = 0.0 ;
}
ASM()命令将R0H寄存器的值放入pregvalue或nregvalue变量中,该寄存器是将test_variable移动到其中以在输出.asm文件中执行浮点比较的寄存器(大小写相同)。
我通过串行端口输出这些变量的值来定期监控它们的值。 该数据清楚地显示,即使test_variable的值低于100.0 ,在执行IF (test_variable > 100.0)之后,代码块有时(看似随机)仍会被阻止。 这种情况发生的频率是,例如,每隔几小时发生一次。 但是,第二次(<)比较从未发现同样的情况。
这是一个已知问题吗? 使用 __fmin()和__fmax()函数代替if()测试似乎可以解决这个问题,但我仍然觉得有点麻烦。
提前感谢!
Laurent Badel
有关信息,生成的装配体的相关部分如下-我看不到任何错误:
MOV32 R0H,@Ω test_variable
CMPF32 R0H,#1.7096万
MOVST0 ZF,NF
BF $C$L16,GT
...
$C$L16:
inc @_pjump
MOV32 @_pregvalue,R0H
MOVL ACC,@ test_variable
MOVL @_pjumpvalue,附件
MOVIZ R0H,#1.7096万
MOV32 @_test_variable,R0H





