S3C2440裸机驱动--启动代码

功能:作为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个字空间&#
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值