前两天,又有工程师报错搞不定。说用Freescale单片机出了莫名其妙的问题。大概说到用此单片机做计算,传感器输入数据,滤波后输出。奇怪的是滤波输出值为0后,不管输入为多少,输出总为0;
我开始初看了一下代码,没有什么问题啊。但结果真的就是上面描述的样子。没脾气,撸起袖子干吧。
环境描述:
单片机:Freescale的MC9S08QE
开发平台:Freescale CodeWarrior IDE V6.2
滤波大概的计算,简化下来,可认为是 a=(a+b)/2,b为传感器实时值。查来查去,好像这一句有问题。但实在想不出问题在哪里。于是,调吧!
开始很正常,但发现a小到一定值(如小于2^-32)时,问题来了。我发现a+b=a!我这才恍然大悟。
这个应该是Freescale编译器问题,浮点的加法运算,它好像始终以a为参考数进行移位计算,而这样会造成数据溢出错误的。
我将计算表达式改为a=(b+a)/2就避免了此问题(b为AD采样后转化成的浮点数)。更加验证我的猜想。
同样的代码,在Keil中编译就没有类似问题。
飞言走笔 2011-1-12 11:56
shaoziyang 2011-1-11 14:28