新聞
研討會
設計
嵌入式系統
元件/連接器
電源與新能源
安全與國防
汽車電子
EDA/PCB
消費電子
工業自動化
模擬技術
醫療電子
測試測量
通信技術
光電顯示
網絡與存儲
智能計算
物聯網與傳感器
機器人
社區
論壇
開發板試用
博客
活動中心
積分禮品
技術匯
PI技術專區
ADI技術專區
美信技術專區
研華技術專區
貝能技術社區
Fluke技術社區
ZYNQ技術社區
世強專區技術社區
Microchip資源專區
Microchip視頻專區
Quark技術社區
Xilinx社區
MultiSIM BLUE
Andes專區
TE金屬混合保護專區
ADI視頻專區
OpenVINO生態社區
金升陽電源技術專區
Led技術社區
DSP技術社區
FPGA技術社區
MCU技術社區
USB技術社區
CPLD技術社區
Zigbee技術社區
Labview技術社區
Arduino技術社區
示波器技術社區
步進電機技術社區
無線充電技術社區
人臉識別技術社區
指紋識別技術社區
快捷導航
下載
電路
EETV
廠商專區
元件查詢
計算工具
資料庫
新聞中心
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:
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:
}
如果程序繼續運行,從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
下一頁
關鍵詞:
嵌入式開發堆和
評論
我來說兩句……
驗證碼:
相關推薦
[跟我學嵌入式開發] 堆和棧
嵌入式系統
嵌入式開發堆和
| 2016-11-28
上一篇:stm32利用固件庫開發USB步驟
下一篇:stm32 usb枚舉過程
技術專區
FPGA
DSP
MCU
示波器
步進電機
Zigbee
LabVIEW
Arduino
RFID
NFC
STM32
Protel
GPS
MSP430
Multisim
濾波器
CAN總線
開關電源
單片機
PCB
USB
ARM
CPLD
連接器
MEMS
CMOS
MIPS
EMC
EDA
ROM
陀螺儀
VHDL
比較器
Verilog
穩壓電源
RAM
AVR
傳感器
可控硅
IGBT
嵌入式開發
逆變器
Quartus
RS-232
Cyclone
電位器
電機控制
藍牙
PLC
PWM
汽車電子
轉換器
電源管理
信號放大器
關閉
主站蜘蛛池模板:
寿光市
|
浦城县
|
乐山市
|
开鲁县
|
胶南市
|
当阳市
|
九江市
|
陆川县
|
新建县
|
建瓯市
|
镶黄旗
|
普陀区
|
喜德县
|
晋中市
|
太保市
|
盘锦市
|
开封市
|
商洛市
|
泰宁县
|
武鸣县
|
航空
|
巫溪县
|
左贡县
|
嵊泗县
|
大足县
|
延长县
|
馆陶县
|
宿州市
|
罗江县
|
喀什市
|
台东市
|
沙河市
|
北海市
|
太仆寺旗
|
黑河市
|
云阳县
|
新竹县
|
舞钢市
|
全州县
|
山阳县
|
余庆县
|
評論