红联Linux门户
Linux帮助

arm启动代码详解(一)

发布时间:2011-03-13 18:36:37来源:红联作者:txgc_wm
;========================================= //;表示注释语句,不参与编译
; 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声明一个符号可以被其它文件引用,相当于声明一个全局变量
文章评论

共有 2 条评论

  1. 老去的孩子 于 2011-03-14 11:14:09发表:

    :0wl;l1眼花了。。

  2. serops 于 2011-03-13 21:03:40发表:

    太深奥了都