打印

讨论:单片机程序中函数嵌套能套多少层?

[复制链接]
6464|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alphal|  楼主 | 2007-11-21 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就比如通常的52,256byte ram的片子,假如程序data(堆栈)空间充裕的情况下。
1、理论上最大能套多少层?是不是无限的呢,只要data(堆栈)够?
2、在调用函数的时候哪些东西是需要压堆栈的?能不能在程序完成后大概的估计出堆栈深度?目前知道的有pc,sp,自动变量需要压堆栈。
3、程序编译后,结果显示的data字节包括哪些使用?我们能不能从程序上大概推算出编译后的data值?

相关帖子

沙发
ayb_ice| | 2007-11-21 11:47 | 只看该作者

调用子程序要占用2个字节堆栈

所有理论上最大256/8=128级,当然这不考虑中断,使用变量的情况。
实际远远小于这个数,实际使用一般不会大于9级。

使用特权

评论回复
板凳
alphal|  楼主 | 2007-11-21 11:56 | 只看该作者

--

调用子程序要占用2个字节堆栈?
pc吗?

实际使用一般不会大于9级?
为何?是够用了,还是被限制了?

使用特权

评论回复
地板
gyt| | 2007-11-21 12:03 | 只看该作者

够用了

使用特权

评论回复
5
alphal|  楼主 | 2007-11-21 12:34 | 只看该作者

。。。。

我可能要超过9级了。。。
程序分了三层,套的比较深。

使用特权

评论回复
6
救火车| | 2007-11-21 13:58 | 只看该作者

要尽可能减少调用嵌套。

使用特权

评论回复
7
123987| | 2007-11-21 14:13 | 只看该作者

好问题

引用 救火车 发表于 2007-11-21 13:58 侃单片机 ←返回版面    

6楼: 要尽可能减少调用嵌套。 

严重同意.实在不行就用死办法--宏.

还有一个相关的问题要请教各位大侠了.
有一次去面试有个考官问我嵌套层数多了会引起堆栈溢出.如何避免.当时没答出来.现在想想:除了宏还有啥子办**是否可以把堆栈定义到片外RAM?(特指51单片机)

使用特权

评论回复
8
alphal|  楼主 | 2007-11-21 14:27 | 只看该作者

尽可能减少调用嵌套。。。

我的程序处于模块化、结构化方面的考虑,分成了硬件层、系统层和应用层,所以嵌套的比较深,目前最深的地方已经套到了6层,估计整个程序下来套它个9层也有可能。

目前也是比较担心,套的太深的化会有什么隐患????

1、理论上最大能套多少层?是不是无限的呢,只要data(堆栈)够?
2、在调用函数的时候哪些东西是需要压堆栈的?能不能在程序完成后大概的估计出堆栈深度?目前知道的有pc,sp,自动变量需要压堆栈。
3、程序编译后,结果显示的data字节包括哪些使用?我们能不能从程序上大概推算出编译后的data值?

上面只是对第一个问题做了部分讨论,希望大家不吝赐教。

使用特权

评论回复
9
john_light| | 2007-11-21 20:33 | 只看该作者

我所知道的

一个是堆栈深度的限制
另一个是编译器的限制

使用特权

评论回复
10
后学| | 2007-11-21 20:40 | 只看该作者

嵌套太多,

写出来的程序有人能看懂么?

使用特权

评论回复
11
5880527| | 2007-11-21 20:59 | 只看该作者

把堆栈放到80H以上单元嘛

那些单元不是很好使,但可以用来做堆栈的,不过有一次用2051也习惯放到80H以上,结果莫名其妙的不动作,害得我还忙了半天,最后才明白它的80H以上不能做RAM使:)

使用特权

评论回复
12
alphal|  楼主 | 2007-11-21 22:11 | 只看该作者

keil3 有限制么?是多少??

使用特权

评论回复
13
computer00| | 2007-11-21 23:06 | 只看该作者

看keil的帮助手册吧,不要偷懒了。

使用特权

评论回复
14
alphal|  楼主 | 2007-11-21 23:15 | 只看该作者

嗯,这个主意不错。

不过还有呢:
2、在调用函数的时候哪些东西是需要压堆栈的?能不能在程序完成后大概的估计出堆栈深度?目前知道的有pc,sp,自动变量需要压堆栈。
3、程序编译后,结果显示的data字节包括哪些使用?我们能不能从程序上大概推算出编译后的data值?

使用特权

评论回复
15
computer00| | 2007-11-21 23:54 | 只看该作者

PC是要压栈,SP就免了。一些工作寄存器可能也要压栈,

这个要看看编译后的结果才知道。


data主要是指全局变量以及一些局部变量,后者要看实际的调用情况。

使用特权

评论回复
16
xwj| | 2007-11-22 00:04 | 只看该作者

晕,SP就是堆栈指针,压栈出栈时自动变化的,你管他干嘛?

除非搞OS内核用模拟栈,否则肯定不能乱动SP的

使用特权

评论回复
17
ayb_ice| | 2007-11-22 08:00 | 只看该作者

把所有的空闲的ram都当做堆栈即可

使用特权

评论回复
18
alphal|  楼主 | 2007-11-22 09:09 | 只看该作者

怎么看结果

这个要看看编译后的结果才知道。


在哪儿能看到?m51文件吗?
好像看的不太明白,比如说下面这一段:
?PR?HWLCM_REFRESHDISPLAYRAM?HW_LCM               -----    -----      0021H    0005H      -----    -----      -----    --
>> ---
  +--> ?PR?__HWLCM_DICHOTOMYFINDISN?HW_LCM
  +--> ?PR?__HWLCM_LCMWRITECOLADDR?HW_LCM
  +--> ?CO?HW_LCM
  +--> ?PR?__HWLCM_LCMWRITEDATA?HW_LCM

?PR?__HWLCM_DICHOTOMYFINDISN?HW_LCM              -----    -----      0026H    0003H      -----    -----      -----    --
>> ---
BL51 BANKED LINKER/LOCATER V6.02                                                      11/21/2007  22:46:08  PAGE 6

HWLCM_REFRESHDISPLAYRAM函数分配的空间从21开始,占用5个字节,后面的函数HWLCM_DICHOTOMYFINDISN从26开始,可是这两个函数不是调用完就释放空间的吗(里面没有静态),怎么看起来像累计着用??

使用特权

评论回复
19
ayb_ice| | 2007-11-22 09:25 | 只看该作者

C里这是编译器的事

好象启动文件里有定义堆栈区,编译器自动定位

使用特权

评论回复
20
computer00| | 2007-11-22 09:26 | 只看该作者

你两个函数之间有调用关系吧?keil使用了所谓的变量重叠技

都在main函数里面调用试试?就是不要他们之间调用了。

调用方式不同,就会影响到RAM的使用不同。如果只定义了函数,而没有去调用,那么keil
就会傻傻的认为这里面的局部变量分析不出来,就给它分配了固定的空间,从而浪费了RAM。

使用特权

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

本版积分规则

112

主题

473

帖子

1

粉丝