對于熟悉電腦的伙伴們來說,BIOS(那個藍色的界面)可能不會太陌生吧,這貨就是電腦的啟動代碼。沒有BIOS的電腦,那注定是一塊板磚!BIOS主要是做一些開機前的準備工作,例如系統時間設定、啟動順序。。。扯遠了
其實電腦本身就是從單片機而來,那么單片機也是有啟動代碼的,只是我們絕大部分情況 不去關心它。
啟動代碼究竟都干了些什么工作,為何需要它?想想你在c語言中用到了什么東西,而這些東西卻是拿來就可以用的?堆、棧!沒錯,就是他們。我們知道堆和棧是內存中劃分出的一塊區域,那為什么我們沒有親自劃分呢,因為啟動代碼幫了你的忙!!!再想想單片機工作的時候,有哪些配置被我們忽略了,而它卻可以用?時鐘,就是這貨,我們可以不配置時鐘,而你發現它竟然有默認值!還是啟動代碼幫了你
接下來仔細研究一下stm32的啟動代碼,首先要知道啟動代碼藏在哪里:一個叫做startup的匯編文件。啟動代碼是對硬件的一個最初級的配置,它必須用匯編語言來實現,匯編是真正的硬件編程語言。
從上到下解讀啟動代碼
1、定義棧大小
2、定義堆大小
3、中斷向量地址
ps:Cortex-M4內核要求內存的第一個地址是棧指針,第二個地址開始為中斷向量。而中斷向量的第一個必須是復位,因為代碼是從上到下執行,開機首先遇到的就是復位
4、復位中斷處理函數
ps1:仔細那看有兩個東西需要注意:“SystemInit”這個是時鐘初始,“__main”這一句代表跳轉到“main”函數。正因為復位這樣的寫法,所以程序都是從main函數開始執行的
ps2:“SystemInit”具體實現過程在stm32fxxx.c,“__main”也是在某個地方與真正的main關聯起來
5、其他中斷處理函數
ps1:絕大部分中斷的實現系統沒有給出,等待程序猿去寫。但是中斷的名字我們都可以看到的,每一個名字都和上面向量表中對應著。我們知道函數名其實就是一個地址,而中斷的入口地址是固定的,只要找對名字,那地址也就找對了。
ps2:中斷的入口地址由內核和芯片決定,無法更改。因此不要改啟動代碼中的中斷向量表
6、初始化堆、棧
ps:正因為堆和棧已經被初始化,所以你的C語言才可以順利的執行
啟動代碼是非常關鍵的,所有的CPU都有啟動代碼。這里完成了最基本的初始化功能,尤其是中斷向量表,程序猿每一個中斷函數的名字都要與啟動代碼中的向量表對應,否則中斷是無法進入的。
-
單片機
+關注
關注
6037文章
44558瀏覽量
635309 -
STM32
+關注
關注
2270文章
10900瀏覽量
356012 -
BIOS
+關注
關注
5文章
469瀏覽量
45702
發布評論請先 登錄
相關推薦
評論