AT89C51为8051系列中比较通用的1个芯片,如果用C语言编写程序,子函数可以被调用最大多少层,为什么?
不知道怎么考虑
从RAM空间,堆栈深度考虑吗?
C语言调用函数时,入栈的除了ACC,DPTR,通用寄存器还有什么,子函数被调用时单片机是如何动作的
跟编译器有一些关系,象Keil要求函数嵌套调用最大为10层。
主要是从RAM空间,堆栈深度考虑,象一个最简单的无参数的函数调用,每次都要存储两个字节的程序计数器的值.再就是函数的参数传递也是用的内存中的堆栈。这个也要考虑,不过一般建议控制在3-5层内。
这个应该是和SP的字长和RAM的值作主要依据吧???
AT89C51的RAM空间为128字节,其中可作为堆栈区的最大空间为120字节。某次函
数调用,至少将PC(2 byte)入栈,当所调用函数为空函数,则函数最大嵌套层数
为60层。
对吗?
好象有8个字节固定被使用了,不能被做堆栈啊?我本人觉得,这个题目不是要得到一个明确的答案啊,主要是看你的考虑问题的方法和对MCU内部结构的了解!
靠,这个题没有答案,你定义的变量都是占用队战的,比如全局变量
你定义多了调用的层就少了,8951向下声称对站
你的考虑方向是对的,保存什么寄存器都应该可以配置。
子函数调用的时候要将返回地址以及函数需要的参数push道stack中
then jump to the function and execute it
至于社么要保存,那得看你实际你用了哪些寄存器,
你用的都得保存,但是你用C写的话并不关心什么寄存器,编译器会帮你做的。但是仍然是可以配置的。
我试了一下,keil,如果最简单的函数调用,128字节子函数调用可以达64层,只
有PC入栈,SP初始化为0x00h.
有些情况下,子函数调用层数可以是无穷大。如果所有函数返回地址相同,经编
译器优化,那么只有一次PC入栈。