没有合适的资源?快使用搜索试试~ 我知道了~
S3C2410启动程序设计——2410Init.s详细分析
需积分: 13 201 下载量 89 浏览量
2008-07-31
18:39:19
上传
评论
收藏 219KB PDF 举报
温馨提示
试读
28页
S3C2410启动程序设计——2410Init.s详细分析<br>工程里面的头文件 2410Init.s包括了板子上电后的初始化(与vivi很相似),具体有几个步骤:<br>1. 屏蔽所有中断,关看门狗。<br>2. 根据工作频率设置PLL寄存器<br>3. 初始化存储控制相关寄存器<br>4. 初始化各模式下的栈指针<br>5. 设置缺省中断处理函数<br>6. 将数据段拷贝到RAM中,将零初始化数据段清零<br>7. 跳转到C语言Main入口函数中<br>在开发板上跑了一遍,基本过程已经清晰,还有些细节问题有待进一步深入研究!<br>将这个程序注释了一下,可能有些地方不是很正确,只提供参考<br>…………<br>…………<br>
资源推荐
资源详情
资源评论
2410Init.s 详细注释分析 Crealse.Sheng
第 1 页 共 28 页
S3C2410 启动程序设计——2410Init.s 详细分析
工程里面的头文件 2410Init.s 包括了板子上电后的初始化(与 vivi 很相似),具体有几个步骤:
1. 屏蔽所有中断,关看门狗。
2. 根据工作频率设置 PLL 寄存器
3. 初始化存储控制相关寄存器
4. 初始化各模式下的栈指针
5. 设置缺省中断处理函数
6. 将数据段拷贝到 RAM 中,将零初始化数据段清零
7. 跳转到 C 语言 Main 入口函数中
在开发板上跑了一遍,基本过程已经清晰,还有些细节问题有待进一步深入研究!
将这个程序注释了一下,可能有些地方不是很正确,只提供参考。
;=========================================
; NAME: 2410INIT.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,POWER_OFF mode
; 2002.04.10:SJS:sub interrupt disable 0x3ff -> 0x7ff
; 2002.11.29:Kong:DCD BANKSIZE Resiger 0x32 -> 0xb2 (ARM core burst enable)
;=========================================
INCLUDE option.inc
INCLUDE memcfg.inc
INCLUDE 2410addr.inc
BIT_SELFREFRESH EQU (1<<22)
;下面是对 arm 处理器模式寄存器对应值的常数定义,arm 处理器中有一个 CPSR程序状态寄存器,它的后五
位决定目前的处理器模式
;Pre-defined constants
批注 [Crealse1]: 这些文件定
义了一些地址数据等
2410Init.s 详细注释分析 Crealse.Sheng
第 2 页 共 28 页
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
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 is used.
;arm 处理器有两种工作状态:1.arm:32 位 这种工作状态下执行字对准的 arm 指令
2.Thumb:16 位 这种工作状;态执行半字对准的Thumb指令
;因为处理器分为 16 位 32 位两种工作状态,程序的编译器也是分 16 位和 32 两种编译方式,所以下面
的程序用于根据处理器工作状态确定编译器编译方式
;code16 伪指令指示汇编编译器后面的指令为 16 位的thumb指令
;code32 伪指令指示汇编编译器后面的指令为 32 位的arm指令
;这段是为了统一目前的处理器工作状态和软件编译方式(16 位编译环境使用tasm.exe编译
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
GBLL THUMBCODE
[ {CONFIG} = 16 ;if config==16 这里表示你的目前处于领先地 16 位编译方式
THUMBCODE SETL {TRUE};设置THUMBCODE 为 true
CODE32;转入 32 位编译模式
| ;else
批注 [Crealse2]:
_STACK_BASEADDRESS
EQU 0x33ff8000
_MMUTT_STARTADDRESS
EQU 0x33ff8000
_ISR_STARTADDRESS
EQU 0x33ffff00
批注 [Crealse3]: 各有优缺
点:执行效率、占用空间
2410Init.s 详细注释分析 Crealse.Sheng
第 3 页 共 28 页
THUMBCODE SETL {FALSE};设置THUMBCODE 为 false
]
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND
;注意下面这段程序是个宏定义 很多人对这段程序不理解 我再次强调这是一个宏定义 所以大家要注意了
;下面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开
;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
;本初始化程序定义了一个数据区(在文件最后),34 个字空间,存放相应中断服务程序的首地址。
; 每个字空间都有一个标号,以Handle***命名。
;在向量中断模式下使用“加载程序”来执行中断服务程序。
;这里就必须讲一下向量中断模式和非向量中断模式的概念
;向量中断模式是当cpu读取位于 0x18 处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址
上的指令取代 0x18 处的指令,通过跳转指令系统就直接跳转到对应地址函数中,节省了中断处理时间提
高了中断处理速度标。例如 ADC中断的向量地址为 0xC0,则在 0xC0 处放如下代码:ldr PC,=Handler
ADC 当ADC中断产生的时候系统会自动跳转到HandlerADC函数中。
;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pendi
批注 [Crealse4]: 宏定义!
批注 [Crealse5]: 两种主要的
中断方式!!
2410Init.s 详细注释分析 Crealse.Sheng
第 4 页 共 28 页
ng寄存器中对应标志位置位,然后跳转到位于 0x18 处的统一中断函数中,该函数通过读取interrupt pe
nding寄存器中对应标志位来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中。
MACRO
$HandlerLabel HANDLER $HandleLabel
;HandlerLabel为中断服务入口地址
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
;将要使用的r0 寄存器入栈
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it retu
rn to original address)
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
;将对应的中断函数首地址入栈
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
;将中断函数首地址出栈,放入程序指针中,系统将跳转到对应中断处理函数
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
;一个arm由RO,RW,ZI三个断组成——其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化
的全局变量(对于GNU工具 对应的概念是TEXT ,DATA,BSS)
;bootloader要将RW段复制到ram中并将ZI段清零,编译器使用下列段来记录各段的起始和结束地址
; |Image$$RO$$Base| ; RO段起始地址
; |Image$$RO$$Limit| ; RO段结束地址加 1
; |Image$$RW$$Base| ; RW段起始地址
; |Image$$RW$$Limit| ; RW段结束地址加 1
; |Image$$ZI$$Base| ; ZI段起始地址
; |Image$$ZI$$Limit| ; ZI段结束地址加 1
;这些标号的值是通过编译器的设定来确定的,如编译软件中对ro-base和rw-base的设定,例如 ro-;ba
se=0x3000000 rw-base=0x33F0000
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
批注 [Crealse6]: 中断服务
宏:保存现场,装载中断函
数地址,产生跳转
批注 [Crealse7]: 在编译器中
设置的地址作用在这里!
2410Init.s 详细注释分析 Crealse.Sheng
第 5 页 共 28 页
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
IMPORT Main ; The main entry of mon program
AREA Init,CODE,READONLY
;异常中断矢量表(每个表项占 4 个字节),下面是中断向量表,一旦系统运行时有中断发生,即使移植了
;操作系统如linux,处理器已经把控制权交给了操作系统,一旦发生中断,处理器还是会跳转到从0x0
;开始中断向量表中某个中断表项(依据中断类型)开始执行
;具体中断向量布局请参考 s3c44b0 spec,例如 adc 中断向量为 0x000000c0,下面对应表中第 49
项位置向量地址 0x0+4*(49-1)=0x000000c0
ENTRY
;板子上电和复位后,程序开始从位于 0x0 处开始执行硬件刚刚上电复位后,程序从这里开始执行跳转到
;标为ResetHandler处执行
;1)The code, which converts to Big-endian, should be in little endian code.
;2)The following little endian code will be compiled in Big-Endian mode.
; The code byte order should be changed as the memory bus width.
;3)The pseudo instruction,DCD can't be used here because the linker generates erro
r.
;总线宽度判断
;DCD用于分配一段字内存单片,并用后面的伪指令初始化
;分配字节由expr 个数决定
ASSERT :DEF:ENDIAN_CHANGE
[ ENDIAN_CHANGE
ASSERT :DEF:ENTRY_BUS_WIDTH
[ ENTRY_BUS_WIDTH=32
b ChangeBigEndian ;DCD 0xea000007
]
批注 [Crealse8]: 相当于复位
操作!
剩余27页未读,继续阅读
资源评论
feiyang_sheng
- 粉丝: 5
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功