TQ2440啟動代碼分析(一)
;=========================================
本文引用地址:http://m.butianyuan.cn/article/201611/321668.htm; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
;=========================================
啟動代碼主要是在主程序運行之前初始化系統(tǒng)硬件及軟件的運行環(huán)境,它的主要功能包括以下的幾個方面:
1、建立中斷向量表
2、初始化系統(tǒng)堆棧
3、應(yīng)用程序執(zhí)行環(huán)境初始化
4 跳轉(zhuǎn)至主函數(shù)
接下來對各個部分進行分析
;GET 是包含頭文件的意思,相當于C語言中的include,是將一個源文件包含到當前源文件中,并將被包含的文件在其當前位置進行匯編處理
GET option.inc ;option.inc文件包含了開發(fā)板的配置信息—堆棧、時鐘等
GET memcfg.inc ;存儲控制文件
GET 2440addr.inc ;寄存器地址地址定義
BIT_SELFREFRESH EQU (1<<22) ;SDRAM自刷新標志位
;預(yù)定義的工作模式
;ARM 有7 種模式,用戶模式,快速中斷模式,中斷模式,管理模式,中止模式,未定
;義模式和系統(tǒng)模式。系統(tǒng)堆棧的初始化主要是給各個處理器模式分配堆棧空間。堆棧是為
;中斷或程序跳轉(zhuǎn)服務(wù)的,當發(fā)生中斷或程序跳轉(zhuǎn)時,需要將當前處理器的狀態(tài)及一些參數(shù)
;保持在堆棧中,當中斷處理完畢以后或程序執(zhí)行完后返回時,再將堆棧保存的現(xiàn)場數(shù)據(jù)進
;行恢復(fù),以保證原來的程序正確運行
;Pre-defined constants
USERMODE EQU 0x10 ;用戶模式
FIQMODE EQU 0x11 ;快速中斷模式
IRQMODE EQU 0x12 ;中斷模式
SVCMODE EQU 0x13 ;管理模式
ABORTMODE EQU 0x17 ;中止模式
UNDEFMODE EQU 0x1b ;未定義模式
MODEMASK EQU 0x1f ;模式掩碼
NOINT EQU 0xc0 ;無中斷模式
;The location of stacks
;定義各種模式下使用的堆棧起始地址,_STACK_BASEADDRESS是由option.inc定義的
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 ;如果是16位代碼,則將THUMBCODE設(shè)為真
THUMBCODE SETL {TRUE} ;
CODE32 ;否則是ARM指令
|
THUMBCODE SETL {FALSE}
]
; 宏定義,用于子程序的返回
MACRO
MOV_PC_LR
[ THUMBCODE ;如果目標地址是THUMB的指令,則跳到THUMB地址
bx lr ;在ARM模式中,要用BX指令跳轉(zhuǎn)到THUMB指令,并轉(zhuǎn)換模式
|
mov pc,lr ;如果目標地址是ARM指令,則直接把函數(shù)返回地址給PC
]
MEND
MACRO
MOVEQ_PC_LR ;帶條件的函數(shù)返回,與MOV_PC_LR類似
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND
PS:下面這一段是網(wǎng)上找的,我覺得它已經(jīng)介紹的非常好了,所以就直接拿過來用來,呵呵
;===============================================================
;下面這個宏是用于第一次查表過程的實現(xiàn)中斷向量的重定向,你會發(fā)現(xiàn)
;在_ISR_STARTADDRESS=0x33FF_FF00里定義的第一級中斷向量表
;是采用型如Handle***的方式的. 而在程序的ENTRY處(程序開始處)采用的是
;b Handler***的方式.
;在這里Handler***就是通過HANDLER這個宏和Handle***進立聯(lián)系的.
;這種方式的優(yōu)點就是正真定義的向量數(shù)據(jù)在內(nèi)存空間里,而不是在ENTRY處
;的ROM(FLASH)空間里, 這樣,我們就可以在程序里靈活的改動向量的數(shù)據(jù)了.
;其中HANDLER是一個宏,用于查找中斷處理程序的入口地址。這些地址存放在
;由HandleXXX指向的表項中,該表定位在RAM高端,基地址為_ISR_STARTADDRESS。
;假如_ISR_STARTADDRESS為 0x800000000,當IRQ中斷時,根據(jù)b HandlerFIQ,先跳轉(zhuǎn)
;再根據(jù)^ _ISR_STARTADDRESS基地址+HandleIRQ 的偏移地址(4*6)得到的中斷地址
;0x80000000+0x00000024=0x80000024
評論