在學(xué)?;蛘吒鞣N編程類書本上,基本上都會(huì)看到一句話:"函數(shù)是程序的基本組成單位",可以說(shuō)理解函數(shù)對(duì)編程是非常重要的,與函數(shù)調(diào)用緊密結(jié)合的機(jī)制就是函數(shù)調(diào)用棧了,而棧有一個(gè)特別的屬性就是棧的增長(zhǎng)方向問(wèn)題了,也發(fā)現(xiàn)一些多年編程經(jīng)驗(yàn)的朋友對(duì)這一塊都有點(diǎn)迷迷糊糊的。在閱讀RTOS源碼的時(shí)候也會(huì)經(jīng)??吹綏5脑鲩L(zhǎng)方向配置項(xiàng)目,那么今天就帶大家了解一下棧的增長(zhǎng)方向到底是咋回事。
1、棧的增長(zhǎng)方向
首先我們要明確的是棧同樣也是分布在我們的內(nèi)存之中,而內(nèi)存是通過(guò)地址來(lái)進(jìn)行編排訪問(wèn)的,如下是堆棧的示意圖:
對(duì)于堆棧而言原本并沒有方向一說(shuō),只有入棧和出棧一說(shuō),程序中執(zhí)行push指令則棧頂向上移動(dòng),執(zhí)行pop指令則棧頂向下移動(dòng),其僅僅只是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),增長(zhǎng)方向都是從棧底向棧頂方向移動(dòng),即分配數(shù)據(jù)的過(guò)程。
而我們平時(shí)所說(shuō)的棧的增長(zhǎng)方向又是怎么回事呢?
為了在內(nèi)存中分配一段內(nèi)存給堆棧,我們必須要區(qū)分堆棧相對(duì)于內(nèi)存的地址而言的方向性,通常棧頂增長(zhǎng)的方向是從內(nèi)存的低地址向高地址變化,我們則稱為向上增長(zhǎng);反之則向下增長(zhǎng)。
所謂"水往高處流,即向上增長(zhǎng)",這樣應(yīng)該就很好記憶了。
2、有什么用?
當(dāng)了解處理器中棧指針的增長(zhǎng)方向以后,我們?cè)赿ebug程序的時(shí)候才能真正的把控程序的運(yùn)行過(guò)程。
在移植RTOS的過(guò)程中我們都需要對(duì)每個(gè)任務(wù)的堆棧分配一個(gè)合適的連續(xù)內(nèi)存區(qū)域來(lái)使用,此時(shí)初始狀態(tài)堆棧指針指向什么位置就跟堆棧的增長(zhǎng)方向密切相關(guān),有過(guò)RTOS移植經(jīng)驗(yàn)的朋友應(yīng)該都有在RTOS配置項(xiàng)中關(guān)注過(guò)這塊的選擇。
RTOS在任務(wù)初始化的時(shí)候,其堆棧指針應(yīng)該指向其棧底位置,那么對(duì)于堆棧向上增長(zhǎng),任務(wù)初始化的時(shí)候我們需要把堆棧指針設(shè)置在所分配內(nèi)存的低地址內(nèi)存處,反之則設(shè)置到高地址處。
設(shè)置好以后,其在堆棧分配的過(guò)程中才會(huì)朝著所分配的內(nèi)存區(qū)域中,否則就會(huì)堆棧反向自爆,導(dǎo)致程序異常;如果你的堆棧分配不合理,同樣了解堆棧變化方向后也變得有跡可循。
同樣在裸機(jī)程序中也需要了解一下處理器的堆棧變化方向,從而用來(lái)排查一些堆棧溢出所導(dǎo)致的程序異常問(wèn)題。
3、用C語(yǔ)言如何判斷?
要了解一個(gè)CPU的堆棧的變換方向,一方面就是查詢相應(yīng)的芯片參考手冊(cè),另外一方面就是實(shí)際測(cè)試了。
畢竟堆棧也就是內(nèi)存,自然就可以通過(guò)堆棧的分配過(guò)程取出所分配的內(nèi)存地址來(lái)比較判斷,而C語(yǔ)言可以方便的訪問(wèn)內(nèi)存,也就比較容易判斷當(dāng)前處理器中堆棧指針的增長(zhǎng)方向了。
那還不簡(jiǎn)單,直接在函數(shù)內(nèi)部先后定義兩個(gè)局部變量,直接比較兩個(gè)變量的地址大小不就搞定了嗎?其實(shí)這種方式是依賴于編譯器實(shí)現(xiàn)的,畢竟哪個(gè)變量先進(jìn)行內(nèi)存申請(qǐng),并沒有太大的影響。
那么是否有一種方法不依賴于編譯器實(shí)現(xiàn)呢?
必須有的,那就是函數(shù)調(diào)用棧了,因?yàn)橄日{(diào)用的函數(shù)必然首先入棧。
基于這樣的思想,這里bug菌寫一個(gè)判斷堆棧增長(zhǎng)方向的demo供大家參考:
可以拿去試一試,看看你的芯片堆棧咋變化的~
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19384瀏覽量
230512 -
芯片
+關(guān)注
關(guān)注
456文章
51037瀏覽量
425503 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137261 -
RTOS
+關(guān)注
關(guān)注
22文章
817瀏覽量
119769
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論