《朱老師物聯網大講堂》學習筆記
學習位址: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沒用,這裡似乎得到了解答,
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN3YzMyITMwADOyMDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
相關代碼就是
#define SVC_STACK 0xD0037D80
ldr sp, =SVC_STACK
哈哈,後面就可以用C實作了,
彙程式設計式就可以和C程式互相調用了,
比如bl cfunction