首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【求助】变量自己变化,推测是栈溢出,但不是很懂,求解

【求助】变量自己变化,推测是栈溢出,但不是很懂,求解

小弟在编写程序中会莫名出现设置的变量值会自己变化的情况,最近就专门想弄清楚。查阅相关资料,感觉是栈溢出了,但又找不出问题在哪,特来向各位前辈求教。
小弟有个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];
恳请各位前辈指点,谢谢!
本帖最后由 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)

正常.png

异常1.png (74.13 KB)

异常1.png

异常2.png (74.13 KB)

异常2.png

异常3.png (73.89 KB)

异常3.png

2# yanbin560
求各位前辈指教
返回列表