TQ2440启动代码分析(一)
;=========================================
; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
; Initialize C-variables
;=========================================
启动代码主要是在主程序运行之前初始化系统硬件及软件的运行环境,它的主要功能包括以下的几个方面:
1、建立中断向量表
2、初始化系统堆栈
3、应用程序执行环境初始化
4 跳转至主函数
接下来对各个部分进行分析
;GET 是包含头文件的意思,相当于C语言中的include,是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理
GET option.inc ;option.inc文件包含了开发板的配置信息—堆栈、时钟等
GET memcfg.inc ;存储控制文件
GET 2440addr.inc ;寄存器地址地址定义
BIT_SELFREFRESH EQU (1<22) ;SDRAM自刷新标志位
;预定义的工作模式
;ARM 有7 种模式,用户模式,快速中断模式,中断模式,管理模式,中止模式,未定
;义模式和系统模式。系统堆栈的初始化主要是给各个处理器模式分配堆栈空间。堆栈是为
;中断或程序跳转服务的,当发生中断或程序跳转时,需要将当前处理器的状态及一些参数
;保持在堆栈中,当中断处理完毕以后或程序执行完后返回时,再将堆栈保存的现场数据进
;行恢复,以保证原来的程序正确运行
;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
;定义各种模式下使用的堆栈起始地址,_STACK_BASEADDRESS是由option.inc定义的
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 ...@ADS 1.0) is used.
; 判断是否THUMB指令
; [ 代表IF,| 指的是ELSE,] 相当于ENDIF
GBLL THUMBCODE ;定义一个局部变量THUMBCODE
[ {CONFIG} = 16 ;如果是16位代码,则将THUMBCODE设为真
THUMBCODE SETL {TRUE} ;
CODE32 ;否则是ARM指令
|
THUMBCODE SETL {FALSE}
]
; 宏定义,用于子程序的返回
MACRO
MOV_PC_LR
[ THUMBCODE ;如果目标地址是THUMB的指令,则跳到THUMB地址
bx lr ;在ARM模式中,要用BX指令跳转到THUMB指令,并转换模式
|
mov pc,lr ;如果目标地址是ARM指令,则直接把函数返回地址给PC
]
MEND
MACRO
MOVEQ_PC_LR ;带条件的函数返回,与MOV_PC_LR类似
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND
PS:下面这一段是网上找的,我觉得它已经介绍的非常好了,所以就直接拿过来用来,呵呵
;===============================================================
;下面这个宏是用于第一次查表过程的实现中断向量的重定向,你会发现
;在_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
;===============================================================
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 does not p
TQ2440启动代 相关文章:
- TQ2440启动代码分析(二)(11-26)
- TQ2440启动代码分析(三)(11-20)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)