keil中,一个全局变量经常被清零,有什么好的办法查出原因
在keil中,我有一个全局变量,经常会被清零,目前的线索如下:1.我主动进行清零的地方,整个程序中只有一处,在调试模式下,我在该处设置了断点,发生清零事件是时,从未运行到此处断点。
2.程序中用到过指针,也用到过结构体,考虑到了可能是指针越界,通过map文件,找到了这个变量的内存分配地址中的前一个变量,
一起加入到调试监视的watch1中,发生清零事件是时,前一个变量并没有变化。
3.如果改变一下这个变量声明的位置,比如从后部移到前部,则程序一切正常。
这种问题,不找出来,是很怕的,有什么诊断的好办法呢?谢谢 加写断点,这种断点是硬断点 是不是溢出了?有一次我的RAM多了一个字节,也不报警,在调用固定的子函数时全局变量有时会被清零,子函数有几个局部变量,去掉两个就没事了! 重点查数组的数据溢出。 数组 指针 。。。越界 可能 两中可能
1.缓冲区溢出,
2,堆栈增长覆盖全局变量区域了,这种概率比较大。 数据断点,数据变为0时触发断点 多半都是内存溢出造成的,再仔细看看。 一般是数组越界或者野指针等引起。 几点需要注意:
1: 堆栈空间扩大试试;
2:结构体变量定义时考虑处理器的字宽度
3:检查指针赋值; 再提供一个思路,是否有复杂的调用路径?甚至动态的函数指针?
尤其是动态函数指针,编译器遇到这种情况没法完全的分析其调用路径,有可能会造成局部变量物理地址复用过程中覆盖了其他变量.
另外MDK的话,可以用编译器命令强行把这个变量指定在某个地址,debug起来就对着这个地址盯着~
调试器里面可以用命令行的方式下访问断点,hit到这个地址就暂停CPU,不过印象中需要调试器支持,Jlink肯定可以的. keil不是可以设置条件中断的吗 error_dan 发表于 2015-11-26 10:09
再提供一个思路,是否有复杂的调用路径?甚至动态的函数指针?
尤其是动态函数指针,编译器遇到这种情况没法完 ...
上次遇到這問題就想到應該是這原因,
看了一下 .map ,看此變數 address 前的變數是哪個,
結果就抓到了。 1,是不是在数组后面定义,数组溢出,覆盖了。
2,降低优化等级。
3,加volatile 我在使用C8051F020的时候,也遇到过类似的问题,程序烧录到芯片后,大部分芯片是好用的,执行正确. 但是有10%左右的芯片,总有某些变量莫名其妙的被修改.
有哪位碰到这种情况吗? 本帖最后由 airbox 于 2015-11-26 11:36 编辑
是不是有的函数有很多局部变量,是的话,把局部变量前全部加上static,如果问题解决,那么就是堆栈的问题 堆栈溢出、数组、指针溢出等等。 昨天我还碰到类似的问题。就是数组越界,影响了别的变量。楼主好好查查 f1yh1347 发表于 2015-11-26 07:16
加写断点,这种断点是硬断点
顶这个,
使用硬断点 7楼正解,数据条件断点。全局变量被意外修改,一般是数组或指针访问越界。也有可能栈空间太小,编译器分配的局部变量地址和全局变量地址重叠! 已解决,不过只知道和一个自编的求极值函数有关,还是和数据类型的定义有关
之前出问题是是这样调用的: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;
char i1,Iindex;
ftmp=f0; ftmp=f1; ftmp=f2; ftmp=f3; ftmp=f4; ftmp=f5; ftmp=f6; ftmp=f7;
ftmp=f8; ftmp=f9; ftmp=f10; ftmp=f11; ftmp=f12; ftmp=f13; ftmp=f14; ftmp=f15;
Iindex=0;
for ( i1=0;i1!=16;++i1)
{
if (iMode && (ftmp < ftmp))
Iindex=i1; //单语句时可以省略花括号
else if (!iMode && (ftmp > ftmp))
Iindex=i1; //单语句时可以省略花括号
}
return ftmp;
} 这是51 这种IC的典型症状因为资源不够用,你得紧着用。 wind2100 发表于 2015-11-28 08:42
这是51 这种IC的典型症状因为资源不够用,你得紧着用。
我这个不是51,应该是cortex-m3的,NXP1768 16个浮点变量直接传递,而不用指针,也是醉了。 zsmbj 发表于 2015-11-29 07:56
16个浮点变量直接传递,而不用指针,也是醉了。
这个函数,一直没做满意,本来想做一个包括8\16\32位,实数的比较的,变量声明不好处理,就变成这样了 popo_new 发表于 2015-11-28 07:33
已解决,不过只知道和一个自编的求极值函数有关,还是和数据类型的定义有关
之前出问题是是这样调用的:I_re ...
楼主新手吗?传参数,一般最多3个,像你这种 直接做一个结构体,传入指针就好了。
像你这样效率很低的。 肯定是越界或者溢出了 楼主,对你这写的程序无语了{:lol:}
加写断点,这种断点是硬断点 mark一下 今年年末见识到了函数和单片机的强大 年末见识到了函数和单片机的强大 这样传递参数,看的就纠结 被这串参数吓到了 别的地方数组有溢出没有,我遇到过 要是论坛要评十大某某代码,我为此投一票...{:smile:} M3的单片机,性能还是蛮强大的~
页:
[1]