天天看點

彙編寫啟動代碼之設定棧和調用C語言1

《朱老師物聯網大講堂》學習筆記

學習位址:www.zhulaoshi.org

一直以來我們都是在用彙編代碼在寫程式

那麼怎樣才能用C語言來寫程式,以及如何去調用呢?

這就不得不提及“C語言運作時”,英文叫做runtime,這些環境條件,有彙編來提供,

主要是設定棧,棧是C語言中的一種資料結構,局部變量都是由棧來實作的,

要注意的是為C語言設定棧簡單,但是指定的棧空間要合理合法。

以前我們可能腦袋中就沒有這種意識,我還要自己設定棧啊,那是因為很多工作别人幫我們做好了。

比如gcc在編譯完連結的時候,會幫我們自己添加一個頭,

這個頭是引導我們的C程式能夠執行的一段彙編實作的代碼,

這段代碼就幫助我們的C程式設定了棧以及其它的運作時。

CPU模式和各種模式下的棧

棧,SP指針指向的位置,

在ARM中,有6個SP,好幾個模式都有自己的SP(r13)

如果隻有一個棧,應用程式出錯,就會使得作業系統的棧也損壞。

是以設定棧,就涉及兩個方面,一個是模式,其次才是設定合理的棧,

我們現在因為就是在SVC模式下,是以模式問題就解決了,

棧必須是目前一段可以使用的記憶體(注意目前CPU剛複位)

可用的意思是這個地方必須有被初始化可以通路的記憶體,

而且這個記憶體隻會被我們用做棧,

是以目前隻好用SRAM中的記憶體來初始化SVC模式下的棧。

提到棧,就不得不說下常用的棧類型

滿棧進棧是先移動指針再存

滿棧出棧是先出資料再移動指針

空棧進棧先存再移動指針

空棧出棧先移動指針再取資料

減棧指針是往下移動的

增棧指針是往上移動的

總結:增棧,減棧就是說棧使用的方向,壓棧的時候,棧空間是從上往下,還是從下往上使用,

滿棧和空棧,其實就是說目前指針所在位置是否有東西,也就是值。

那我們該用那種呢?其實這個問題不用我們考慮,

因為在ARM中,ATPCS(ARM關于程式應該怎樣實作的一個規範)要求使用滿減棧,

結合下圖中S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf的memory map可知,

我們的棧應該設定為0xD0037D80,而不是0xD0037780,

補充說明一點,當初我們學習啟動過程時候,BL1用了SRAM的前16KB,後面80KB沒用,這裡似乎得到了解答,

彙編寫啟動代碼之設定棧和調用C語言1

相關代碼就是

#define SVC_STACK  0xD0037D80

ldr sp, =SVC_STACK

哈哈,後面就可以用C實作了,

彙程式設計式就可以和C程式互相調用了,

比如bl cfunction