?? 44binit.s
字號:
; *******************************************************
; * NAME : 44BINIT.S *
; * Version : 10.JAn.2003 *
; * Description: *
; * C start up codes *
; * Configure memory, Initialize ISR ,stacks *
; * Initialize C-variables *
; * Fill zeros into zero-initialized C-variables *
; *******************************************************
GET option.inc
GET memcfg.inc
;Interrupt Control ;聲明符號常量定義寄存器的對應(yīng)地址
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
;Watchdog timer
WTCON EQU 0x01d30000
;Clock Controller
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;Memory Controller
REFRESH EQU 0x01c80024
;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
;check if tasm.exe is used.
GBLL THUMBCODE ;定義全局邏輯變量THUMBCODE
[ {CONFIG} = 16 ;相當(dāng)于if (CONFIG==16)
THUMBCODE SETL {TRUE} ; THUMBCODE=TRUE;
CODE32 ;聲明為32位指令集,即使用ARM指令進行編譯
| ;else
THUMBCODE SETL {FALSE} ; THUMBCODE=FALSE;
]
[ THUMBCODE ;if THUMBCODE=TRUE
CODE32 ;for start-up code for Thumb mode ;轉(zhuǎn)入32位編譯模式
]
;以下位宏定義,任何調(diào)用HandlerXXX HANDLER HandleXXX都將被下面的程序展開
;該宏定義的代碼用于將對應(yīng)中斷服務(wù)程序ISR的入口地址裝載到PC中,可稱之為“加載程序”
;本初始化程序定義了一個34個字空間的數(shù)據(jù)區(qū)(在文件最后),用于存放相應(yīng)中斷服務(wù)程序的首地址。
;每個字空間都有一個標(biāo)號,以HandleXXX命名。
;在向量中斷模式下使用“加載程序”來執(zhí)行中斷服務(wù)程序。
;********************************************************************************************
;**********向量中斷和非向量中斷模式的概念與區(qū)別**********************************************
;(一)
;向量中斷模式是當(dāng)CPU讀取位于0x18處的IRQ中斷指令的時候,系統(tǒng)自動讀取對應(yīng)于該中斷源確定地址上的指令取代0x18處的指令,
;通過跳轉(zhuǎn)指令系統(tǒng)就直接跳轉(zhuǎn)到對應(yīng)地址函數(shù)中,節(jié)省了中斷處理時間提高了中斷處理速度。
;例如 ADC 中斷的向量地址為0xC0,則在0xC0處放如下代碼:ldr PC,=HandlerADC 當(dāng)ADC中斷產(chǎn)生的時候系統(tǒng)會
;自動跳轉(zhuǎn)到HandlerADC函數(shù)中處理中斷。
;(二)
;非向量中斷模式處理方式是一種傳統(tǒng)的中斷處理方法,當(dāng)系統(tǒng)產(chǎn)生中斷的時候,系統(tǒng)將INTPND寄存器中對應(yīng)標(biāo)志位置位,
;然后跳轉(zhuǎn)到位于0x18處的統(tǒng)一中斷函數(shù)中;
;該函數(shù)通過讀取INTPND寄存器中對應(yīng)標(biāo)志位來判斷中斷源,并根據(jù)優(yōu)先級關(guān)系再跳到對應(yīng)中斷源的處理代碼中處理中斷。
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
;由于ADS僅支持FD(滿遞減)型堆棧
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)
;將要使用的R0寄存器壓棧保護。
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
;將對應(yīng)的中斷函數(shù)首地址入棧保護
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
;將中斷函數(shù)的首地址出棧,放入PC中,系統(tǒng)將跳轉(zhuǎn)到對應(yīng)中斷處理函數(shù)
MEND
;ARM的系統(tǒng)軟件開發(fā)中主要包含RO,RW,ZI三個段組成。
;其中RO為代碼段;RW為已經(jīng)初始化的全局變量;ZI是未初始化的全局變量
;(對于GNU來說,依次對.text .data .bss段)
;值得說明的是:
;Bootloader要將RW段復(fù)制到RAM中并將ZI段清零;
;編譯器要使用下列段來記錄各段的起始和結(jié)束地址。
; |Image$$RO$$Base| ; RO段起始地址
; |Image$$RO$$Limit| ; RO段結(jié)束地址+1
; |Image$$RW$$Base| ; RW段起始地址
; |Image$$RW$$Limit| ; RW段結(jié)束地址+1
; |Image$$ZI$$Base| ; ZI段起始地址
; |Image$$ZI$$Limit| ; ZI段結(jié)束地址+1
;這些標(biāo)號的值是通過編譯器的設(shè)定來確定的,如編譯軟件中對RO-base和RW-Base的設(shè)定
;
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
IMPORT Main ; The main entry of mon program
;以下為代碼段
AREA Init,CODE,READONLY
;說明:
;關(guān)鍵字ENTRY告訴編譯器保留這段代碼。
;從代碼看Init段就是要寫入0x00地址的原始中斷向量,
;因此把這個文件編譯生成的44binit.O和Init填入ADS-Linker-Layout頁對應(yīng)項中。
;【這樣編譯器會把該段代碼編譯到0X0地址。】
;
;異常中斷向量表【每個表項占4個字節(jié)】
;一旦系統(tǒng)運行時有中斷發(fā)生,即使移植了操作系統(tǒng),如linux。
;處理器已經(jīng)把控制權(quán)交給了操作系統(tǒng),一旦發(fā)生中斷,處理器還是會跳轉(zhuǎn)到從0x0開始執(zhí)行
;中斷向量表中的對應(yīng)中斷。
;具體中斷向量布局參考S3C44B0X Specification
;例如 ADC 的中斷向量為 0x000000c0 下面對應(yīng)表中第49項位置
;對應(yīng)向量地址為 0x0+4*(49-1)= 0x000000c0
ENTRY
;ENTRY程序入口標(biāo)號需要頂格式寫,否則出錯。
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ
b HandlerFIQ
;***IMPORTANT NOTE***
;If the H/W vectored interrutp mode is enabled, The above two instructions should
;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller.
; b HandlerIRQ -> subs pc,lr,#4
; b HandlerIRQ -> subs pc,lr,#4
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;mGA
b .
b .
ldr pc,=HandlerZDMA0 ;mGB
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
ldr pc,=HandlerBDMA1 ;
ldr pc,=HandlerWDT ;
ldr pc,=HandlerUERR01 ;mGB
b .
b .
ldr pc,=HandlerTIMER0 ;mGC
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;mGC
b .
b .
ldr pc,=HandlerURXD0 ;mGD
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;mGD
b .
b .
ldr pc,=HandlerRTC ;mGKA
b . ;
b . ;
b . ;
b . ;
b . ;mGKA
b .
b .
ldr pc,=HandlerADC ;mGKB
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
;0xe0=EnterPWDN
ldr pc,=EnterPWDN
LTORG
;下面是具體的中斷處理函數(shù)跳轉(zhuǎn)的宏,通過上面的$HandlerLabel的宏定義
;展開后跳轉(zhuǎn)到對應(yīng)的中斷處理函數(shù)(ISR)處理中斷(對于向量中斷)
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
HandlerADC HANDLER HandleADC
HandlerRTC HANDLER HandleRTC
HandlerUTXD1 HANDLER HandleUTXD1
HandlerUTXD0 HANDLER HandleUTXD0
HandlerSIO HANDLER HandleSIO
HandlerIIC HANDLER HandleIIC
HandlerURXD1 HANDLER HandleURXD1
HandlerURXD0 HANDLER HandleURXD0
HandlerTIMER5 HANDLER HandleTIMER5
HandlerTIMER4 HANDLER HandleTIMER4
HandlerTIMER3 HANDLER HandleTIMER3
HandlerTIMER2 HANDLER HandleTIMER2
HandlerTIMER1 HANDLER HandleTIMER1
HandlerTIMER0 HANDLER HandleTIMER0
HandlerUERR01 HANDLER HandleUERR01
HandlerWDT HANDLER HandleWDT
HandlerBDMA1 HANDLER HandleBDMA1
HandlerBDMA0 HANDLER HandleBDMA0
HandlerZDMA1 HANDLER HandleZDMA1
HandlerZDMA0 HANDLER HandleZDMA0
HandlerTICK HANDLER HandleTICK
HandlerEINT4567 HANDLER HandleEINT4567
HandlerEINT3 HANDLER HandleEINT3
HandlerEINT2 HANDLER HandleEINT2
HandlerEINT1 HANDLER HandleEINT1
HandlerEINT0 HANDLER HandleEINT0
;One of the following two routines can be used for non-vectored interrupt.
;下面這段程序是用來處理非向量中斷,具體判斷I_ISPR中各位是否置1 置1表示目前此中斷等待響應(yīng)(每次只能有一位置1),從最高優(yōu)先級中斷位開始判斷,檢測到等待服務(wù)
;中斷就將pc置為中斷服務(wù)函數(shù)首地址
IsrIRQ ;using I_ISPR register.
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
;IMPORTANT CAUTION
;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.
ldr r9,=I_ISPR
ldr r9,[r9]
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1
ldr r9,=HandleADC
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8]
ldmfd sp!,{r8-r9,pc}
;****************************************************
;* START *
;****************************************************
;板子上電和復(fù)位后,程序開始從位于0x0處執(zhí)行b ResetHandler ,從而跳轉(zhuǎn)到這里執(zhí)行程序。
;板子上電復(fù)位后,執(zhí)行以下幾個步驟,這里通過標(biāo)號在注釋中加1,2,3....表示,標(biāo)號表示執(zhí)行順序
;1.禁止看門狗,屏蔽所有中斷
ResetHandler
ldr r0,=WTCON ;watch dog disable
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -