S3C2440启动代码分析
时间:11-21
来源:互联网
点击:
- ;==;=========================================
- ;NAME:2440INIT.S
- ;DESC:Cstartupcodes
- ;Configurememory,ISR,stacks
- ;InitializeC-variables
- ;完全注释;=========================================
- ;NAME:2440INIT.S
- ;DESC:Cstartupcodes
- ;Configurememory,ISR,stacks
- ;InitializeC-variables
- ;完全注释
- ;HISTORY:
- ;2002.02.25:kwtark:ver0.0
- ;2002.03.20:purnnamu:AddsomefunctionsfortestingSTOP,Sleepmode
- ;2003.03.14:DonGo:Modifiedfor2440.
- ;200906.24:TinkoModified
- ;=========================================
- ;汇编不能使用include包含头文件,所有用Get
- ;汇编也不认识*.h文件,所有只能用*.inc
- GEToption.inc;定义芯片相关的配置
- GETmemcfg.inc;定义存储器配置
- GET2440addr.inc;定义了寄存器符号
- ;REFRESH寄存器[22]bit:0-autorefresh;1-selfrefresh
- BIT_SELFREFRESHEQU(1<22);用于节电模式中,SDRAM自动刷新
- ;处理器模式常量:CPSR寄存器的后5位决定目前处理器模式M[4:0]
- USERMODEEQU0x10
- FIQMODEEQU0x11
- IRQMODEEQU0x12
- SVCMODEEQU0x13
- ABORTMODEEQU0x17
- UNDEFMODEEQU0x1b
- MODEMASKEQU0x1f;M[4:0]
- NOINTEQU0xc0
- ;定义处理器各模式下堆栈地址常量
- UserStackEQU(_STACK_BASEADDRESS-0x3800);0x33ff4800~_STACK_BASEADDRESS定义在option.inc中
- SVCStackEQU(_STACK_BASEADDRESS-0x2800);0x33ff5800~
- UndefStackEQU(_STACK_BASEADDRESS-0x2400);0x33ff5c00~
- AbortStackEQU(_STACK_BASEADDRESS-0x2000);0x33ff6000~
- IRQStackEQU(_STACK_BASEADDRESS-0x1000);0x33ff7000~
- FIQStackEQU(_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编译
- ;Checkiftasm.exe(armasm-16...@ADS1.0)isused.
- GBLLTHUMBCODE;定义THUMBCODE全局变量注意EQU所定义的宏与变量的区别
- [{CONFIG}=16;如果发现是在用16位代码的话(编译选项中指定使用thumb指令)
- THUMBCODESETL{TRUE};一方面把THUMBCODE设置为TURE
- CODE32;另一方面暂且把处理器设置成为ARM模式,以方便初始化
- |;(|表示else)如果编译选项本来就指定为ARM模式
- THUMBCODESETL{FALSE};把THUMBCODE设置为FALSE就行了
- ];结束
- MACRO;一个根据THUMBCODE把PC寄存的值保存到LR的宏
- MOV_PC_LR;宏名称
- [THUMBCODE;如果定义了THUMBCODE,则
- bxlr;在ARM模式中要使用BX指令转跳到THUMB指令,并转换模式.bx指令会根据PC最后1位来确定是否进入thumb状态
- |;否则,
- movpc,lr;如果目标地址也是ARM指令的话就采用这种方式
- ]
- MEND;宏定义结束标志
- MACRO;和上面的宏一样,只是多了一个相等的条件
- MOVEQ_PC_LR
- [THUMBCODE
- bxeqlr
- |
- moveqpc,lr
- ]
- MEND
- ;=======================================================================================
- ;下面这个宏是用于第一次查表过程的实现中断向量的重定向,如果你比较细心的话就是发现
- ;在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表是采用型如Handle***的方式的.
- ;而在程序的ENTRY处(程序开始处)采用的是bHandler***的方式.
- ;在这里Handler***就是通过HANDLER这个宏和Handle***建立联系的.
- ;这种方式的优点就是正真定义的向量数据在内存空间里,而不是在ENTRY处的ROM(FLASH)空间里,
- ;这样,我们就可以在程序里灵活的改动向量的数据了.
- ;========================================================================================
- ;;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
- ;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字
- ;空间都有一个标号,以Handle***命名。
- ;在向量中断模式下使用“加载程序”来执行中断服务程序。
- ;这里就必须讲一下向量中断模式和非向量中断模式的概念
- ;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时
S3C2440启动代 相关文章:
- 深入分析S3C2440启动代码中大小端问题(11-22)
- S3C2440启动代码中应用程序执行环境的初始化(11-22)
- S3C2440启动代码 中断分析(11-22)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)