微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM启动代码注释

ARM启动代码注释

时间:11-11 来源:互联网 点击:

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}

CODE32

|

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

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 ;声明一个代码段,名为:Init

ENTRY;程序的入口点

;//1)The code, which converts to Big-endian, should be in little endian code.

;//2)The following little endian code will be compiled in Big-Endian mode.

;// The code byte order should be changed as the memory bus width.

;//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_

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top