当前位置:首页 > 单片机 > 单片机
[导读]  一般的编译器将函数中的区域变数动态配置在stack,等函数结束空间就释放出来。因为8051 的内部记忆体很少,只有区区128 或256 bytes,而且stack 也是共用这块记忆体。为了节省stack 空间,所以区域变数基本上是静

  一般的编译器将函数中的区域变数动态配置在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 Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若...

关键字: C51 数据类型

之后新建新的工程,添加.a文件就可以使用了,当然也可以使用keil来添加,但是keil默认的是用.lab,需要自己配置一下文件属性,改为lib文件即可。一半release sdk的时候用这种方式很关键的,毕竟自己的核心代...

关键字: keil 文件属性 lib文件

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: C51 MDK RealView

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

关键字: keil5 编译 C51

Intel公司1980年推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 80C5...

关键字: C51 KEIL 编程

c上标3下标5怎么算用计算机,c上标3下标5怎么算

关键字: C51 KEIL

DSP28335与AD7606通过SPI的串行数据交互

关键字: keil C

AD7606的并行采集

关键字: ad7606 数据 C keil
关闭
关闭