首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM-S3C2440启动文件init.s解析

ARM-S3C2440启动文件init.s解析

;=========================================
; NAME: 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.14onGo: Modified for 2440.
; 2009 06.24:Tinko Modified
;=========================================

;汇编不能使用include包含头文件,所有用Get
;汇编也不认识*.h 文件,所有只能用*.inc
GET option.inc    ;定义芯片相关的配置
GET memcfg.inc    ;定义存储器配置
GET 2440addr.inc  ;定义了寄存器符号

;REFRESH寄存器[22]bit : 0- auto refresh; 1 - self refresh
BIT_SELFREFRESH EQU (1<<22) ;用于节电模式中,SDRAM自动刷新

;处理器模式常量: CPSR寄存器的后5位决定目前处理器模式 M[4:0]
USERMODE    EQU 0x10
FIQMODE     EQU 0x11
IRQMODE     EQU 0x12
SVCMODE     EQU 0x13
ABORTMODE   EQU 0x17
UNDEFMODE   EQU 0x1b
MODEMASK    EQU 0x1f  ;M[4:0]
NOINT       EQU 0xc0

;定义处理器各模式下堆栈地址常量
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~   _STACK_BASEADDRESS定义在option.inc中
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指令
;
;Arm上电时处于ARM状态,故无论指令为ARM集或Thumb集,都先强制成ARM集,待init.s初始化完成后
;再根据用户的编译配置转换成相应的指令模式。为此,定义变量THUMBCODE作为指示,跳转到main之前
;根据其值切换指令模式
;
;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
GBLL    THUMBCODE   ;定义THUMBCODE全局变量注意EQU所定义的宏与变量的区别
[ {CONFIG} = 16   ;如果发现是在用16位代码的话(编译选项中指定使用thumb指令)
THUMBCODE SETL {TRUE}  ;一方面把THUMBCODE设置为TURE
     CODE32    ;另一方面暂且把处理器设置成为ARM模式,以方便初始化

   |      ;(|表示else)如果编译选项本来就指定为ARM模式
THUMBCODE SETL {FALSE}  ;把THUMBCODE设置为FALSE就行了
]       ;结束

  MACRO    ;一个根据THUMBCODE把PC寄存的值保存到LR的宏
MOV_PC_LR    ;宏名称
   [ THUMBCODE       ;如果定义了THUMBCODE,则
     bx lr      ;在ARM模式中要使用BX指令转跳到THUMB指令,并转换模式.
  ;bx指令会根据PC最后1位来确定是否进入thumb状态
   |      ;否则,
     mov pc,lr  ;如果目标地址也是ARM指令的话就采用这种方式
   ]
MEND     ;宏定义结束标志

  MACRO     ;和上面的宏一样,只是多了一个相等的条件
MOVEQ_PC_LR
   [ THUMBCODE
        bxeq lr
   |
     moveq pc,lr
   ]
MEND

;=======================================================================================
继承事业,薪火相传
返回列表