CPU的彙編啓動代碼

在學習STM32的時候一直看不明白Startup_stm32f40_41xxx.s這個文件。裏邊寫的每句話好像也能看懂但是就不知道他想幹嘛。現在終於有點體會了所以來在這裏記錄下來,希望能對後來的人有幫助。
1、首先啓動代碼要確定的是都用匯編來寫,因爲C語言是不能實現的。這個原因是因爲C語言想要運行必須要有堆棧的支持,如果沒有堆棧(這裏最重要的是棧,因爲堆可能不需要)那麼C程序運行後就會指向了一個不知道什麼地方的地方就會出錯程序就跑飛了。從這裏看C不是不能執行是執行了就肯定會出錯。因此必須要用匯編來給C搭建好棧空間好讓他正確執行。
2、啓動代碼也並不是所有的硬件都需要,比如我們用C51的時候就沒有看到這個啓動代碼,上來就用C來寫程序了。這是因爲C51的硬件內部完成了c所需要的棧所以能執行,還有就是普通PC,他的啓動代碼是在BIOS(BIOS應該是一塊很小的NorFlash吧,好像記得是)裏燒寫好了他做的啓動工作裏有一部分肯定是棧和堆的初始化。STM32的啓動代碼是廠家給你寫好的可以看到開頭就有如下內容
Stack_Size EQU 0x00000400

            AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size
__initial_sp

可以看到大小是1K的一個棧直接初始化了CPU的SP指針也就是說把棧初始化好了。因爲在ARM中SP就是r13隨便上網查一下就知道了。
還用STM32的啓動代碼來說接着就是異常向量表,這個不用管這是硬件規定好的名字你想改也不能改(最多也就是用#define來包裝一層),之後就是Reset_Handler這個標籤也就可以認爲是C中的函數吧。跟着是
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
跳轉到SystemInit因爲用的是BL所有能返回來,在調用就是我們寫的main函數了用bx調用所有就不用返回了。
3、總結一下也就是說一般這種嵌入式或者是單片機的啓動代碼一般只做時鐘初始化、關閉看門狗(可能有的CPU硬件裏邊已經給你做了)、還有就是初始化棧和堆接着就可以跑你的C程序了。也就是加載bootloder和操作系統什麼的吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章