一般咱们都是学了规范c言语教程后从事单片机c言语的编写的, 那就先要理解一点, 规范c言语实际上是起源于pc平台上的一种言语, 规范c言语肯定是不会照顾到单片机的特殊性的. 因而单片机c编译器中的c言语是一种依据规范c,可是又有相应修正扩大的扩展c言语.所以在单片机c编译器里写程序时必定要了解单片机编译器扩展c言语的不同之处, 绝不能呆板地照搬规范c.
在规范c里, 部分变量是函数在调用的时分才暂时分配存储空间的,全局变量是程序整个生命周期都一向存在的.不过要知道,暂时分配存储空间是需求操作系统内存管理程序支撑的, 单片机中一般都没有操作系统,也就不能实现像pc平台中那样的部分变量的空间分配.这儿就需求深化了解一下单片机的c编译器究竟是怎么处理部分变量的,假如对此没有概念,碰到调试过程中的一些奇特现象恐怕只能觉匪夷所思了.
别的需求知道的一点是, 不同的编译器关于部分变量的处理办法也不相同, 不能学了一个就处处照搬. 这儿拿KEIL C ,IARAVR, ICCAVR这个三个编译器做剖析比较.
首先说 Keil C51 , 它的部分变量并不是在仓库中, C51为了进步代码的功率, 依据 51 处理器的特性. 编译器对函数部分变量的组织进行了处理.部分变量假如不能分配到 寄存器里, 就放在 RAM 中了.编译器经过掩盖剖析, 能够同享部分变量的地址空间.。终究的DATA运用量取决于调用链中那个运用DATA最多的链。所以,在程序中添加一个部分变量,假如不是坐落那个运用DATA最多的链中,需求的DATA数量是有或许不会添加的。
如:main()->f11()->f12()->f13()….//链1
|—–>f21()->f22()->f23()….//链2
由于f11(),f21()不在同一个调用链上,明显,f11()中运用的部分变量,能够和f21()中的部分变量,运用同一个存储单元。由于它们中的任何一个处在生命期内的话,另一个必定现已脱离它的生命周期,一起它的部分变量也脱离了它的生命周期,这些部分变量所占用的存储单元当然能够另做它用了。
假定链1现在的部分变量需求50个存储单元,链2需求40个存储单元。那么你在链2中参加不多于10个单元的部分变量的话,程序终究需求的存储单元数量是不会添加的。
再说ICCAVR ,它把部分变量寄存在软件仓库空间中.ICCAVR运用两个仓库:一个用于子程序调用和中止操作的硬件仓库,一个用于传递参数、暂时变量和部分变量的软件仓库。硬件仓库是从数据内存的顶部开端分配的,在硬件仓库下面再分配必定数量的字节作为软件仓库。
IARAVR关于部分变量的处理办法与ICCAVR相同. 它也有两个仓库,一个是data stack ,一个是return address stack.别离用于寄存暂时变量,部分变量,传递参数, 和函数回来地址.
这儿需求留意的是, 部分变量寄存在仓库中的处理方式必定要确保仓库足够大, 特别是界说了部分数组变量的情况下,一旦数组过大,超过了仓库巨细就会产生仓库溢出,假如仅仅读取数据还好, 一旦写入数据,就会损坏仓库空间以外的数据, 导致程序经常.
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/257215.html