歡迎您光臨本站 註冊首頁

arm啟動代碼詳解(一)

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

;========================================= //;表示註釋語句,不參與編譯
; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
;=========================================


GET option.inc //GET即為包含文件,相當於c語言中的『#include』,option.inc定義了一些全局變數, memcfg.inc定義了關於內存bank的符號和數字常量, 2440addr.inc定義了用於彙編的2440寄存器變數和地址
GET memcfg.inc
GET 2440addr.inc

BIT_SELFREFRESH EQU (1<<22) //sdram自刷新位,用於將寄存器refresh的第22位置為1

;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起始地址
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.
GBLL THUMBCODE //定義一個全局的邏輯變數
[ {CONFIG} = 16 //相當於if CONFIG==16,即是一個判斷語句
THUMBCODE SETL {TRUE} //如果之前的判斷為真的,將THUMBCODE設為TRUE,否則設為FALSE
CODE32 //表明下面的指令是32位的arm指令
| //相當於c中的else
THUMBCODE SETL {FALSE}
]

MACRO //MACRO表示宏的開始, MEND表示宏的結束
MOV_PC_LR //宏名,用於跳齣子程序,返回被調用處
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND

MACRO
MOVEQ_PC_LR //有條件的跳齣子程序,返回被調用處
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND

/*
以下該宏的作用是:進入異常流程

將各個中斷程序的地址裝入當前的PC。2440有兩種中斷的模式,一種是沒有中斷向量表,一種是使用中斷向量表;使用中斷向量表的只能是IRQ方式,當使用中斷向量表的時候,中斷髮生時由2440的中斷控制器自動跳轉到相應的位置。
*/
MACRO
$HandlerLabel HANDLER $HandleLabel //$HandlerLabel為宏的標號, HANDLER為宏名, $HandleLabel 為宏的參數

$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
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
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND

/*
|Image$$RO$$Limit|等幾個符號是由連接器生成的輸出段相關的符號,用於引入連接器生成的映像文件的各個部分的地址。RO為只讀區域,RW為讀寫區域,ZI是初始化為0的區域
*/

IMPORT |Image$$RO$$Base| ; Base of ROM code //IMPORT指示編譯器當前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號
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 MMU_SetAsyncBusMode
IMPORT MMU_SetFastBusMode ;

IMPORT OS_CPU_IRQ_ISR ;add by YG
IMPORT Main ; The main entry of mon program
IMPORT RdNF2SDRAM ; Copy Image from Nand Flash to SDRAM
EXPORT HandleEINT0; //EXPORT聲明一個符號可以被其它文件引用,相當於聲明一個全局變數

[火星人 ] arm啟動代碼詳解(一)已經有467次圍觀

http://coctec.com/docs/linux/show-post-142598.html