微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440 2440init.s分析第一篇(一)

S3C2440 2440init.s分析第一篇(一)

时间:11-20 来源:互联网 点击:
S3C2440 2440init.s分析第一篇(一)

在网上转的,收集起来,下次要查看的时候方便点。

s3c2440启动文件分析
s3c2440启动文件分析
;=========================================

; [url=URL]NAME[/url]: 2440INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

; Initialize C-variables

; HISTORY:

; 2002.02.25:kwtark: ver 0.0

; 2002.03.20:purnnamu: Add some functions for testing STOP,Sleep mode

; 2003.03.14:DonGo: Modified for 2440.

;=========================================

GET option.inc

GET memcfg.inc

GET 2440addr.inc

BIT_SELFREFRESH EQU (1<22) ;bit[22]=1,others=0(把1左移22位)

;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 ;系统的堆栈空间设定

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 ~

;arm处理器有两种工作状态 1.arm:32位 这种工作状态下执行字对准的arm指令 2.Thumb:16位这种工作状

;态执行半字对准的Thumb指令

;因为处理器分为16位 32位两种工作状态 程序的编译器也是分16位和32两种编译方式 所以下面的程序用

;于根据处理器工作状态确定编译器编译方式

;code16伪指令指示汇编编译器后面的指令为16位的thumb指令

;code32伪指令指示汇编编译器后面的指令为32位的arm指令

;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译

;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.

GBLL THUMBCODE ;定义一个全局变量

[ {CONFIG} = 16 ;if config==16 这里表示你的目前处于领先地16位编译方式

THUMBCODE SETL {TRUE} ;设置THUMBCODE 为 true表示告诉系统当前想用thumb,但实际启动时不行,只能启动后再跳

; ][|]表示if else endif

CODE32 ;启动时强制使用32位编译模式

|

THUMBCODE SETL {FALSE} ;如果系统要求是ARM指令,则直接设置THUMBCODE 为 false 说明当前的是32位编译模式

]

MACRO ;宏定义

MOV_PC_LR

[ THUMBCODE

bx lr

|

mov pc,lr

]

MEND

MACRO

MOVEQ_PC_LR

[ THUMBCODE

bxeq lr ;相等Z=1,则跳转

|

moveq pc,lr

]

MEND

;注意下面这段程序是个宏定义 很多人对这段程序不理解 我再次强调这是一个宏定义 所以大家要注意了

;下面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开

;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。

;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字

;空间都有一个标号,以Handle***命名。

;在向量中断模式下使用“加载程序”来执行中断服务程序。

;这里就必须讲一下向量中断模式和非向量中断模式的概念

;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的;

;指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址

;函数中 节省了中断处理时间提高了中断处理速度标 例如 ADC中断的向量地址为0xC0,则在0xC0处放如下

;代码:ldr PC,=HandlerADC 当ADC中断产生的时候系统会

;自动跳转到HandlerADC函数中

;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt

;pending寄存器中对应标志位置位 然后跳转到位于0x18处的统一中断

;函数中 该函数通过读取interrupt pending寄存器中对应标志位 来判断中断源 并根据优先级关系再跳到

;对应中断源的处理代码中

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{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)

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

网站地图

Top