打印

出现stack overflow 是什么原因

[复制链接]
3984|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elecqht|  楼主 | 2007-11-23 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
69P55的有8层的stack(包括中断)
我没有用到中断,在程序中最深是5层的嵌套调用,为什么会出现stack overflow
是不是程序刚开始需要初始化Stack?或是其他原因?

另一个问题:我的MCU检测到点阵LCM的BUSY标志位一直为1,即LCM一直处于忙,导致无法显示,这是为什么?
沙发
warm_ice| | 2007-11-23 17:43 | 只看该作者

这样

stack overflow是报堆栈溢出错误,应该是堆栈超出了8层,此时程序会停下来,排除工具的问题,应该查一下程序,肯定是出现了异常。

堆栈不需要初始化。

中颖仿真软件IDE66配合ICE66 USB,有一个TRACE的功能,当程序停下来后,按CTRL+T,此时会弹出一个TRACE的窗口,它会将停下来之前的8K程序记录下来,便于查询程序是如果跑的。

LCM一直BUSY,不清楚你用的是什么LCM,不好讲,需要提供更多的资料。

使用特权

评论回复
板凳
elecqht|  楼主 | 2007-11-24 10:41 | 只看该作者

程序刚开始时stack为什么不为空

程序刚开始运行时,IDE66D的register窗口stack出现这样的情况:
SO.CY       0
SO.PC      006
SO.CY       0
SO.PC      411
SO.CY       1
SO.PC      30A
SO.CY       0
SO.PC      000
SO.CY       0
SO.PC      000
SO.CY       0
SO.PC      000
SO.CY       0
SO.PC      000
SO.CY       0
SO.PC      006

我RESET后也一样,仍然为上次仿真完stack的数据,为什么不是全0了?难道这只是register窗口显示的假象而实际已经是为空的?
另外可不可以对STACK进行写?

还有我按下CTRL+T并未出现什么窗口,这又是为什么?

使用特权

评论回复
地板
elecqht|  楼主 | 2007-11-24 11:56 | 只看该作者

情况是这样的

PORTI    EQU    0390H
PICTL    EQU    0395H
CACHE    EQU    30H
ORG    0000H
JMP    MAIN
NOP
RTNI
RTNI
NOP

ORG    0005H
MAIN:
LDI    CACHE,08H
STA    PICTL
LDI    CACHE,08H
STA    PORTI
NOP
END

我拿这个小程序用go from reset 运行时,大概几秒到几十秒不等就提示stack overflow ,哪怕是在END前加了JMP  MAIN也一样
难道是我的MiniICE66/EVE/IDE66 哪个设置不对?

使用特权

评论回复
5
kixh| | 2007-11-24 23:04 | 只看该作者

我也出现过这种情况

在仿真的时候,如果在某处打个断点,一般不会出现stack overflow ,但是睡眠后醒来,第一次进入那个断点的时候还正常,再次运行就有时出现了stack overflow ,不知道是什么原因啊,我用的69P20,是程序造成的么?

使用特权

评论回复
6
warm_ice| | 2007-11-26 10:32 | 只看该作者

回复elecqht:

1.看了一下您的程序,并实际跑了一下,没有出现堆栈溢出的错误。
2.RESET后您看到STACK中数据不为0,实际上已经为零了,因为在跑程序的时候这些数据才会更新。
3.如果您用的是MINI ICE的话,是没有我说的程序跟踪的功能的。
4.建议您去中颖网站下载一下SH69P55 EVB的使用说明,根据该说明详细设置一下EVB,应该可以解决这个问题。

回复kixh:
    我想您的问题,应该是程序中中断处理及返回没有处理好,或者是程序异常造成的,仔细检查程序肯定可以检查出来。

使用特权

评论回复
7
yxh668| | 2007-12-17 11:14 | 只看该作者

我有这样试过

如果你的IDE66连接的40针线过长或有问题,有可能会出现这样的情况.不妨检查一下.

使用特权

评论回复
8
elecqht|  楼主 | 2007-12-19 10:58 | 只看该作者

这样

到目前为止,我也没找到出现这情况的原因,现在我的做法是直接把仿真板上的
STKOVE的跳线取掉了,不知是否妥当

使用特权

评论回复
9
warm_ice| | 2007-12-19 12:17 | 只看该作者

这样

还是要仔细查程序,尤其是调用子程序的部分,把跳线取下,只是治标的方法,不是治本的方法,这样始终会有隐患存在.

使用特权

评论回复
10
elecqht|  楼主 | 2007-12-19 13:39 | 只看该作者

始终想不明白

这程序包含按键,LCD显示,和通信模块,如果真是堆栈溢出,应该会有异常,可目前我这么做还没发现有什么异常的现象。
另外前面我曾经做过一个试验,没中断只有一个子程序调用的情况下都会出现stack overflow 所以就干脆把跳线取了

使用特权

评论回复
11
warm_ice| | 2007-12-19 14:48 | 只看该作者

是比较难查

这种情况是比较难查,有个方法,当提示堆栈溢出时,程序会停下来,停到哪一条指令上,你就从这条指令往回查,看看是什么原因造成堆栈溢出的.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

44

帖子

0

粉丝