CodeWarrior编译器警告:“可能丢失数据”

时间:2013-04-11 13:48:44

标签: c compiler-warnings microcontroller codewarrior analog-digital-converter

请考虑以下代码:

unsigned int  beta;

unsigned int theta;

unsigned int m = 4;

unsigned int c = 986;

unsigned int Rpre = 49900;



unsigned int getUAnalog(unsigned char channel) // to get the PT1000 Signal

{

unsigned int result;

unsigned int f_temp;

//select channel and initiate conversion

ADCSC1 |= (channel & 0b11111);



//wait until conversion is complete

while(!ADCSC1_COCO);



f_temp = ADCRH;

f_temp <<= 8;

f_temp += ADCRL;



beta = (((f_temp) / (4096*28))*1000); // warning: possible loss of data.

theta = ((((beta)*(Rpre))/(1-beta))*1000);

result = (theta-c)/(m);

return result;
}

我在CodeWarrior版本5.9.0上使用MC9S08DZ60(http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08DZ60.pdf)和PT1000温度传感器。此函数用于计算温度和返回“结果”。但“beta”和“theta”值仍为0.无变化。

此外,我收到警告为C2705:可能的数据丢失。 “结果”的值不对。请帮忙,因为我不知道出了什么问题!!

提前致谢!

1 个答案:

答案 0 :(得分:3)

您的4096*28不符合16位无符号整数,并且会被截断,导致错误的结果,这就是您收到警告的原因。

但最重要的是......

beta = (((f_temp) / (4096*28))*1000); // warning: possible loss of data.

theta = ((((beta)*(Rpre))/(1-beta))*1000);

result = (theta-c)/(m);

相当于

beta = (((f_temp) / (4096*28))*1000);

theta = ((((beta)*(49900))/(1-beta))*1000);

result = (theta-986)/(4);

反过来相当于:

result = ((((((((f_temp) / (4096*28))*1000))*(49900))/(1-(((f_temp) / (4096*28))*1000)))*1000)-986)/(4)

如果您plot it,您会看到discontinuity at f_temp = 14336/125 ≈ 115the range of result is from -986/4 (≈-247) at f_temp=0 to ≈-4*109 at f_temp=115 or -∞ at f_temp=14336/125

这表明你做错了什么(你有错误的公式或常数)或者你没有给我们足够的信息(f_temp的有效范围会很好)。由于result的范围,使用整数算法进行这些计算会有问题。