<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機編譯器中局部變量和全局變量的深入解析

單片機編譯器中局部變量和全局變量的深入解析

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
通常我們都是學(xué)了標準c語(yǔ)言教程后從事單片機c語(yǔ)言的編寫(xiě)的, 那就先要明白一點(diǎn), 標準c語(yǔ)言實(shí)際上是起源于pc平臺上的一種語(yǔ)言, 標準c語(yǔ)言肯定是不會(huì )照顧到單片機的特殊性的. 因此單片機c編譯器中的c語(yǔ)言是一種基于標準c,但是又有相應修改擴充的擴展c語(yǔ)言.所以在單片機c編譯器里寫(xiě)程序時(shí)一定要了解單片機編譯器擴展c語(yǔ)言的不同之處, 絕不能死板地照搬標準c.

在標準c里, 局部變量是函數在調用的時(shí)候才臨時(shí)分配存儲空間的,全局變量是程序整個(gè)生命周期都一直存在的.不過(guò)要知道,臨時(shí)分配存儲空間是需要操作系統內存管理程序支持的, 單片機中通常都沒(méi)有操作系統,也就不能實(shí)現像pc平臺中那樣的局部變量的空間分配.這里就需要深入了解一下單片機的c編譯器究竟是如何處理局部變量的,如果對此沒(méi)有概念,碰到調試過(guò)程中的一些奇異現象恐怕只能覺(jué)匪夷所思了.

本文引用地址:http://dyxdggzs.com/article/201611/322315.htm

另外需要知道的一點(diǎn)是, 不同的編譯器對于局部變量的處理方法也不一樣, 不能學(xué)了一個(gè)就到處照搬. 這里拿KEIL C ,IARAVR, ICCAVR這個(gè)三個(gè)編譯器做分析比較.

首先說(shuō) Keil C51 , 它的局部變量并不是在堆棧中, C51為了提高代碼的效率, 根據 51 處理器的特性. 編譯器對函數局部變量的安排進(jìn)行了處理.局部變量如果不能分配到 寄存器里, 就放在 RAM 中了.編譯器通過(guò)覆蓋分析, 可以共享局部變量的地址空間.。最終的DATA使用量取決于調用鏈中那個(gè)使用DATA最多的鏈。所以,在程序中增加一個(gè)局部變量,如果不是位于那個(gè)使用DATA最多的鏈中,需要的DATA數量是有可能不會(huì )增加的。

如:main()->f11()->f12()->f13()....//鏈1
|----->f21()->f22()->f23()....//鏈2

因為f11(),f21()不在同一個(gè)調用鏈上,顯然,f11()中使用的局部變量,可以和f21()中的局部變量,使用同一個(gè)存儲單元。因為它們中的任何一個(gè)處在生命期內的話(huà),另一個(gè)必然已經(jīng)離開(kāi)它的生命周期,同時(shí)它的局部變量也離開(kāi)了它的生命周期,這些局部變量所占用的存儲單元當然可以另做它用了。
假設鏈1目前的局部變量需要50個(gè)存儲單元,鏈2需要40個(gè)存儲單元。那么你在鏈2中加入不多于10個(gè)單元的局部變量的話(huà),程序最終需要的存儲單元數量是不會(huì )增加的。

再說(shuō)ICCAVR ,它把局部變量存放在軟件堆??臻g中.ICCAVR使用兩個(gè)堆棧:一個(gè)用于子程序調用和中斷操作的硬件堆棧,一個(gè)用于傳遞參數、臨時(shí)變量和局部變量的軟件堆棧。硬件堆棧是從數據內存的頂部開(kāi)始分配的,在硬件堆棧下面再分配一定數量的字節作為軟件堆棧。

IARAVR對于局部變量的處理方法與ICCAVR一樣. 它也有兩個(gè)堆棧,一個(gè)是data stack ,一個(gè)是return address stack.分別用于存放臨時(shí)變量,局部變量,傳遞參數, 和函數返回地址.

這里需要注意的是, 局部變量存放在堆棧中的處理方式一定要保證堆棧足夠大, 特別是定義了局部數組變量的情況下,一旦數組過(guò)大,超過(guò)了堆棧大小就會(huì )發(fā)生堆棧溢出,如果只是讀取數據還好, 一旦寫(xiě)入數據,就會(huì )破壞堆??臻g以外的數據, 導致程序時(shí)常.



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>