打印

KEIL编译器关于局部变量,全局变量,data,xdata问题.

[复制链接]
6523|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swd21ic|  楼主 | 2008-1-8 21:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近搞个C8051F的东东..很久没用到keil 编译器.了...

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

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

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

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

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

相关帖子

沙发
ayb_ice| | 2008-1-9 08:13 | 只看该作者

怀疑你用过KEIL吗

使用特权

评论回复
板凳
Swd21ic|  楼主 | 2008-1-9 13:05 | 只看该作者

~~~呵呵

1年前在学校稍微有用过.. .. 
一直是用IAR做AT91
现在这个东西是帮别个项目组调试驱动和界面..只用几天..

data,xdata,idata的含义我还是知道的.. 只是在局部变量用的时候有点莫名其妙,可能还是跟keil栈有关吧..  

据说keil还会把定义了但没用到的函数当做中断函数..把里面的局部变量也分配内存空间.. 应该是一个原因之一,我写的都是些接口.自己很少调用(除调试).

ai给我讲下吧. ^_^

使用特权

评论回复
地板
孤星119| | 2008-1-9 13:22 | 只看该作者

等待学习

使用特权

评论回复
5
lenglx| | 2008-1-9 17:45 | 只看该作者

。。。

    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个单元的局部变量的话,程序最终需要的存储单元数量是不会增加的。


使用特权

评论回复
6
Swd21ic|  楼主 | 2008-1-9 21:26 | 只看该作者

~~: )

链???

这是什么说法.. 不过好象你说的和我遇到的差不多,有时增加有时不加.呵呵

是不是编译器自己要分析哪些函数的局部变量是互斥的.然后把这些函数弄到一个链里??..

使用特权

评论回复
7
AIRWILL| | 2008-1-10 12:28 | 只看该作者

不仅如此

由于 DATA 段有好多共享特性(reg,bdata)
所以有可能在地址分配上导致空位,
如果正好留有空位(特别在08~1f区间)在最长链里定义局部变量,也可以利用起空位,不致总存储报溢出的错误

使用特权

评论回复
8
孤星119| | 2008-1-10 16:47 | 只看该作者

学习了.感激啊.

使用特权

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

本版积分规则

71

主题

781

帖子

1

粉丝