popo_new 发表于 2015-11-26 06:58:10

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

在keil中,我有一个全局变量,经常会被清零,目前的线索如下:

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

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

f1yh1347 发表于 2015-11-26 07:16:39

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

langbaiyue 发表于 2015-11-26 08:07:15

是不是溢出了?有一次我的RAM多了一个字节,也不报警,在调用固定的子函数时全局变量有时会被清零,子函数有几个局部变量,去掉两个就没事了!

lengqing1309 发表于 2015-11-26 08:19:54

重点查数组的数据溢出。

ziho2005 发表于 2015-11-26 08:29:51

数组 指针 。。。越界 可能

semonpic 发表于 2015-11-26 08:33:32

两中可能
1.缓冲区溢出,
2,堆栈增长覆盖全局变量区域了,这种概率比较大。

liandao 发表于 2015-11-26 08:52:59

数据断点,数据变为0时触发断点

jzkn 发表于 2015-11-26 09:30:40

多半都是内存溢出造成的,再仔细看看。

farfar 发表于 2015-11-26 09:32:10

一般是数组越界或者野指针等引起。

asbzhang 发表于 2015-11-26 09:56:41

几点需要注意:
1: 堆栈空间扩大试试;
2:结构体变量定义时考虑处理器的字宽度
3:检查指针赋值;

error_dan 发表于 2015-11-26 10:09:12

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

zhugean 发表于 2015-11-26 10:32:40

keil不是可以设置条件中断的吗

jarodzz 发表于 2015-11-26 11:16:06

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

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

Excellence 发表于 2015-11-26 11:23:29

1,是不是在数组后面定义,数组溢出,覆盖了。
2,降低优化等级。
3,加volatile

WindDragon 发表于 2015-11-26 11:29:36

我在使用C8051F020的时候,也遇到过类似的问题,程序烧录到芯片后,大部分芯片是好用的,执行正确. 但是有10%左右的芯片,总有某些变量莫名其妙的被修改.
有哪位碰到这种情况吗?

airbox 发表于 2015-11-26 11:30:09

本帖最后由 airbox 于 2015-11-26 11:36 编辑

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

rain73 发表于 2015-11-26 12:04:37

堆栈溢出、数组、指针溢出等等。

bolizhicheng204 发表于 2015-11-27 09:05:37

昨天我还碰到类似的问题。就是数组越界,影响了别的变量。楼主好好查查

jm2011 发表于 2015-11-27 09:08:09

f1yh1347 发表于 2015-11-26 07:16
加写断点,这种断点是硬断点

顶这个,
使用硬断点

lingdianhao 发表于 2015-11-27 23:46:10

7楼正解,数据条件断点。全局变量被意外修改,一般是数组或指针访问越界。也有可能栈空间太小,编译器分配的局部变量地址和全局变量地址重叠!

popo_new 发表于 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;
        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;

       
}

wind2100 发表于 2015-11-28 08:42:09

这是51 这种IC的典型症状因为资源不够用,你得紧着用。

popo_new 发表于 2015-11-29 06:20:07

wind2100 发表于 2015-11-28 08:42
这是51 这种IC的典型症状因为资源不够用,你得紧着用。

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

zsmbj 发表于 2015-11-29 07:56:10

16个浮点变量直接传递,而不用指针,也是醉了。

popo_new 发表于 2015-11-29 08:41:08

zsmbj 发表于 2015-11-29 07:56
16个浮点变量直接传递,而不用指针,也是醉了。

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

wind2100 发表于 2015-11-30 09:05:30

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

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

wuguoyan 发表于 2015-11-30 09:22:16

肯定是越界或者溢出了

zjr0411 发表于 2015-12-9 01:07:12

楼主,对你这写的程序无语了{:lol:}

embedded2015 发表于 2015-12-9 13:10:54


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

308594151 发表于 2015-12-9 13:26:31

mark一下

ggchao 发表于 2015-12-30 10:29:16

今年年末见识到了函数和单片机的强大

pipi516 发表于 2015-12-30 10:42:55

年末见识到了函数和单片机的强大

pxclihai 发表于 2015-12-30 10:44:47

这样传递参数,看的就纠结

huangqi412 发表于 2015-12-30 10:58:29

被这串参数吓到了

bolizhicheng204 发表于 2015-12-30 11:56:04

别的地方数组有溢出没有,我遇到过

daFish 发表于 2015-12-30 11:56:39

要是论坛要评十大某某代码,我为此投一票...{:smile:}

chxaitz 发表于 2015-12-30 16:32:04

M3的单片机,性能还是蛮强大的~
页: [1]
查看完整版本: keil中,一个全局变量经常被清零,有什么好的办法查出原因