ARM启动代码注释
arm920T的微型OS,主要是想借着写OS的过程学习ARM的底层编程,然后跳到Linux。启动代码是固件的一部分,最经学校要搞个设计,不知OS什么时候能写好,反正搞定后立即发帖。
;*
;* 文件名称 : 2410INIT.S
;* 文件功能 : S3C2410 启动代码,配置存储器,ISR,堆栈,初始化C向量地址
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/00/00
;* 版本声明 : V0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : kwtark(samsung)
;* 创建日期 : 2002/02/25
;* 版本声明 : ver 0.0
; 2002/03/20: purnnamu: Add some functions for testing STOP,POWER_OFF mode
; 2002/04/10: SJS:sub interrupt disable 0x3ff -> 0x7ff
;*-----------------------------------------------------------------------------------------------------------
;*************************************************************************************************************
;*/
GET 2410addr.s ;定义了2410各各寄存器的地址
GET memcfg.s ;定义了2410各内存bank的带宽值和访问参数
BIT_SELFREFRESH EQU(1<22) ;定义了几个常数 _STACK_BASEADDRESS EQU 0x33ff8000堆栈基地址
; _ISR_STARTADDRESS EQU 0x33ffff00 中断向量表基地址
;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 ;屏蔽中断位
;/*************定义处理器各模式下堆栈地址常量*******************/
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...@ADS1.0) is used. ADS编译器的检查 */
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CO
|
THUMBCODE SETL {FALSE}
]
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
movpc,lr
]
MEND
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND
;/*******************************************************************************************************/
; 正式代码的开始,首先是分配中断向表
;/******************************************************************************************************/
MACRO;先定义了一个负责处理中断宏
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
subsp,sp,#4 ;减少sp,保存跳转地址
stmfdsp!,{r0} ;PUSH the work register to stack(lr doest 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
IMP
IMP
IMP
IMP
IMP
;指示编译器的符号不是在本源文件中定义的,而是在其他源文件中
;定义的,在本源文件中可能引用该符号
AREA Init,CO
ENTRY;程序的入口点
;//1)The co
;//2)The following little endian co
;// The co
;//3)The pseudo instruction,DCD cant be used here because the linker generates error.
ASSERT:DEF:ENDIAN_CHANGE ;//断言已经定义大端模式
[ ENDIAN_CHANGE
ASSERT :DEF:ENTRY_BUS_WIDTH
[ ENTRY_BUS_WIDTH=32
bChangeBigEndian ;DCD 0xea000007
]
[ ENTRY_BUS_
ARM启动代 相关文章:
- 分析ARM启动代码和中断处理过程(11-25)
- ARM简单启动代码及中断处理分析(11-24)
- ARM启动代码分析(2440init.c)(11-22)
- arm启动代码详细分析(11-21)
- LPC2000系列ARM启动代码(startup部分)(11-20)
- ARM启动代码研究(11-20)