新聞
研討會
設(shè)計
嵌入式系統(tǒng)
元件/連接器
電源與新能源
安全與國防
汽車電子
EDA/PCB
消費電子
工業(yè)自動化
模擬技術(shù)
醫(yī)療電子
測試測量
通信技術(shù)
光電顯示
網(wǎng)絡(luò)與存儲
智能計算
物聯(lián)網(wǎng)與傳感器
機器人
社區(qū)
論壇
開發(fā)板試用
博客
活動中心
積分禮品
技術(shù)匯
PI技術(shù)專區(qū)
ADI技術(shù)專區(qū)
美信技術(shù)專區(qū)
研華技術(shù)專區(qū)
貝能技術(shù)社區(qū)
Fluke技術(shù)社區(qū)
ZYNQ技術(shù)社區(qū)
世強專區(qū)技術(shù)社區(qū)
Microchip資源專區(qū)
Microchip視頻專區(qū)
Quark技術(shù)社區(qū)
Xilinx社區(qū)
MultiSIM BLUE
Andes專區(qū)
TE金屬混合保護專區(qū)
ADI視頻專區(qū)
OpenVINO生態(tài)社區(qū)
金升陽電源技術(shù)專區(qū)
Led技術(shù)社區(qū)
DSP技術(shù)社區(qū)
FPGA技術(shù)社區(qū)
MCU技術(shù)社區(qū)
USB技術(shù)社區(qū)
CPLD技術(shù)社區(qū)
Zigbee技術(shù)社區(qū)
Labview技術(shù)社區(qū)
Arduino技術(shù)社區(qū)
示波器技術(shù)社區(qū)
步進電機技術(shù)社區(qū)
無線充電技術(shù)社區(qū)
人臉識別技術(shù)社區(qū)
指紋識別技術(shù)社區(qū)
快捷導(dǎo)航
下載
電路
EETV
廠商專區(qū)
元件查詢
計算工具
資料庫
新聞中心
EEPW首頁
>
嵌入式系統(tǒng)
>
設(shè)計應(yīng)用
> [跟我學嵌入式開發(fā)] 堆和棧
[跟我學嵌入式開發(fā)] 堆和棧
作者:
時間:2016-11-28
來源:網(wǎng)絡(luò)
加入技術(shù)交流群
掃碼加入
和技術(shù)大咖面對面交流
海量資料庫查詢
收藏
圖 3
對于堆我們已經(jīng)知道了必須調(diào)用相應(yīng)的API來分配內(nèi)存,那從棧空間分配內(nèi)存也需要調(diào)用API嗎?答案是通常不需要,為什么是通常?因為,在有的平臺上(Linux上就是)提供??臻g的分配API,即這種API被調(diào)用時,是從調(diào)用任務(wù)的棧空間中分配內(nèi)存的。對于這一功能,在嵌入式系統(tǒng)中使用得非常的少,我也不建議大家使用。對于下面的代碼,mem_main、mem_foo和mem_bar的大小是4K字節(jié)(假設(shè)int類型的大小是4字節(jié)),這些內(nèi)存就是自動(注意是自動)分配在運行任務(wù)的棧上的。我們假設(shè)某個任務(wù)當前所使用的棧是零字節(jié),當這一任務(wù)運行到main中且沒有進入foo ()時,其所占用的空間大小是大約4K字節(jié),之所以用大約這個詞,是因為函數(shù)的調(diào)用還有其它的棧開銷。一旦任務(wù)運行進入foo ()函數(shù)但沒有進入bar ()函數(shù),那么所占用的棧的大小就變?yōu)榇蠹s8K字節(jié)。同樣的,如果程序運行進入bar ()函數(shù),那么所占用的??臻g大約就是12K字節(jié)了。
00001:
void
bar
()
00002:
{
00003:
int
mem_bar
[1024];
00004:
// application logic
00005:
}
00006:
00007:
void
foo
()
00008:
{
00009:
int
mem_foo
[1024];
00010:
bar
();
00011:
}
00012:
00013:
int
main
()
00014:
{
00015:
int
mem_main
[1024];
00016:
foo
();
00017:
return 0;
00018:
}
如果程序繼續(xù)運行,從bar ()函數(shù)返回到foo ()函數(shù)中,那么其所占用的棧空間就從大約12K字節(jié)變成了大約8K字節(jié)了。相類似的是,如果程序從foo ()函數(shù)中返回到main ()函數(shù),那么所占用的??臻g又變?yōu)榇蠹s4K字節(jié)了。對于嵌入式系統(tǒng)開發(fā),由于任務(wù)棧通常都比較的小,那這告訴我們什么呢?我想有以下幾點需要注意。
1)函數(shù)的調(diào)用深度越是深,由于每一級的函數(shù)通常都會有局部變量,那么所使用的棧空間也會累積得越大。
2)遞歸調(diào)用需要的棧空間會相對的大(視具體的情況),在嵌入式系統(tǒng)中也建議少用。
3)我們應(yīng)當盡可能的不要在函數(shù)中定義占用內(nèi)存空間較大的局部變量。
下面,我們總結(jié)一下堆與棧的區(qū)別,它們是:
1)堆是大家共享的。任務(wù)可以通過調(diào)用API來從堆中分配內(nèi)存空間。
2)棧是任務(wù)所獨有的。在嵌入式系統(tǒng)中,當一個任務(wù)創(chuàng)建起來后其??臻g的大小往往是定了的。函數(shù)中的局部變量是由編程語言自動從棧上分配的,我們不需要調(diào)用API進行空間分配。
最后我有一個問題留給讀者您,這個問題是:
前面的講解中,我們說任務(wù)的棧是由操作系統(tǒng)的任務(wù)創(chuàng)建API從堆中分配出來的,那棧是否也可以位于.data段或是.bss段中呢?為什么?
答案
由于堆從本質(zhì)上說來就是一塊內(nèi)存,由于在C語言中一塊內(nèi)存可以從堆中分配,也可以從.data段或是.bss段中分配。因此,任務(wù)的棧也是可以從這三塊內(nèi)存中分配獲得,也就是說最終的答案是:可以。
你或許還想看一看《程序中的段》。
如果你覺得本文的哪些地方需要改進或是存在一些不明白的地方,請留言。如果你想?yún)⑴c討論嵌入式系統(tǒng)開發(fā)相關(guān)的話題,請加入技術(shù)圈(g.51cto.com/UltraEmbedded)。
上一頁
1
2
下一頁
關(guān)鍵詞:
嵌入式開發(fā)堆和
評論
我來說兩句……
驗證碼:
相關(guān)推薦
[跟我學嵌入式開發(fā)] 堆和棧
嵌入式系統(tǒng)
嵌入式開發(fā)堆和
| 2016-11-28
上一篇:stm32利用固件庫開發(fā)USB步驟
下一篇:stm32 usb枚舉過程
技術(shù)專區(qū)
FPGA
DSP
MCU
示波器
步進電機
Zigbee
LabVIEW
Arduino
RFID
NFC
STM32
Protel
GPS
MSP430
Multisim
濾波器
CAN總線
開關(guān)電源
單片機
PCB
USB
ARM
CPLD
連接器
MEMS
CMOS
MIPS
EMC
EDA
ROM
陀螺儀
VHDL
比較器
Verilog
穩(wěn)壓電源
RAM
AVR
傳感器
可控硅
IGBT
嵌入式開發(fā)
逆變器
Quartus
RS-232
Cyclone
電位器
電機控制
藍牙
PLC
PWM
汽車電子
轉(zhuǎn)換器
電源管理
信號放大器
關(guān)閉
評論