C51内存单元释放问题???????

[复制链接]
7298|24
 楼主| soso 发表于 2008-8-5 10:05 | 显示全部楼层 |阅读模式
不是说局部变量可以自动释放的吗???我的为什么不行??例如:大概写一
点,说明问题。。


key()   //定义一个函数
{
int a;

}
main()  //主函数
{
key();
while(1);

}
为什么我在key函数内每定义一个变量,KELL C51编译时就显示多使用一个DATA
单元???它不是局部变量吗??如果我好自己定义的函数,RAM肯定不够??
chunk 发表于 2008-8-13 13:34 | 显示全部楼层

如果你有良好的汇编功底,

可以把C源码编译成汇编源码进行分析,你会对C语言有更深刻的理解。

现在各种程序设计语言教材都是“就事论事”型,讲汇编的从不提C,它告诉你汇编器支持“分段(也就是SEGMENT或SECTION或AREA之类的伪指令)”,它还告诉你每个段的名字可以自己定,但它给你的事例中却不会出现以“DATA”、“BSS”、“TEXT”、“IDATA”、“CONST”等命名的段。它也不说它那样分段有什么目的,仅仅是给你演示一下“汇编器允许你分段”。

讲C的几乎都无视你已经具有汇编基础,甚至鼓吹不用学汇编也能成为优秀的软件工程师。它一个条目一个条目地给你讲“集成开发环境”的每一个菜单项,却不给你说C编译器的命令行参数都是怎么回事。它告诉你LONG型整数加法只要一行语句就可以,却不告诉你C编译器如何处理这一行语句。也许它会多说一句“对8BIT处理器来说,4字节大整数的加法用汇编实现需要许多指令,通常要编一个子程序”,然而你却不知道这个8位CPU的C编译器也要求用一个汇编子程序做这种加法,只不过这个子程序已经有人写好放在了“LIB文件”中。

10楼的同学,别在收集那些书了,费钱费时。
aibxyz 发表于 2008-8-5 10:09 | 显示全部楼层

。。。。。

你只有一个函数自然看不出来了
你再弄一个知道了
局部变量释放,是指在其他无继承关系的函数内部,可重新使用
而不是说编译后局部变量就不占data
 楼主| soso 发表于 2008-8-5 12:21 | 显示全部楼层

reentrant就可以释放变量

但是我把key() 改为key() reentrant就可以释放变量,,为什么???
 楼主| soso 发表于 2008-8-5 14:12 | 显示全部楼层

怎么没人会????

怎么没人会????
wxj1952 发表于 2008-8-5 14:22 | 显示全部楼层

开玩笑。

reentrant函数局部变量在堆栈区,不在data区!也许你应该看看SP的差别。
ayb_ice 发表于 2008-8-5 15:02 | 显示全部楼层

(可能)不同時使用的變量才能被覆蓋

照lz的意思,keil51局部變量不佔用空間了...
 楼主| soso 发表于 2008-8-5 16:30 | 显示全部楼层

key() 函数只使用一次

但是我的key() 函数只使用一次,,使用完后,它里面定义的变量还占用
单元空间呀???????????
wxj1952 发表于 2008-8-5 19:54 | 显示全部楼层

共享和覆盖。

何谓共享?连接器搜索整个程序中所有函数中局部变量占用DATA最多的那个函数A,以函数A为准开辟共享局部变量区。
例如函数A中说明了10个char类型局部变量,那么整个程序的共享局部变量区 就是10字节。其他所有函数的局部变量都共享这10字节DATA区。这个区相当于全局变量区了,它确实就是位于全局变量区(之后)。所以,即使你的函数A退出了,这个共享变量区仍然存在。它还要为其它函数使用。

释放是程序员的工作,你没有释放语句,它怎么会释放?

“全局变量”是不会释放的
 楼主| soso 发表于 2008-8-5 22:57 | 显示全部楼层

高手...谢谢了...哈哈

高手...谢谢了...哈哈
天雨粟 发表于 2008-8-12 20:25 | 显示全部楼层

感谢wxj1952

我收集了许多国内单片机方面的书,没有发现那本书对变量覆盖作出了如许明确解释的,谨受教!
赤铸 发表于 2008-8-12 21:45 | 显示全部楼层

C51 局部变量的处理和一般编译器不一样

普通 C 语言的局部变量是分配方式是“auto”,C51 所有变量的内层分配方式都是“静态”的(除了特殊说明的)
内层分配上,局部变量跟 static, exnten 变量都是一样的

对于 C51,所谓“局部”只体现在“作用域”上,作用域与内层分配是两回事
john_light 发表于 2008-8-12 21:54 | 显示全部楼层

很久不写了……

http://blog.21ic.com/user1/908/archives/2005/1985.html
zyok 发表于 2008-8-13 11:16 | 显示全部楼层

学习了...

Beet117 发表于 2008-8-13 12:13 | 显示全部楼层

精辟!

wxj1952 发表于 2008-8-13 20:35 | 显示全部楼层

15楼大侠能否借此机会多讲一些书上没有的东西?

我一直不清楚,汇编程序按照什么原则分段?或者说分段的作用。什么情况下需要分段?

推荐本书我自己看也行。先谢了。
天雨粟 发表于 2008-8-13 21:34 | 显示全部楼层

感谢15楼的指点

我学单片机,基本方法是先买相似内容的三本书,比较其异同,如果发现问题,则有两本书是同一说法,即取其说法,这样能解决大部分问题,仍然解决不了,通过做在Keil中实验,也可以做到知其然,如果有人能告诉我所以然,则此中大乐,有不能言者也.
16楼关心的问题正是我想弄清楚的问题.我现在能在C中调用汇编,但实在没有弄懂其机制.例如局部数据段与参数传递段的关系,我按文字上的逻辑推理,至少两本书说参数传递段是局部数据段的别名,但用这个说法套例程,又不能全然合龙,很想知道到底是怎么回事.正像16楼的老师说的,能不能用汇编语言的原理把这其中的道理说清楚?

盼望中ing.....
xj803 发表于 2008-9-11 11:54 | 显示全部楼层
nemo109 发表于 2008-9-11 16:38 | 显示全部楼层

学习中

继续。。。。我学到了好多东西。。。我是一个刚入行的。
grady1125 发表于 2008-9-11 18:15 | 显示全部楼层

局部变量也占内存啊

照你那样说干脆全部用局部变量,内存都免了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

0

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部