hh14424 发表于 2014-5-21 16:01:25

keil软件全速运行与单步调试得出的值不一样

采样程序部分如下,
                              if(8<=RESULT_temp<=80)
                              {
                              AD_OUT = RESULT_temp* 10;
                              AD_OUT =      AD_OUT/80;
                              AD_OUT = AD_OUT+2;
                              AL_AD_OUT = RESULT_temp;
                              }

在用keil软件编译时,程序全速运行时,假如RESULT_temp值为74时,串口输出的AD_OUT的值却为6,这显然是不正确的,还有不论有没有AD_OUT = AD_OUT+2; 这条程序,AD_OUT 的值一直是6,即AD_OUT = AD_OUT+2 这条指令根本没起作用。但是当我单步调试此段程序时,AD_OUT依次得到的数值为740,9,11;
单步调试的结果都正确,全速运行得到的却是错误结果,我的AD采样程序是放在中断函数中每隔3ms采样一次,本来觉得是采样中断与主程序的定时中断冲突了,就把AD采样程序从中断函数中拿出来直接放在主程序中,但是这样得到的结果还是原来的值。

烦请各位帮忙分析下是什么原因

devcang 发表于 2014-5-22 08:26:39

RESULT_temp* 10;
假如RESULT_temp值为74时,那结果是什么?不同的数据类型,结果略有不同。


故数据是什么类型都不知道,没法准确判断

AD_OUT,猜是unsigned char的。给740,值会是什么呢。

linbin250 发表于 2014-5-22 08:50:36

把这3行给合并了
AD_OUT = RESULT_temp* 10;
AD_OUT =      AD_OUT/80;
AD_OUT = AD_OUT+2;

这样测试一下!
AD_OUT = (RESULT_temp* 10.0/80.0+2);

hh14424 发表于 2014-5-22 10:31:10

devcang 发表于 2014-5-22 08:26
RESULT_temp* 10;
假如RESULT_temp值为74时,那结果是什么?不同的数据类型,结果略有不同。



AD_OUT定义的是unsigned long
当为74时,最终输出值应该是11

hh14424 发表于 2014-5-22 10:32:40

linbin250 发表于 2014-5-22 08:50
把这3行给合并了
AD_OUT = RESULT_temp* 10;
AD_OUT =      AD_OUT/80;


合并在一起计算过了,不起作用,我定义的是长整型,不是需要输出小数

linbin250 发表于 2014-5-22 11:10:48

AD_OUT = RESULT_temp* 10;
AD_OUT =      AD_OUT/80;
AD_OUT = AD_OUT+2;

认真看了一下,先乘以10,再除以80.不就是除以8么?改成 除以8后+2不是就好了?想不明白。。。

hh14424 发表于 2014-5-22 11:53:05

linbin250 发表于 2014-5-22 11:10
AD_OUT = RESULT_temp* 10;
AD_OUT =      AD_OUT/80;
AD_OUT = AD_OUT+2;


因为我这是拆开写了,10和80是采集到的数值,我在这里只不过是写出来了,如果用一个公式,那就是10和80

xunke 发表于 2014-6-16 23:40:59

问题解决了没?

ywhbn 发表于 2014-6-17 07:55:16

if(8<=RESULT_temp<=80) 这句写法有问题,不管RESULT_temp是什么值,计算结果都是true

8 <= RESULT_temp && RESULT_temp <= 80

wcl_0308 发表于 2014-6-22 07:21:20

if(RESULT_temp >=8 &RESULT_temp<=80)试试这个

joystring 发表于 2014-6-22 09:07:56

我遇到过全速运行芯片发生硬件错误,死掉了,单步不会死,M0内核的芯片,没搞清楚为什么0

kinsno 发表于 2014-6-22 09:52:54

我也碰到过这种情况,但是一般加延时就搞定了,因为单步调试,实际上的情况是人为在断点后面加进去了延时;
PS :至于为啥加了延时就好,得具体分析啦!

lsx007 发表于 2014-6-22 10:08:48

目测if语句问题,10楼少了个&
页: [1]
查看完整版本: keil软件全速运行与单步调试得出的值不一样