ARM菜鳥成長記--之三
啟動代碼應該是剛接觸ARM的新手必須面對而又很頭痛的問題吧,剛開始我也很納悶,為什么搞個這玩意,學51的時候咋就沒見過呢。而且還都是匯編寫的,俺的匯編還停留在“MOV”階段,其他的不是很懂,沒辦法,誰讓匯編的效率高呢。提到啟動代碼還不得不老生常談一下其中要完成的任務:
1、建立異常中斷向量表,ARM從0X0開始給每個異常中斷分配4個字節(jié)的空間,一般存放一個跳轉指令(B)或PC的裝載指令(LDR PC,X_Vector),當發(fā)生異常時,ARM從此處取得相應異常中斷處理程序入口地址,再跳轉執(zhí)行;
2、ARM都是高速處理器,而在高速下啟動很可能會不穩(wěn)定,所以在啟動代碼從慢時鐘開始運行,在適當?shù)奈恢茫瑥?2.768K切換到高速運行;
3、ARM一般帶有片外存儲器,F(xiàn)lash、SDRAM等,這些存儲器都需要初始化才能使用,這都是在啟動代碼中完成,但是Norflash的初始化要在時鐘初始化之前;
4、ARM有不同的模式,每種模式都需要相應的堆棧;
5、Copy異常中斷向量表到RAM,并實現(xiàn)REMAP,具體請參照上一節(jié);
6、Copy可執(zhí)行映像的數(shù)據(jù)段到RAM,并將ZI區(qū)清零。這個一般都是由編譯器完成的,IAR下是?main來實現(xiàn),Keil中由__main實現(xiàn)。
現(xiàn)在啟動代碼可以看懂一些,不過自己寫啟動代碼還是很遙遠的事情。如果開始對啟動代碼很抵觸,可以考慮使用Keil,因為Keil由啟動代碼的圖形化配置,直接點擊鼠標操作就可以實現(xiàn)自己的啟動代碼。下面結合我們at91sam9260的板子,說說Keil中的啟動代碼。
打開Keil生成的SAM9260.S,點擊左下角的“Configuration Wizard”進入圖形化配置向導,根據(jù)你的需要選擇參數(shù),全部選擇完畢后,再點擊"Text Editor",將會看到生成的啟動代碼。
我靠,不是吧,將近2000行,開始你可能會很泄氣,但仔細一看,前面不都是些宏定義嘛,跟圖形化配置向導一一對應的,只有從1200多行的這一句開始的才是真正的啟動代碼部分。
;----------------------- CODE --------------------------------------------------
PRESERVE8
開始是8個PC裝載指令,注意第六個向量,即地址0X14處,存放可執(zhí)行映像的大小,||Image
。
接下來是SMC、PMC的初始化,我們的板子外擴了Norflash,如果在未初始化Norflash前,切換到快時鐘,系統(tǒng)起不來,所以應該先初始化SMC,再初始化PMC,而Keil自帶的啟動代碼中默認PMC在前,怎么辦,可以將前面PMC的宏定義部分和初始化部分剪切,然后分別粘貼在SMC宏定義部分和初始化部分的后面,然后再看“Configuration Wizard”中,PMC自動放到了SMC的后面了。
接下來是關閉看門狗(默認是打開的),拷貝異常中斷表到RAM中,然后REMAP,建立緩存,建立各個模式的堆棧指針。
最后進入__main進行數(shù)據(jù)段和代碼段的拷貝以及初始化C語言庫函數(shù),然后跳轉到main執(zhí)行。
Keil中有詳細的注釋,理解起來應該不是很難,具體的語句無需明白,知道個大致意思就行了。無非是將某個外設的基地址裝載(LDR)到一個寄存器R0,將要向這個外設的某個寄存器賦的值裝載到另一個寄存器R1,然后加載(STR)。一般的模式就是這樣:
LDR R0,=Periphral_BASE ;某外設的基地址
LDR R1,=0XFFFF0000 ;向寄存器要賦的值
STR R1,[R0,#Periphral_Register_OFS] ;向外設Peripheral基地址偏移OFS的寄存器Register賦值0xFFFF0000
Keil的啟動代碼部分有兩個注意的地方:
1、啟動代碼中有很多IF語句,如:IF :DEF:RAM_INTVEC。這就可以通過在Options/Asm對話框中的Define中填入RAM_INTVEC就可以實現(xiàn)中斷向量從Flash到RAM的拷貝。同理,還有IF :DEF:REMAP等等;
2、帶有Keil特色的MICROLIB,通過在Options/Target中選擇“Used MICROLIB”,比不使用微庫相比生成的代碼較小。不過除此之外,應該還有其他的關系,因為我們的程序如果選擇不使用微庫的話,就執(zhí)行不成功。對于微庫只有這些很片面的理解,還請老手指教。
總而言之,Keil中的啟動代碼還是比較好理解的,而且借助圖形化配置向導,可以更快的上手,以實現(xiàn)自己的啟動代碼。
下面要說說Keil下,怎樣實現(xiàn)程序在片外Norflash運行、片外SRAM調試、片外SRAM運行。
評論