关于头文件 2410Inits的详细注释分析.docx
- 文档编号:29004358
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:41
- 大小:39.17KB
关于头文件 2410Inits的详细注释分析.docx
《关于头文件 2410Inits的详细注释分析.docx》由会员分享,可在线阅读,更多相关《关于头文件 2410Inits的详细注释分析.docx(41页珍藏版)》请在冰豆网上搜索。
关于头文件2410Inits的详细注释分析
#1楼主:
菜鸟进阶篇(4):
关于头文件2410Init.s的详细注释分析
文章发表于:
2007-12-1409:
06
工程里面的头文件2410Init.s包括了板子上电后的初始话,具体有几个步骤:
讲述S3C2410启动程序设计
1. 屏蔽所有中断,关看门狗。
2. 根据工作频率设置PLL寄存器
3. 初始化存储控制相关寄存器
4. 初始化各模式下的栈指针
5. 设置缺省中断处理函数
6. 将数据段拷贝到RAM中,将零初始化数据段清零
7. 跳转到C语言Main入口函数中
要看懂这个头文件是比较难的,我跟DVD视频的教程看了两遍,弄懂了一些,视频上讲的是ARM7S3C44B0的Init.s但我觉得和2410的差不多。
我将这个程序注释了一下。
可能有些地方不是很正确,只提供参考。
;=========================================
;NAME:
2410INIT.S
;DESC:
Cstartupcodes
; Configurememory,ISR,stacks
; InitializeC-variables
;HISTORY:
;2002.02.25:
kwtark:
ver0.0
;2002.03.20:
purnnamu:
AddsomefunctionsfortestingSTOP,POWER_OFFmode
;2002.04.10:
SJS:
subinterruptdisable0x3ff->0x7ff
;2002.11.29:
Kong:
DCDBANKSIZEResiger0x32->0xb2(ARMcoreburstenable)
;=========================================
INCLUDEoption.inc
INCLUDEmemcfg.inc
INCLUDE2410addr.inc
BIT_SELFREFRESHEQU(1<<22)
;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器它的后五位决定目前的处理器模式
;Pre-definedconstants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;Thelocationofstacks
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~
;checkiftasm.exeisused.
;arm处理器有两种工作状态1.arm:
32位这种工作状态下执行字对准的arm指令2.Thumb:
16位这种工作状;态执行半字对准的Thumb指令
;因为处理器分为16位32位两种工作状态程序的编译器也是分16位和32两种编译方式所以下面的程序用;于根据处理器工作状态确定编译器编译方式
;code16伪指令指示汇编编译器后面的指令为16位的thumb指令
;code32伪指令指示汇编编译器后面的指令为32位的arm指令
;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译
;Checkiftasm.exe(armasm-16...@ADS1.0)isused.
GBLL THUMBCODE
[{CONFIG}=16;ifconfig==16这里表示你的目前处于领先地16位编译方式
THUMBCODESETL {TRUE};设置THUMBCODE为true
CODE32;转入32位编译模式
| ;else
THUMBCODESETL {FALSE};设置THUMBCODE为false
]
MACRO
MOV_PC_LR
[THUMBCODE
bxlr
|
movpc,lr
]
MEND
MACRO
MOVEQ_PC_LR
[THUMBCODE
bxeqlr
|
moveqpc,lr
]
MEND
;注意下面这段程序是个宏定义很多人对这段程序不理解我再次强调这是一个宏定义所以大家要注意了
;下面包含的HandlerXXXHANDLERHandleXXX将都被下面这段程序展开
;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。
每个字
;空间都有一个标号,以Handle***命名。
;在向量中断模式下使用“加载程序”来执行中断服务程序。
;这里就必须讲一下向量中断模式和非向量中断模式的概念
;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的;
;指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址
;函数中节省了中断处理时间提高了中断处理速度标例如ADC中断的向量地址为0xC0,则在0xC0处放如下
;代码:
ldrPC,=HandlerADC当ADC中断产生的时候系统会
;自动跳转到HandlerADC函数中
;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt
;pending寄存器中对应标志位置位然后跳转到位于0x18处的统一中断
;函数中该函数通过读取interruptpending寄存器中对应标志位来判断中断源并根据优先级关系再跳到
;对应中断源的处理代码中
MACRO
$HandlerLabelHANDLER$HandleLabel
;HandlerLabel为中断服务入口地址
$HandlerLabel
sub sp,sp,#4 ;decrementsp(tostorejumpaddress)
;将要使用的r0寄存器入栈
stmfd sp!
{r0} ;PUSHtheworkregistertostack(lrdoes'tpushbecauseitreturntooriginaladdress)
ldr r0,=$HandleLabel;loadtheaddressofHandleXXXtor0
ldr r0,[r0] ;loadthecontents(serviceroutinestartaddress)ofHandleXXX
;将对应的中断函数首地址入栈
str r0,[sp,#4] ;storethecontents(ISR)ofHandleXXXtostack
;将中断函数首地址出栈放入程序指针中系统将跳转到对应中断处理函数
ldmfd sp!
{r0,pc} ;POPtheworkregisterandpc(jumptoISR)
MEND
;一个arm由RO,RW,ZI三个断组成其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化的全局变量
;(对于GNU工具对应的概念是TEXT,DATA,BSS)bootloader
;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-;base=0xc000000rw-base=0xc5f0000
IMPORT |Image$$RO$$Limit| ;EndofROMcode(=startofROMdata)
IMPORT |Image$$RW$$Base| ;BaseofRAMtoinitialise
IMPORT |Image$$ZI$$Base| ;Baseandlimitofarea
IMPORT |Image$$ZI$$Limit| ;tozeroinitialise
IMPORT Main ;Themainentryofmonprogram
AREA Init,CODE,READONLY
;异常中断矢量表(每个表项占4个字节)下面是中断向量表一旦系统运行时有中断发生即使移植了操作;系统如linux处理器已经把控制权交给了操作系统一旦发生中断处理器还是会跳转到从0x0开始
;中断向量表中某个中断表项(依据中断类型)开始执行
;具体中断向量布局请参考s3c44b0spec例如adc中断向量为0x000000c0下面对应表中第49项位置向量地址0x0+4*(49-1)=0x000000c0
ENTRY
;板子上电和复位后程序开始从位于0x0处开始执行硬件刚刚上电复位后程序从这里开始执行跳转到标?
;为ResetHandler处执行
;1)Thecode,whichconvertstoBig-endian,shouldbeinlittleendiancode.
;2)ThefollowinglittleendiancodewillbecompiledinBig-Endianmode.
; Thecodebyteordershouldbechangedasthememorybuswidth.
;3)Thepseudoinstruction,DCDcan'tbeusedherebecausethelinkergenerateserror.
;总线宽度判?
;DCD用于分配一段字内存单片,并用后面的伪指令初始化
;分配字节由expr个数决定
ASSERT :
DEF:
ENDIAN_CHANGE
[ENDIAN_CHANGE
ASSERT :
DEF:
ENTRY_BUS_WIDTH
[ENTRY_BUS_WIDTH=32
b ChangeBigEndian ;DCD0xea000007
]
[ENTRY_BUS_WIDTH=16
andeq r14,r7,r0,lsl#20 ;DCD0x0007ea00
]
[ENTRY_BUS_WIDTH=8
streq r0,[r0,-r10,ror#1];DCD0x070000ea
]
|
b ResetHandler
]
b HandlerUndef ;handlerforUndefinedmode
b HandlerSWI ;handlerforSWIinterrupt
b HandlerPabort ;handlerforPAbort
b HandlerDabort ;handlerforDAbort
b . ;reserved0x14
b HandlerIRQ ;handlerforIRQinterrupt
b HandlerFIQ ;handlerforFIQinterrupt
;@0x20
b EnterPWDN
;大小端判断
ChangeBigEndian
;@0x24
[ENTRY_BUS_WIDTH=32
DCD0xee110f10 ;0xee110f10=>mrcp15,0,r0,c1,c0,0
DCD0xe3800080 ;0xe3800080=>orrr0,r0,#0x80; //Big-endian
DCD0xee010f10 ;0xee010f10=>mcrp15,0,r0,c1,c0,0
]
[ENTRY_BUS_WIDTH=16
DCD0x0f10ee11
DCD0x0080e380
DCD0x0f10ee01
]
[ENTRY_BUS_WIDTH=8
DCD0x100f11ee
DCD0x800080e3
DCD0x100f01ee
]
DCD0xffffffff ;swinv0xffffffissimilarwithNOPandrunwellinbothendianmode.
DCD0xffffffff
DCD0xffffffff
DCD0xffffffff
DCD0xffffffff
bResetHandler
;进入掉电模式功能
;1.SDRAM必须在自刷新模式.
;2.所有中断必须屏蔽forSDRAM/DRAMself-refresh.
;3.LCD关闭forSDRAM/DRAMself-refresh.
;4.TheI-cache可能需要开启.
;5.Thelocationofthefollowingcodemayhavenottobechanged.
;voidEnterPWDN(intCLKCON);
EnterPWDN
movr2,r0 ;r2=rCLKCON
tstr0,#0x8 ;POWER_OFFmode?
bneENTER_POWER_OFF
ENTER_STOP
ldrr0,=REFRESH
ldrr3,[r0] ;r3=rREFRESH
movr1,r3
orrr1,r1,#BIT_SELFREFRESH
strr1,[r0] ;EnableSDRAMself-refresh
movr1,#16 ;waituntilself-refreshisissued.maynotbeneeded.
0 subsr1,r1,#1
bne%B0
ldrr0,=CLKCON ;enterSTOPmode.
strr2,[r0]
movr1,#32
0 subsr1,r1,#1 ;1)waituntiltheSTOPmodeisineffect.
bne%B0 ;2)OrwaithereuntiltheCPU&Peripheralswillbeturned-off
; EnteringPOWER_OFFmode,onlytheresetbywake-upisavailable.
ldrr0,=REFRESH ;exitfromSDRAMselfrefreshmode.
strr3,[r0]
MOV_PC_LR
ENTER_POWER_OFF
;NOTE.
;1)rGSTATUS3shouldhavethereturnaddressafterwake-upfromPOWER_OFFmode.
ldrr0,=REFRESH
ldrr1,[r0] ;r1=rREFRESH
orrr1,r1,#BIT_SELFREFRESH
strr1,[r0] ;EnableSDRAMself-refresh
movr1,#16 ;Waituntilself-refreshisissued,whichmaynotbeneeded.
0 subsr1,r1,#1
bne%B0
ldr r1,=MISCCR
ldrr0,[r1]
orrr0,r0,#(7<<17) ;MakesurethatSCLK0:
SCLK->0,SCLK1:
SCLK->0,SCKE="L"duringboot-up
strr0,[r1]
ldrr0,=CLKCON
strr2,[r0]
b. ;CPUwilldiehere.
WAKEUP_POWER_OFF
;ReleaseSCLKnafterwake-upfromthePOWER_OFFmode.
ldrr1,=MISCCR
ldrr0,[r1]
bicr0,r0,#(7<<17) ;SCLK0:
0->SCLK,SCLK1:
0->SCLK,SCKE:
L->H
strr0,[r1]
;Setmemorycontrolregisters
ldrr0,=SMRDATA
ldrr1,=BWSCON ;BWSCONAddress
addr2,r0,#52 ;EndaddressofSMRDATA
0
ldrr3,[r0],#4
strr3,[r1],#4
cmpr2,r0
bne%B0
movr1,#256
0 subsr1,r1,#1 ;1)waituntiltheSelfRefreshisreleased.
bne%B0
ldrr1,=GSTATUS3 ;GSTATUS3hasthestartaddressjustafterPOWER_OFFwake-up
ldrr0,[r1]
movpc,r0
LTORG
;下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对应的中断处理;函数(对于向量中断)
HandlerFIQ HANDLERHandleFIQ
HandlerIRQ HANDLERHandleIRQ
HandlerUndef HANDLERHandleUndef
HandlerSWI HANDLERHandleSWI
HandlerDabort HANDLERHandleDabort
HandlerPabort HANDLERHandlePabort
;下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1置1表示目前此中断等待响应(每次只能有一位置1),从最高优先级中断位开始判断,检测到等待服务
;中断就将pc置为中断服务函数首地址
IsrIRQ
sub sp,sp,#4 ;预留返回指针的存储位置
stmfd sp!
{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9];载入I_ISR
ldr r8,=HandleEINT0
add r8,r8,r9,lsl#2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!
{r8-r9,pc}
;=======
;ENTRY
;=======
;扳子上电和复位后程序开始从位于0x0执行bResetHandler
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于头文件 2410Inits的详细注释分析 关于 文件 2410 Inits 详细 注释 分析