久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7326|回復: 2
打印 上一主題 下一主題
收起左側

關于單片機編譯器中對函數中局部變量的處理

[復制鏈接]
跳轉到指定樓層
樓主
ID:153041 發表于 2017-2-20 12:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

原作者: chinseeker

一個平凡的探索者


通常我們都是學了標準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.  分別用于存放臨時變量,局部變量,傳遞參數, 和函數返回地址.


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



評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:98618 發表于 2017-2-22 01:09 | 只看該作者
能從編譯器級別來進行調試的都是高手啊,佩服樓主的技術,不過平時很少用avr單片機,不知道樓主有51單片機方面的編譯器優化資料嗎?
回復

使用道具 舉報

板凳
ID:69798 發表于 2018-2-10 00:38 | 只看該作者
難得一見的好文,很有用的文章,分析得很到位,先收藏謝謝樓主了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲美女视频 | 日韩精品中文字幕一区二区三区 | 久久久久久久亚洲精品 | 免费成人高清在线视频 | 久久综合av | 欧美中文字幕在线观看 | 热re99久久精品国产99热 | 精品影院| 亚洲精品一区二区网址 | 欧美成人免费 | 国产精品99久久久久久www | 日韩国产精品一区二区三区 | 中文字幕日韩在线 | 国产精品久久久久久久粉嫩 | 可以在线看的黄色网址 | 日韩有码一区 | 日韩一区二区在线视频 | 国产乱码精品1区2区3区 | 久久一热 | 欧美精品 在线观看 | 亚洲精品久久久久久久久久久久久 | 羞视频在线观看 | 午夜激情视频在线 | 午夜久久久久久久久久一区二区 | 狠狠色香婷婷久久亚洲精品 | 国产成人高清视频 | 日韩电影免费观看中文字幕 | 久久久九九九九 | www.日韩免费 | 日本特黄a级高清免费大片 成年人黄色小视频 | 亚洲午夜精品视频 | 中文字幕精品一区二区三区精品 | 国产成人a亚洲精品 | 在线视频中文字幕 | 日韩在线小视频 | 亚洲欧美在线观看 | 午夜网站视频 | 久久亚洲一区二区三区四区 | 亚洲一区视频 | 久久综合一区 | 欧美一区二区在线播放 |