打印

51单片机SP指针为什么自动被设置成这么高?

[复制链接]
11023|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiyiche|  楼主 | 2009-6-2 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    程序突然莫名跑飞,后来查了一下堆栈指针,发现在进入MAIN函数之前,它是0x07,进入MAIN函数之后,它的值达到0x7e,一压栈就达到0x80以上,难怪出栈的时候没办法正确出栈,导致程序跑飞。
    刚开始我以为全局变量太多了,把全局变量删减了一大半,可程序还是依然会跑飞,一看堆栈指针,进入MAIN函数之后达到了0x7d,为什么会这样呢?为什么堆栈指针会这么大?
    我试过在MAIN函数里把SP设置成小一点,比如0x60,可是程序还是会跑飞,如果设置成0x30,则程序跑飞的概率更大了!
  

相关帖子

沙发
5880527| | 2009-6-2 14:09 | 只看该作者

80H以上的单元做堆栈还是很好使的,安全

估计你的程序有巨大的漏洞。死机就死机,我不相信会跑飞什么的

使用特权

评论回复
板凳
computer00| | 2009-6-2 14:16 | 只看该作者

如果你有很多函数没有调用,局部变量会占用很多RAM的

看看编译结果的RAM用量就知道了。

使用特权

评论回复
地板
jiyiche|  楼主 | 2009-6-2 15:09 | 只看该作者

回复楼上的

一楼的哥们:80H以上都是专用寄存器的,堆栈弄上面会好使?不是吧!!!

二楼的圈圈:怎么看编译结果的RAM用量?

使用特权

评论回复
5
xhtxzxw| | 2009-6-2 16:12 | 只看该作者

嘿嘿

F7,再Ctrl+F5,一步一步看,啥时候SP变大了嘛!肯定是程序的问题.

使用特权

评论回复
6
computer00| | 2009-6-2 16:25 | 只看该作者

编译完了下面就显示RAM用量了。52的高128字节RAM可以做堆栈的

51就没有了……

使用特权

评论回复
7
电脑圆圆| | 2009-6-2 19:16 | 只看该作者

没研究那么高深

只要编译后RAM不超过128,不手动设置sp从来就没出什么问题

使用特权

评论回复
8
ayb_ice| | 2009-6-2 20:54 | 只看该作者

查看MAP文件

看看变量的分配情况

使用特权

评论回复
9
jiyiche|  楼主 | 2009-6-2 22:11 | 只看该作者

我用的是51的,进入MAIN函数后SP就一下从07便到7e

我用的是51的,进入MAIN函数后SP就一下从07便到7e..这是为什么呢?

使用特权

评论回复
10
arm_fan168| | 2009-6-2 22:36 | 只看该作者

ram用量

ram的用量太大了吧。编译器生成的启动代码里,根据用户程序中的ram使用量来确定堆栈指针的位置,如果程序中使用的ram太多了,就会使sp到达比较高的位置。不仅是全局变量会占用ram,局部变量也会。而且如果使用C语言编写程序,最好不要修改SP的位置,因为你所修改到的堆栈位置,也许已经被编译器分配给某些变量了,再用于堆栈就会破坏这些变量。

使用特权

评论回复
11
computer00| | 2009-6-2 23:17 | 只看该作者

楼主把你的代码放上来,让大家帮你看看就知道了

使用特权

评论回复
12
computer00| | 2009-6-3 00:16 | 只看该作者

打包压缩成.rar文件,然后在下面那里上传就行了

使用特权

评论回复
13
jiyiche|  楼主 | 2009-6-3 00:38 | 只看该作者

我这样点上传,没反应。。。

我用的是FIREFOX浏览器,IE的登录都登陆不了

使用特权

评论回复
14
computer00| | 2009-6-3 00:45 | 只看该作者

那就很晕了...你的代码那么大,估计是RAM用得太多了

直接看编译结果就会告诉你RAM用了多少啊,就在最下面,报告错误那里。

使用特权

评论回复
15
耕在此行| | 2009-6-3 07:42 | 只看该作者

楼主的RAM用的差不多了

SP在编译时自动给调整至未用RAM的起始地址。
呵呵 鉴定完毕。

使用特权

评论回复
16
不亦心| | 2009-6-3 07:44 | 只看该作者

用汇编就不会有这种苦恼了

用汇编就不会有这种苦恼了
变量,堆栈地址都是自己分配的

使用特权

评论回复
17
mohanwei| | 2009-6-3 08:39 | 只看该作者

把优化级别设为9看看能省多少……

使用特权

评论回复
18
dengyuzhu| | 2009-6-3 10:31 | 只看该作者

可能是RAM(07H)在进入MAIN函数前被改写了

楼主可能程序中哪处用到了该RAM了

使用特权

评论回复
19
jiyiche|  楼主 | 2009-6-3 17:30 | 只看该作者

RAM用的太多?

我也觉得RAM用得太多了,可是我删除了32个全局变量,SP指针只少了1,即0X7d.为什么会这样?

使用特权

评论回复
20
arm_fan168| | 2009-6-3 18:04 | 只看该作者

不仅全局变量会占用RAM

局部变量也会,而且在keil51中如果定义了一些函数而不调用,会消耗掉很多RAM。

使用特权

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

本版积分规则

176

主题

484

帖子

0

粉丝