搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2014-5-21 16:01:25 | 显示全部楼层 |阅读模式
采样程序部分如下,
                                if(8<=RESULT_temp[i]<=80)
                                {
                                AD_OUT[i] = RESULT_temp[i]* 10;
                                AD_OUT[i] =        AD_OUT[i]/80;
                                AD_OUT[i] = AD_OUT[i]+2;
                                AL_AD_OUT[i] = RESULT_temp[i];
                                }

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-5-22 08:26:39 | 显示全部楼层
RESULT_temp[i]* 10;
假如RESULT_temp[i]值为74时,那结果是什么?不同的数据类型,结果略有不同。


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

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

出0入10汤圆

发表于 2014-5-22 08:50:36 | 显示全部楼层
把这3行给合并了
AD_OUT[i] = RESULT_temp[i]* 10;
AD_OUT[i] =        AD_OUT[i]/80;
AD_OUT[i] = AD_OUT[i]+2;

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2014-5-22 10:32:40 | 显示全部楼层
linbin250 发表于 2014-5-22 08:50
把这3行给合并了
AD_OUT = RESULT_temp* 10;
AD_OUT =        AD_OUT/80;

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

出0入10汤圆

发表于 2014-5-22 11:10:48 | 显示全部楼层
AD_OUT[i] = RESULT_temp[i]* 10;
AD_OUT[i] =        AD_OUT[i]/80;
AD_OUT[i] = AD_OUT[i]+2;

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

出0入0汤圆

 楼主| 发表于 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

出0入112汤圆

发表于 2014-6-16 23:40:59 | 显示全部楼层
问题解决了没?

出0入0汤圆

发表于 2014-6-17 07:55:16 | 显示全部楼层
if(8<=RESULT_temp[i]<=80) 这句写法有问题,不管RESULT_temp[i]是什么值,计算结果都是true

8 <= RESULT_temp[i] && RESULT_temp[i] <= 80

出0入0汤圆

发表于 2014-6-22 07:21:20 | 显示全部楼层
if(RESULT_temp[i] >=8 &RESULT_temp[i]<=80)试试这个

出0入0汤圆

发表于 2014-6-22 09:07:56 来自手机 | 显示全部楼层
我遇到过全速运行芯片发生硬件错误,死掉了,单步不会死,M0内核的芯片,没搞清楚为什么0

出0入0汤圆

发表于 2014-6-22 09:52:54 | 显示全部楼层
我也碰到过这种情况,但是一般加延时就搞定了,因为单步调试,实际上的情况是人为在断点后面加进去了延时;
PS :至于为啥加了延时就好,得具体分析啦!

出0入0汤圆

发表于 2014-6-22 10:08:48 来自手机 | 显示全部楼层
目测if语句问题,10楼少了个&
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表