轉自:http://blog.chinaunix.net/uid-26435987-id-3073901.html
啓動代碼主要是在主程序運行之前初始化系統硬件及軟件的運行環境,它的主要功能包括以下的幾個方面:
1、建立中斷向量表
2、初始化系統堆棧
3、應用程序執行環境初始化
4、跳轉至主函數
第一部分
GET option.inc ;option.inc文件包含了開發板的配置信息—堆棧、時鐘等
GET memcfg.inc ;存儲控制文件
GET 2440addr.inc ;寄存器地址地址定義
注意: 彙編不能使用include包含頭文件,所有用Get,功能:引進一個被編譯過的文件
彙編也不認識*.h 文件,所有隻能用*.inc
第二部分
;EQU爲程序中的常量、標號等定義一個等效的字符名稱,相當於C語言中的define
;定義SDRAM工作在Refresh模式,SDRAM有兩種刷新方式:autorefresh和selfrefresh,前者是在其使用過程當中每隔一段時間發出刷新指令,SDRAM刷新一行,selfrefresh是在省電模式時使用。標示:REFRESH寄存器[22]bit : 0- auto refresh; 1 - self refresh
BIT_SELFREFRESH EQU (1<<22) ;用於節電模式中,SDRAM自刷新標誌位
第三部分(簡單略過)
;系統的工作模式設定,共七種工作模式
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;設置6種工作模式的堆棧的起始地址
;在option.inc中定義了_STACK_BASEADDRESS EQU 0x33ff8000
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~
第四部分:
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
; 判斷是否THUMB指令
; [ 代表IF,| 指的是ELSE,] 相當於ENDIF
GBLL THUMBCODE ;定義一個全局的邏輯變量,變量名爲THUMBCODE
[ {CONFIG} = 16 ;如果是CONFIG}= 16,表明現在處於thumb狀態
THUMBCODE SETL {TRUE} ;將該變量賦值爲真,表示告訴系統當前想用Thumb,但實際啓動時不行,只能從ARM啓動後再跳轉到thumb
CODE32 ;啓動時強制使用32 位ARM編譯模式
|
THUMBCODE SETL {FALSE};如果系統要求是ARM 指令,則直接設置THUMBCODE
爲false ,說明當前的是32 位編譯模式
]
;宏定義MOV_PC_LR,作用:子程序返回
MACRO ;宏定義
MOV_PC_LR
[ THUMBCODE ;目標地址是THUMB指令
bx lr ;在ARM模式中,要用BX指令跳轉到THUMB指令,並轉換模式
|
mov pc,lr ;如果目標地址是ARM指令,則直接把函數返回地址給PC
]
MEND ;宏定義結束
;宏定義MOVEQ_PC_LR,作用:帶相等條件判斷的子程序返回 。與宏定義
;帶條件的函數返回,與MOV_PC_LR類似
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND ;宏定義結束