搜索
bottom↓
回复: 36

keil中,一个全局变量经常被清零,有什么好的办法查出原因

[复制链接]

出0入0汤圆

发表于 2015-11-26 06:58:10 | 显示全部楼层 |阅读模式
在keil中,我有一个全局变量,经常会被清零,目前的线索如下:

1.我主动进行清零的地方,整个程序中只有一处,在调试模式下,我在该处设置了断点,发生清零事件是时,从未运行到此处断点。
2.程序中用到过指针,也用到过结构体,考虑到了可能是指针越界,通过map文件,找到了这个变量的内存分配地址中的前一个变量,
 一起加入到调试监视的watch1中,发生清零事件是时,前一个变量并没有变化。
3.如果改变一下这个变量声明的位置,比如从后部移到前部,则程序一切正常。

这种问题,不找出来,是很怕的,有什么诊断的好办法呢?谢谢

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-11-26 07:16:39 来自手机 | 显示全部楼层
加写断点,这种断点是硬断点

出0入4汤圆

发表于 2015-11-26 08:07:15 | 显示全部楼层
是不是溢出了?有一次我的RAM多了一个字节,也不报警,在调用固定的子函数时全局变量有时会被清零,子函数有几个局部变量,去掉两个就没事了!

出10入8汤圆

发表于 2015-11-26 08:19:54 | 显示全部楼层
重点查数组的数据溢出。

出0入0汤圆

发表于 2015-11-26 08:29:51 | 显示全部楼层
数组 指针 。。。越界 可能

出0入0汤圆

发表于 2015-11-26 08:33:32 | 显示全部楼层
两中可能
1.缓冲区溢出,
2,堆栈增长覆盖全局变量区域了,这种概率比较大。

出0入0汤圆

发表于 2015-11-26 08:52:59 来自手机 | 显示全部楼层
数据断点,数据变为0时触发断点

出0入0汤圆

发表于 2015-11-26 09:30:40 | 显示全部楼层
多半都是内存溢出造成的,再仔细看看。

出0入0汤圆

发表于 2015-11-26 09:32:10 | 显示全部楼层
一般是数组越界或者野指针等引起。

出0入0汤圆

发表于 2015-11-26 09:56:41 | 显示全部楼层
几点需要注意:
1: 堆栈空间扩大试试;
2:结构体变量定义时考虑处理器的字宽度
3:检查指针赋值;

出0入0汤圆

发表于 2015-11-26 10:09:12 | 显示全部楼层
再提供一个思路,是否有复杂的调用路径?甚至动态的函数指针?
尤其是动态函数指针,编译器遇到这种情况没法完全的分析其调用路径,有可能会造成局部变量物理地址复用过程中覆盖了其他变量.
另外MDK的话,可以用编译器命令强行把这个变量指定在某个地址,debug起来就对着这个地址盯着~
调试器里面可以用命令行的方式下访问断点,hit到这个地址就暂停CPU,不过印象中需要调试器支持,Jlink肯定可以的.

出0入0汤圆

发表于 2015-11-26 10:32:40 | 显示全部楼层
keil不是可以设置条件中断的吗

出0入0汤圆

发表于 2015-11-26 11:16:06 | 显示全部楼层
error_dan 发表于 2015-11-26 10:09
再提供一个思路,是否有复杂的调用路径?甚至动态的函数指针?
尤其是动态函数指针,编译器遇到这种情况没法完 ...

上次遇到這問題就想到應該是這原因,
看了一下 .map ,看此變數 address 前的變數是哪個,
結果就抓到了。

出0入0汤圆

发表于 2015-11-26 11:23:29 | 显示全部楼层
1,是不是在数组后面定义,数组溢出,覆盖了。
2,降低优化等级。
3,加volatile

出0入0汤圆

发表于 2015-11-26 11:29:36 | 显示全部楼层
我在使用C8051F020的时候,也遇到过类似的问题,程序烧录到芯片后,大部分芯片是好用的,执行正确. 但是有10%左右的芯片,总有某些变量莫名其妙的被修改.
有哪位碰到这种情况吗?

出50入8汤圆

发表于 2015-11-26 11:30:09 | 显示全部楼层
本帖最后由 airbox 于 2015-11-26 11:36 编辑

是不是有的函数有很多局部变量,是的话,把局部变量前全部加上static,如果问题解决,那么就是堆栈的问题

出0入0汤圆

发表于 2015-11-26 12:04:37 | 显示全部楼层
堆栈溢出、数组、指针溢出等等。

出0入4汤圆

发表于 2015-11-27 09:05:37 | 显示全部楼层
昨天我还碰到类似的问题。就是数组越界,影响了别的变量。楼主好好查查

出0入0汤圆

发表于 2015-11-27 09:08:09 | 显示全部楼层
f1yh1347 发表于 2015-11-26 07:16
加写断点,这种断点是硬断点

顶这个,
使用硬断点

出0入0汤圆

发表于 2015-11-27 23:46:10 来自手机 | 显示全部楼层
7楼正解,数据条件断点。全局变量被意外修改,一般是数组或指针访问越界。也有可能栈空间太小,编译器分配的局部变量地址和全局变量地址重叠!

出0入0汤圆

 楼主| 发表于 2015-11-28 07:33:12 | 显示全部楼层
已解决,不过只知道和一个自编的求极值函数有关,还是和数据类型的定义有关
之前出问题是是这样调用的:I_result=GetMinMaxNum( 1,i1,i2,i3,i4,0,0,0,0,0,0,0,0,0,0,0,0);


修改OK后是这样的:I_result=(uint32_t )GetMinMaxNum( 1,(float)i1,(float)i2,(float)i3,(float)i4,0,0,0,0,0,0,0,0,0,0,0,0);

//从16个数浮点数中找出极大值,极小值
//Imode:  1 求极大值  0 求极小值
// f0-f15,数据输入;
float GetMinMaxNum(char iMode,float f0,float f1,float f2,float f3,float f4,float f5,float f6,float f7,float f8,float f9,float f10,float f11,float f12,float f13,float f14,float f15)
{
        float ftmp[16];
        char i1,Iindex;
       
        ftmp[0]=f0;        ftmp[1]=f1;        ftmp[2]=f2;                ftmp[3]=f3;                ftmp[4]=f4;                ftmp[5]=f5;                ftmp[6]=f6;                ftmp[7]=f7;
        ftmp[8]=f8;        ftmp[9]=f9;        ftmp[10]=f10;        ftmp[11]=f11;        ftmp[12]=f12;        ftmp[13]=f13;        ftmp[14]=f14;        ftmp[15]=f15;

       
        Iindex=0;
       
        for ( i1=0;i1!=16;++i1)
{
  if (iMode && (ftmp[Iindex ] < ftmp[i1]))
   Iindex=i1;                                                                                                                                                                                                                                                //单语句时可以省略花括号
  else if (!iMode && (ftmp[Iindex] > ftmp[i1]))
   Iindex=i1;                                                                                                                                                                                                                                                //单语句时可以省略花括号
}

return ftmp[Iindex ];

       
}

出0入0汤圆

发表于 2015-11-28 08:42:09 | 显示全部楼层
这是51 这种IC的典型症状  因为资源不够用,你得紧着用。

出0入0汤圆

 楼主| 发表于 2015-11-29 06:20:07 | 显示全部楼层
wind2100 发表于 2015-11-28 08:42
这是51 这种IC的典型症状  因为资源不够用,你得紧着用。

我这个不是51,应该是cortex-m3的,NXP1768

出0入0汤圆

发表于 2015-11-29 07:56:10 | 显示全部楼层
16个浮点变量直接传递,而不用指针,也是醉了。

出0入0汤圆

 楼主| 发表于 2015-11-29 08:41:08 | 显示全部楼层
zsmbj 发表于 2015-11-29 07:56
16个浮点变量直接传递,而不用指针,也是醉了。

这个函数,一直没做满意,本来想做一个包括8\16\32位,实数的比较的,变量声明不好处理,就变成这样了

出0入0汤圆

发表于 2015-11-30 09:05:30 | 显示全部楼层
popo_new 发表于 2015-11-28 07:33
已解决,不过只知道和一个自编的求极值函数有关,还是和数据类型的定义有关
之前出问题是是这样调用的:I_re ...

楼主新手吗?  传参数,一般最多3个,像你这种 直接做一个结构体,传入指针就好了。
像你这样效率很低的。

出0入0汤圆

发表于 2015-11-30 09:22:16 | 显示全部楼层
肯定是越界或者溢出了

出200入0汤圆

发表于 2015-12-9 01:07:12 | 显示全部楼层
楼主,对你这写的程序无语了

出0入0汤圆

发表于 2015-12-9 13:10:54 | 显示全部楼层

加写断点,这种断点是硬断点

出0入0汤圆

发表于 2015-12-9 13:26:31 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-12-30 10:29:16 | 显示全部楼层
今年年末见识到了函数和单片机的强大

出0入17汤圆

发表于 2015-12-30 10:42:55 | 显示全部楼层
年末见识到了函数和单片机的强大

出0入0汤圆

发表于 2015-12-30 10:44:47 | 显示全部楼层
这样传递参数,看的就纠结

出0入0汤圆

发表于 2015-12-30 10:58:29 | 显示全部楼层
被这串参数吓到了

出0入4汤圆

发表于 2015-12-30 11:56:04 | 显示全部楼层
别的地方数组有溢出没有,我遇到过

出0入0汤圆

发表于 2015-12-30 11:56:39 | 显示全部楼层
要是论坛要评十大某某代码,我为此投一票...

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 05:22

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

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