【求助】变量自己变化,推测是栈溢出,但不是很懂,求解
- UID
- 805027
- 性别
- 男
|
【求助】变量自己变化,推测是栈溢出,但不是很懂,求解
小弟在编写程序中会莫名出现设置的变量值会自己变化的情况,最近就专门想弄清楚。查阅相关资料,感觉是栈溢出了,但又找不出问题在哪,特来向各位前辈求教。
小弟有个word型的全局变量SlfLrnValue,只在初始化是设为0,但程序运行一会儿后值就会变化,使用watchpoint观察何时变量会被写入,每次程序都是停在保存AD数值函数的结尾处,发现SlfLrnValue的值,与保存AD值函数的变量(word *)Values的值相同,与寄存器A的值相同,是寄存器HX的前两位。
但函数byte ADSamp_GetValue16(word *Values)是有PE自动生成的,而调用程序为
void ADSamp_OnEnd(void)
{
/* Write your code here ... */
if(ADSamp_GetValue16(ADVal)==ERR_OK)
ProgFlag.Bits.bADEnd = 1;
}
个人感觉也没有问题,其中ADVal定义为word ADVal[11];
恳请各位前辈指点,谢谢! |
|
|
|
|
|
- UID
- 805027
- 性别
- 男
|
本帖最后由 yanbin560 于 2013-10-12 13:16 编辑
1# yanbin560
进一步调试,在程序正常时,单步执行AD采样程序时,11路通道是逐步执行,出现异常时,每采样一个通道,都要跳到函数结束处的“}”处,同时AD值的高位就赋值给了变量SlfLrnValue
PE自动生成的AD值保存程序如下:
byte ADSamp_GetValue16(word *Values)
{
if (!OutFlg) { /* Is output flag set? */
return ERR_NOTAVAIL; /* If no then error */
}
Values[0] = (word)((ADSamp_OutV[0]) << 2); /* Save measured values to the output buffer */
Values[1] = (word)((ADSamp_OutV[1]) << 2); /* Save measured values to the output buffer */
Values[2] = (word)((ADSamp_OutV[2]) << 2); /* Save measured values to the output buffer */
Values[3] = (word)((ADSamp_OutV[3]) << 2); /* Save measured values to the output buffer */
。 。
。 。
。 。
Values[10] = (word)((ADSamp_OutV[10]) << 2); /* Save measured values to the output buffer */
return ERR_OK; /* OK */
}
在正确执行时,Values的值是ADVal[11]的地址,此时单步执行,就会一条一条语句顺序执行,一旦出错,程序会停在该程序的“}”处,运行下一步,会跳到“Values[3] = (word)((ADSamp_OutV[3]) << 2); ”,此时,指针Values的值是数组的地址,再执行下一步,程序不会到Values[4],而是直接跳到“}”,这个时候,Values的地址就变成了变量SlfLrnVal的地址了,同时,Values的内容和SlfLrnVal都变成了ADSamp_OutV[3]) 的高位字节了,再执行下一步,会跳到Values[4]的赋值,在执行下一步,又跳到“}”,同时SlfLrnVal的值发生变化,如此循环
同时,我发现,在出错时是无法再函数里设置断点的,而我在函数内设个静态指针来观察Values的值时,即在赋值前,p=Values,就不会发生异常了 |
-
-
正常.png
(71.04 KB)
-
-
异常1.png
(74.13 KB)
-
-
异常2.png
(74.13 KB)
-
-
异常3.png
(73.89 KB)
|
|
|
|
|
- UID
- 805027
- 性别
- 男
|
|
|
|
|
|