C51的局部变量不是在堆栈中,是经过覆盖分析之后,放在RAM(ROM,XRAM)中的(不是官方解释,像是程序员自己理解)

 最近搞个C8051F的东东..很久没用到keil 编译器.了...

发现定义变量的时候有点问题..
 
定义局部变量也占RAM.. 而且把局部变量定义成data 或 xdata占的又不同..

有的时候取消一个xdata的变量.换成data型..xdata减少一个字节,data却没变..

有的时候把一个data 改 成 xdata, data少1个字节,xdata增加几个.

局部变量应该是在栈里的吧..听说keil又有个外部模拟栈.

真把我搞晕了.. 我是想尽量先用xdata (2K)

 

 

 

 

C51的局部变量不是在堆栈中,是经过覆盖分析之后,放在RAM(ROM,XRAM)中的。

    最终的DATA使用量取决于调用链中那个使用DATA最多的链。

所以,在程序中增加一个局部变量,如果不是位于那个使用DATA最多的链中,需要的DATA数量是有可能不会增加的。

如:
main()->f11()->f12()->f13().... // 链1
 |----->f21()->f22()->f23().... // 链2

    因为f11(),f21()不在同一个调用链上,显然,f11()中使用的局部变量,可以和f21()中的局部变量,使用同一个存储单元。因为它们中的任何一个处在生命期内的话,另一个必然已经离开它的生命周期,同时它的局部变量也离开了它的生命周期,这些局部变量所占用的存储单元当然可以另做它用了。

    假设链1目前的局部变量需要50个存储单元,链2需要40个存储单元。那么你在链2中加入不多于10个单元的局部变量的话,程序最终需要的存储单元数量是不会增加的。
 

 

你可能感兴趣的:(编程)