Keil C51 Data Overlaying

8051单片机数据覆盖技术
本文探讨了8051单片机由于内部内存限制而采用的数据覆盖技术,介绍了如何通过分析函数调用关系来优化内存使用,并讨论了函数指针调用对编译器分析带来的挑战。

    一般的编译器将函数中的区域变数动态配置在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 的警告了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值