新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > [跟我學嵌入式開發] 堆和棧

        [跟我學嵌入式開發] 堆和棧

        作者: 時間:2016-11-28 來源:網絡 收藏


        圖 3
        對于堆我們已經知道了必須調用相應的API來分配內存,那從棧空間分配內存也需要調用API嗎?答案是通常不需要,為什么是通常?因為,在有的平臺上(Linux上就是)提供棧空間的分配API,即這種API被調用時,是從調用任務的棧空間中分配內存的。對于這一功能,在嵌入式系統中使用得非常的少,我也不建議大家使用。對于下面的代碼,mem_main、mem_foo和mem_bar的大小是4K字節(假設int類型的大小是4字節),這些內存就是自動(注意是自動)分配在運行任務的棧上的。我們假設某個任務當前所使用的棧是零字節,當這一任務運行到main中且沒有進入foo ()時,其所占用的空間大小是大約4K字節,之所以用大約這個詞,是因為函數的調用還有其它的棧開銷。一旦任務運行進入foo ()函數但沒有進入bar ()函數,那么所占用的棧的大小就變為大約8K字節。同樣的,如果程序運行進入bar ()函數,那么所占用的棧空間大約就是12K字節了。
        00001:voidbar()
        00002:{
        00003:intmem_bar[1024];
        00004:// application logic
        00005:}
        00006:
        00007:voidfoo()
        00008:{
        00009:intmem_foo[1024];
        00010:bar();
        00011:}
        00012:
        00013:intmain()
        00014:{
        00015:intmem_main[1024];
        00016:foo();
        00017:return 0;
        00018:}

        如果程序繼續運行,從bar ()函數返回到foo ()函數中,那么其所占用的棧空間就從大約12K字節變成了大約8K字節了。相類似的是,如果程序從foo ()函數中返回到main ()函數,那么所占用的棧空間又變為大約4K字節了。對于嵌入式系統開發,由于任務棧通常都比較的小,那這告訴我們什么呢?我想有以下幾點需要注意。
        1)函數的調用深度越是深,由于每一級的函數通常都會有局部變量,那么所使用的棧空間也會累積得越大。
        2)遞歸調用需要的棧空間會相對的大(視具體的情況),在嵌入式系統中也建議少用。
        3)我們應當盡可能的不要在函數中定義占用內存空間較大的局部變量。

        下面,我們總結一下堆與棧的區別,它們是:
        1)堆是大家共享的。任務可以通過調用API來從堆中分配內存空間。
        2)棧是任務所獨有的。在嵌入式系統中,當一個任務創建起來后其棧空間的大小往往是定了的。函數中的局部變量是由編程語言自動從棧上分配的,我們不需要調用API進行空間分配。

        最后我有一個問題留給讀者您,這個問題是:
        前面的講解中,我們說任務的棧是由操作系統的任務創建API從堆中分配出來的,那棧是否也可以位于.data段或是.bss段中呢?為什么?

        答案
        由于堆從本質上說來就是一塊內存,由于在C語言中一塊內存可以從堆中分配,也可以從.data段或是.bss段中分配。因此,任務的棧也是可以從這三塊內存中分配獲得,也就是說最終的答案是:可以。

        你或許還想看一看《程序中的段》。

        如果你覺得本文的哪些地方需要改進或是存在一些不明白的地方,請留言。如果你想參與討論嵌入式系統開發相關的話題,請加入技術圈(g.51cto.com/UltraEmbedded)。


        上一頁 1 2 下一頁

        關鍵詞: 嵌入式開發堆和

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 寿光市| 浦城县| 乐山市| 开鲁县| 胶南市| 当阳市| 九江市| 陆川县| 新建县| 建瓯市| 镶黄旗| 普陀区| 喜德县| 晋中市| 太保市| 盘锦市| 开封市| 商洛市| 泰宁县| 武鸣县| 航空| 巫溪县| 左贡县| 嵊泗县| 大足县| 延长县| 馆陶县| 宿州市| 罗江县| 喀什市| 台东市| 沙河市| 北海市| 太仆寺旗| 黑河市| 云阳县| 新竹县| 舞钢市| 全州县| 山阳县| 余庆县|