在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费
新聞
研討會
設計
嵌入式系統(tǒng)
元件/連接器
電源與新能源
安全與國防
汽車電子
EDA/PCB
消費電子
工業(yè)自動化
模擬技術
醫(yī)療電子
測試測量
通信技術
光電顯示
網絡與存儲
智能計算
物聯(lián)網與傳感器
機器人
社區(qū)
論壇
開發(fā)板試用
博客
活動中心
積分禮品
技術匯
PI技術專區(qū)
ADI技術專區(qū)
美信技術專區(qū)
研華技術專區(qū)
貝能技術社區(qū)
Fluke技術社區(qū)
ZYNQ技術社區(qū)
世強專區(qū)技術社區(qū)
Microchip資源專區(qū)
Microchip視頻專區(qū)
Quark技術社區(qū)
Xilinx社區(qū)
MultiSIM BLUE
Andes專區(qū)
TE金屬混合保護專區(qū)
ADI視頻專區(qū)
OpenVINO生態(tài)社區(qū)
金升陽電源技術專區(qū)
Led技術社區(qū)
DSP技術社區(qū)
FPGA技術社區(qū)
MCU技術社區(qū)
USB技術社區(qū)
CPLD技術社區(qū)
Zigbee技術社區(qū)
Labview技術社區(qū)
Arduino技術社區(qū)
示波器技術社區(qū)
步進電機技術社區(qū)
無線充電技術社區(qū)
人臉識別技術社區(qū)
指紋識別技術社區(qū)
快捷導航
下載
電路
EETV
廠商專區(qū)
元件查詢
計算工具
資料庫
新聞中心
EEPW首頁
>
嵌入式系統(tǒng)
>
設計應用
> [跟我學嵌入式開發(fā)] 堆和棧
[跟我學嵌入式開發(fā)] 堆和棧
作者:
時間:2016-11-28
來源:網絡
加入技術交流群
掃碼加入
和技術大咖面對面交流
海量資料庫查詢
收藏
圖 3
對于堆我們已經知道了必須調用相應的API來分配內存,那從??臻g分配內存也需要調用API嗎?答案是通常不需要,為什么是通常?因為,在有的平臺上(Linux上就是)提供棧空間的分配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ù),那么所占用的棧空間大約就是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ù)中,那么其所占用的??臻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ā)堆和
評論
我來說兩句……
驗證碼:
相關推薦
[跟我學嵌入式開發(fā)] 堆和棧
嵌入式系統(tǒng)
嵌入式開發(fā)堆和
| 2016-11-28
上一篇:stm32利用固件庫開發(fā)USB步驟
下一篇:stm32 usb枚舉過程
技術專區(qū)
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
穩(wěn)壓電源
RAM
AVR
傳感器
可控硅
IGBT
嵌入式開發(fā)
逆變器
Quartus
RS-232
Cyclone
電位器
電機控制
藍牙
PLC
PWM
汽車電子
轉換器
電源管理
信號放大器
關閉
評論