搜索
bottom↓
回复: 24

51什么时候应该设置堆栈SP?

[复制链接]

出0入0汤圆

发表于 2012-6-4 19:01:36 | 显示全部楼层 |阅读模式
我从没设置过,我看公司一同事每次写程序,第一行就是设置SP?
不好问,问也不会说

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-4 19:23:27 | 显示全部楼层
>> 我从没设置过

你不设置SP的原因是什麽?

>> 不好问,问也不会说

同感。

出0入0汤圆

发表于 2012-6-4 19:52:39 | 显示全部楼层
用keil时,在启动文件那里就设置SP,编译之后可以看M51文件,可以看到SP的值,

我猜keil会自动设置好SP的值,具体不知怎么样

我就知道这么多,其他的等高手解答

出0入0汤圆

发表于 2012-6-4 19:57:26 | 显示全部楼层
我猜keil是 安排好各种变量之后,避开bdata区设置SP的值

不知道对不对

出0入0汤圆

发表于 2012-6-4 21:04:02 | 显示全部楼层
初始化的时候都要对SP(堆栈)进行重新设置
我每次都这样做的

出0入0汤圆

发表于 2012-6-4 21:31:34 | 显示全部楼层
可以不设置,Keil会自动设置,自己手动设置也不复杂,使用数组定义保留一块区域给堆栈使用,然后在主程序里第一次调用程序前将堆栈指针指向保留区域即可,自己定义的话可以根据函数调用层数多少改变大小,比较放心一点,当然如果一窍不通的话还不如丢给Keil自动设置。

出0入0汤圆

发表于 2012-6-4 22:58:07 | 显示全部楼层
用C 写,不需要设置(因为keil的启动代码做了),用汇编写,那是必须设置的。

知之为知之,不知为不知,是知也

出0入0汤圆

发表于 2012-6-4 23:09:48 | 显示全部楼层
栈地址最好设置为7F或更后的地方,但注意保留足够的栈深就可以了。在汇编中一般是初始化的第一条指令。

出0入0汤圆

发表于 2012-6-4 23:10:06 | 显示全部楼层
Etual 发表于 2012-6-4 22:58
用C 写,不需要设置(因为keil的启动代码做了),用汇编写,那是必须设置的。

知之为知之,不知为不知,是 ...

汇编的程序简单可以不设,但是还是设的好,想当初找了我好辛苦才发现这个错。

简单是指程序堆栈不会用到08H(01组的R0)开始的RAM及以后一部分,大小看堆栈最大可能大小。就是汇编默认08H放第一个堆栈值,然后向后数。

总之,还是设一下比较好。C就不用了。

出0入4汤圆

发表于 2012-6-4 23:20:10 | 显示全部楼层
上学时你们的老师没讲?

出0入0汤圆

发表于 2012-6-4 23:38:59 | 显示全部楼层
楼主是不是学C的?

出0入0汤圆

发表于 2012-6-5 00:19:43 | 显示全部楼层
堆栈的大小就看你程序的局部变量有多少还有中断里面的局部就量有多少,还有重入函数有多少

出145入215汤圆

发表于 2012-6-5 01:51:33 | 显示全部楼层
复位sp就会默认设置为07h,与编程语言无关吧,设置SP是好的习惯,为了使程序严谨。如果写的程序要使用到第二个工作寄存器区的话就要设置栈顶指针,复位初始化默认使用0工作寄存器区,SP设置在1工作寄存器区的开始。自己还是看看内部存储器配置吧

出0入0汤圆

发表于 2012-6-11 20:46:00 | 显示全部楼层
刚好也遇到这个问题,学习了~

出0入0汤圆

发表于 2013-11-15 14:00:29 | 显示全部楼层
coleyao 发表于 2012-6-4 21:31
可以不设置,Keil会自动设置,自己手动设置也不复杂,使用数组定义保留一块区域给堆栈使用,然后在主程序里 ...

可以给个例子吗,我最近遇到51堆栈溢出问题,不知该怎么解决,这个方法是不是就是传说中的软件定义堆栈?能给个例子参考一下吗

出20入70汤圆

发表于 2013-11-15 14:06:37 | 显示全部楼层
设置,没搞过,从来都是丢给KEIL去做。
目前还没遇到过问题!

出0入0汤圆

发表于 2013-11-15 21:27:04 | 显示全部楼层
堆栈丢给KEIL去做有问题吗?俺都是这样做的,至今也没有出过问题。在KEIL中用C的,在程序中设置堆栈,感觉有点画蛇添足,紧紧是个人感觉,请不要拍砖。
KEIL对51来讲已经相当的成熟了

出0入0汤圆

发表于 2013-11-15 21:30:48 | 显示全部楼层
堆栈?不是存放指针的么,需要设置么

出0入0汤圆

发表于 2013-11-15 22:25:47 | 显示全部楼层
找到答案了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-11-15 22:34:57 | 显示全部楼层
写C的话就不用了,KEIL搞好了,如果汇编,你不修改,堆栈会改变寄存器的值,就出错了

出0入0汤圆

发表于 2013-11-17 00:33:30 | 显示全部楼层
我只玩汇编
所以初始化里设置SP是必须的

出0入0汤圆

发表于 2013-11-17 09:54:29 | 显示全部楼层
我猜他用的是汇编

难道你也汇编?

出0入0汤圆

 楼主| 发表于 2013-11-17 11:59:26 | 显示全部楼层
xou822 发表于 2013-11-17 09:54
我猜他用的是汇编

难道你也汇编?

都是C,他每个程序都要设置。其实不设置也一样运行

出0入0汤圆

发表于 2013-11-18 07:46:58 | 显示全部楼层
我记得一本书里面也是说要设置什么 是为了什么标准哦

GTX 好像是 晚上回去翻翻书看  

出0入0汤圆

发表于 2013-11-18 08:36:28 | 显示全部楼层
本帖最后由 zhgcao 于 2013-11-18 08:40 编辑
mahengyu 发表于 2013-11-15 22:25
找到答案了


这个可能会有误导别人,51单片机,如果内部RAM只有128字节供用户使用,堆栈最好设成60H,如果推算余下的RAM不够用户使用,而堆栈预留的空间过大的话,也可把RAM再向后推一些字节,如70H,对于内部RAM大于128字节,达到256字节,这时候堆栈设到80H以上就没有什么问题了。对于汇编,一定要重新设置堆栈,因为SP初值是07H,压栈是向上生长,所以有可能会把用户RAM的数据覆盖,C语言KEIL会自动设置堆栈,如果你在编程这前已对RAM使用做过规划,这时候你可以自己手动设置堆栈。(这里的RAM大小不包含特殊功能寄存器空间。)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表