Keil C51 Data Overlaying
来源:互联网 发布:手机淘宝查号在哪里查 编辑:程序博客网 时间:2024/06/03 17:08
一般的编译器将函数中的区域变数动态配置在stack,等函数结束空间就释放出来。因为8051 的内部记忆体很少,只有区区128 或256 bytes,而且stack 也是共用这块记忆体。为了节省stack 空间,所以区域变数基本上是静态配置在固定位址,也就是变成全域变数。如此就又造成浪费记忆体的情况,为了解决这个问题,所以8051 的编译器基本上都采用所谓的data overlaying 技术来克服区域变数浪费空间的问题。
所谓data overlaying 是指没有呼叫关系的函数,它们的区域变数区可以重叠在一起(共用一块记忆体)。Keil C51 会分析程式中函数间呼叫的关系,产生一个呼叫树。它就根据这个呼叫树来决定那些函数的区域变数区可以overlaying 在一起。一种情况是是编译器发现某一个函数(不是main)没有被别的函数呼叫,这会造成编译器的困惑。一个正常的程式,除了main 之外,除非是垃圾程式码(没用处但没有删除),否则所有的函数应该是至少会被一个其它函数呼叫的。编译器在安全至上的原则下,会认定它的分析无法正确的辨识这个函数呼叫关系,所以对这个函数的区域变数就会独立配置,不会重叠配置。这样有没有问题?逻辑上当然不会有问题,但没overlaying 就是会浪费记忆体,而且也会一直产生*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS 的警告。
什么情况下,函数的呼叫树让编译器无法分析?真实应用是有一些情况会发生这样的问题。最常见的就是使用函数指标来呼叫函数。因为呼叫是执行时期动态变动的,这就可以难倒编译器了。在这种情况这些被呼叫的指标函数就会独立配置它们的区域奱数。如果你要这些函数也能正确的使用overlaying 的好处,那么你就必需手动分析那些函数的呼叫树,然后告诉编译器就可以了。这样你也就不会在编译时产UNCALLED SEGMENT 的警告了。
- Keil C51 Data Overlaying
- Keil C51 Data Overlaying
- keil c51中的data idata xdata code详解
- C51 keil中data,idata,xdata,pdata,code
- C51:Keil c51指针变量
- keil c51问答
- keil c51 可重如问题
- Keil C51库函数参考
- 学习心得之keil C51
- keil c51 拓展关键字
- Keil C51编程工具
- Keil C51库函数参考
- printf in KEIL C51
- printf in KEIL C51
- Keil C51内存模型
- Keil C51详细设置
- Eclipse Keil C51插件
- Keil C51 详细设置
- 获取本地ip
- 定期删除服务器日志
- 织梦dedecms实现自动登录的方法
- ubuntu永久修改主机名
- sublime 的安装
- Keil C51 Data Overlaying
- Sybase,几个sql使用小功能
- mysql 对用户操作的语句
- Android 中存储路径
- HttpServletResponse得到的四种方法
- maven入门:一个简单的maven项目
- 页面流媒体播放器标签
- maven 建立本地仓库
- 如何添加或删除ubuntu用户和组