功能:作为C程序启动代码,配置内存、中断向量、栈,初始化C语言环境变量
大概流程:
1.定义处理器模式及各模式的堆栈指针常量用于初始化堆栈sp(R13)
2.设置处理器模式
3.宏定义MOV_PC_LR,作用:子程序返回
4.第一次查表实现中断向量的重定向
5.代码入口
6.大小端判断与转换
7.中断的第二次查表
8.禁止看门狗,屏蔽所有中断
9.设置系统时钟频率
10.初始化内存控制器
;================================================================
; 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.14:DonGo: Modified for 2440.
; 2009 06.24:Tinko Modified
;================================================================
;================================================================
;GET和INCLUDE的功能是相同的,功能都是引进一些编译过的文件
;汇编不能使用include包含头文件,所以用Get
;汇编也不认识*.h 文件,所有只能用*.inc
;================================================================
GET option.inc ;定义芯片相关的配置,包含选项说明,如pll等
GET memcfg.inc ;定义存储器配置,包含MMU配置说明
GET 2440addr.inc ;定义了寄存器符号,包含各寄存器地址说明
;================================================================
;定义SDRAM工作在Reflesh模式下,SDRAM有两种刷新模式:selfreflesh,autoreflesh。
;后者是在其使用过程当中设置的。
;REFRESH寄存器[22]bit : 0- auto refresh; 1 - self refresh
; MMU自刷新
; EQU相当于C语言中的#define
;================================================================
BIT_SELFREFRESH EQU (1<<22) ;用于节电模式中,SDRAM自动刷新
;处理器模式常量: CPSR寄存器的后5位决定目前处理器模式 M[4:0]
;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 ;取消中断
;================================================================
;定义各模式的堆栈指针常量用于初始化堆栈sp(R13)
;用于下面对各个模式中堆栈的设置
;如何确保堆栈不会溢出?
;在ADS环境下ARM堆栈为只能为递减堆栈(SP向低地址方向伸张)
;堆栈参考:http://apps.hi.baidu.com/share/detail/5538633
;The location of stacks ;定义处理器各模式下堆栈地址常量
;在option.inc中定义了_STACK_BASEADDRESS EQU 0x33ff8000
;================================================================
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 ~
;================================================================
;检查在tasm.exe里是否设置了采用THUMB(16位)代码(armasm -16 ...@ADS 1.0)
;判断是不是thumb指令。
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
;{CONFIG}编译器内建变量具体参考手册
;================================================================
GBLL THUMBCODE ;定义THUMBCODE全局变量(逻辑型)
[ {CONFIG} = 16 ;如果发现是用16位代码的话
THUMBCODE SETL {TRUE} ;把THUMBCODE设置为TURE
CODE32
| ;否则是ARM模式
THUMBCODE SETL {FALSE}
]
;宏定义MOV_PC_LR,作用:子程序返回
;寄存器R14又被称为连接寄存器(LR),在ARM中有下面两种特殊用途。
;每一种处理器模式在自己的物理R14中存放当前子程序的返回地址。
;当通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址。
;在子程序中,当把R14的值复制到程序计数器PC中时,就实现了子程序返回
;详见http://blog.csdn.net/liufei_learning/archive/2010/08/22/5830374.aspx
MACRO ;宏定义
MOV_PC_LR
[ THUMBCODE ;在目标地址是THUMB指令,在ARM模式中
bx lr ;要用BX指令转THUMB 使跳到THUMB指令,并转换模式,BX会根据PC的最后一位判断是否进入thumb模式
|
mov pc,lr ;否则,就是目标地址是ARM模式,就直接把函数返回地址赋给PC
]
MEND
;宏定义MOVEQ_PC_LR,作用:带相等条件判断的子程序返回 。与宏定义
;MOV_PC_LR类似
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND ;宏定义结束
;===============================================================
;下面这个宏是用于第一次查表过程的实现中断向量的重定向,你会发现
;在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表
;是采用型如Handle***的方式的. 而在程序的ENTRY处(程序开始处)采用的是
;b Handler***的方式.
;在这里Handler***就是通过HANDLER这个宏和Handle***进立联系的.
;这种方式的优点就是正真定义的向量数据在内存空间里,而不是在ENTRY处
;的ROM(FLASH)空间里, 这样,我们就可以在程序里灵活的改动向量的数据了.
;其中HANDLER是一个宏,用于查找中断处理程序的入口地址。这些地址存放在
;由HandleXXX指向的表项中,该表定位在RAM高端,基地址为_ISR_STARTADDRESS。
;假如_ISR_STARTADDRESS为 0x800000000,当IRQ中断时,根据b HandlerFIQ,先跳转
;再根据^ _ISR_STARTADDRESS基地址+HandleIRQ 的偏移地址(4*6)得到的中断地址
;0x80000000+0x00000024=0x80000024
;==========================================================================================
;===============================================================================================================
;注意下面这段程序是个宏定义
;下面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开
;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
;本初始化程序定义了一个数据区(在文件最后),34个字空间&#