打印

救火车的火灾预警----小心keil的堆栈隐患。

[复制链接]
22127|141
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
救火车|  楼主 | 2010-7-4 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 救火车 于 2010-7-7 21:34 编辑

程序编译都正常。
linking...
Program Size: data=227.0 xdata=0 code=4825
creating hex file from "azz"...
"azz" - 0 Error , 0Warning(s).

就是这个data=227.0  这个值控制到多少才是安全的?
现在是227.0 是正常的。在247时,程序出了很多莫明其妙的问题。

现在已经清楚是data=227.0以上的栈空间不足造成的溢出。但是keil不报错,也不出警告。
我搜了很多资料。都说要多留些内存,但始终没有人说清需要给栈留出多少空间才是安全的。凭经验估计,不是我们控研发的作风。
所以在此开讨论贴。专题讨论keil C51栈的安全问题。一定要找出精确计算栈的安全设置的方法。

参考贴子:

https://bbs.21ic.com/viewthread.php?tid=147240&highlight=Keil%2BC51%E9%87%8C%E5%85%B3%E4%BA%8E%E5%A0%86%E6%A0%88%E6%8C%87%E9%92%88%E7%9A%84%E5%A4%84%E7%90%86

相关帖子

沙发
fzkqi| | 2010-7-4 21:51 | 只看该作者
根据你单片机的RAM大小。

使用特权

评论回复
板凳
wswh2o| | 2010-7-4 22:45 | 只看该作者
得看你的堆栈多少吧,,如果是52的话有256个字节,你用247个字节的data后只给堆栈留了9个字节,一旦堆栈越界,程序可能就乱了!

使用特权

评论回复
地板
原野之狼| | 2010-7-4 23:15 | 只看该作者
堆栈的空间没有计算进去哇 所以这个值不能太大 要不然就崩溃了

使用特权

评论回复
5
xwj| | 2010-7-4 23:58 | 只看该作者
不会吧?
LZ还用问这样的问题???


PS:
LS正解。

使用特权

评论回复
6
古道热肠| | 2010-7-5 00:13 | 只看该作者
为何不用外部xdata空间呢?现在除了AT89X52没有内置XDATA,其它的51单片机一般都有SRAM空间可用。
根据我的经验,最好不要超过期230,深度子函数调用时最容易重启设备。中断时也容量栈超标。

使用特权

评论回复
7
古道热肠| | 2010-7-5 00:16 | 只看该作者
实在不行,用Code换Data,看您Code不大,多用点省内存的招,压缩压缩ram的用量吧。

使用特权

评论回复
8
hotpower| | 2010-7-5 00:57 | 只看该作者
实在不行,用Code换Data,看您Code不大,多用点省内存的招,压缩压缩ram的用量吧。
古道热肠 发表于 2010-7-5 00:16

使用特权

评论回复
9
ayb_ice| | 2010-7-5 08:13 | 只看该作者
编译器只要有一个字节堆栈就不会报错
实际情况要粗略估计一下,程序调用深度,中断是否嵌套
超过200就要认真对待了
....

使用特权

评论回复
10
救火车|  楼主 | 2010-7-5 09:25 | 只看该作者
众位没理解我的意思。
我的意思是如何“精确”的计算出最佳的数值。挤出每一个字节,留给我的缓冲区用。
我当然知道把缓冲区改小了就行了。但是改成多小才不会有隐患?

现在讨论如何精确计算最佳值的问题。

使用特权

评论回复
11
ayb_ice| | 2010-7-5 09:35 | 只看该作者
就是计算程序嵌套调用和中断嵌套的堆栈使用情况
很难准确计算的,只能保守计算,按最坏可能,这样才有保障
就象要计算某个程序的执行时间一样,因为程序有很多分支
...

使用特权

评论回复
12
linqing171| | 2010-7-5 12:53 | 只看该作者
回版主:
PIC的编译器一般都会给你报告最深堆栈是多少。
keil似乎没有,如果不深的话,自己手工计算吧,单步运行到主程序最深的地方,看堆栈多少。

精确计算主程序堆栈深度:
不给中断,跑一遍,看看堆栈默认为00的,被覆盖了多深。

然后在进入中断的地方设置断点,运行到中断最深的地方,计算一下中断最深用了多深。
两个加起来就可以了。

另外用keil的是很,用cross module 优化,会inline很多函数,效果明显。
还要仔细研究一下list文件里面的变量,看看是不是哪个可以用const修饰一下,哪个可以换成bit型的,哪个可以用代码去掉。

另外,大家都不多给保留几个字节,一定要正好么? 正好会出问题吧?实在不行,就重新规划架构,减少调用,参数用全局变量,或者深度之前先关中断。。。。

使用特权

评论回复
13
isoar| | 2010-7-5 20:27 | 只看该作者
根据最大嵌套深度计算,不过一般好像也没人算这个,留出足够的空间给堆栈就行了。
为了保证程序稳定个人经验最好控制 data 小于200,并且缓冲区、大数组之类的东西一律直接加 xdata 修饰符放到外面去。

很多程序完全没有必要定义那么多全局或静态变量的,建议楼主查找学习些程序优化的**看看。

使用特权

评论回复
14
jack.king| | 2010-7-8 13:59 | 只看该作者
对了,请问MCU内部的xram 在用keil时是用定义为xdata  然后选择什么模式好点是\, impact or large

使用特权

评论回复
15
冷漠| | 2010-7-8 14:17 | 只看该作者
本帖最后由 冷漠 于 2010-7-8 14:19 编辑

还是救火车说的对,“估计”不是研发作风,“一定要找出精确计算栈的安全设置方法。”

其实Keil 当然考虑到了这个问题以及解决方法,只是我们还不知道而已。

先请汇编高手解决此问题,千万别等冷漠用IDE配置定位完成了以后,再来“点评一下”装大牛或者说用C解决如何菜鸟。那么顶汇编者高手先请,特别是所长的makefile 别总跟在冷漠后面当评委……  冷漠这次做“后发制人”。
     承让了……

使用特权

评论回复
16
xuyiyi| | 2010-7-8 16:23 | 只看该作者
搬个小橙子听冷漠大虾讲课~

使用特权

评论回复
17
306970351| | 2010-7-8 19:26 | 只看该作者
jack.king发表于 2010-7-8 13:59 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  得分:0
14楼: 对了,请问MCU内部的xram 在用keil时是用定义为xdata  然后选择什么模式好点是\, impact or large


MCU的内部XRAM不用定义为xdataba吧?

使用特权

评论回复
18
冷漠| | 2010-7-8 20:43 | 只看该作者
看来冷漠不出手,所长也按兵不动?highgear的makefile吹了半天,需要用到时就拿不出来了。
冷漠再承让高手一天?(那边冷漠已经贴了解法啦;highgear的“点评”就要出来了。又跟在冷漠后面了。)

使用特权

评论回复
19
306970351| | 2010-7-8 20:57 | 只看该作者
各位说说使用MCU内部XRAM是否需要定义成xdata?

使用特权

评论回复
20
ejack| | 2010-7-8 21:01 | 只看该作者
各位说说使用MCU内部XRAM是否需要定义成xdata?
306970351 发表于 2010-7-8 20:57


视情况分配成pdata或xdata
具体看所用MCU的手册

使用特权

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

本版积分规则

个人签名:秦皇岛蓝马电子科技有限公司 救火车单片机工作室

113

主题

1249

帖子

2

粉丝