<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > [跟我學嵌入式開發(fā)] 堆和棧

          [跟我學嵌入式開發(fā)] 堆和棧

          作者: 時間:2016-11-28 來源:網(wǎng)絡 收藏


          圖 3
          對于堆我們已經(jīng)知道了必須調用相應的API來分配內存,那從??臻g分配內存也需要調用API嗎?答案是通常不需要,為什么是通常?因為,在有的平臺上(Linux上就是)提供??臻g的分配API,即這種API被調用時,是從調用任務的??臻g中分配內存的。對于這一功能,在嵌入式系統(tǒng)中使用得非常的少,我也不建議大家使用。對于下面的代碼,mem_main、mem_foo和mem_bar的大小是4K字節(jié)(假設int類型的大小是4字節(jié)),這些內存就是自動(注意是自動)分配在運行任務的棧上的。我們假設某個任務當前所使用的棧是零字節(jié),當這一任務運行到main中且沒有進入foo ()時,其所占用的空間大小是大約4K字節(jié),之所以用大約這個詞,是因為函數(shù)的調用還有其它的棧開銷。一旦任務運行進入foo ()函數(shù)但沒有進入bar ()函數(shù),那么所占用的棧的大小就變?yōu)榇蠹s8K字節(jié)。同樣的,如果程序運行進入bar ()函數(shù),那么所占用的??臻g大約就是12K字節(jié)了。
          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:}

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

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

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

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

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

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


          上一頁 1 2 下一頁

          關鍵詞: 嵌入式開發(fā)堆和

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();