微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2410启动代码详解(2)

S3C2410启动代码详解(2)

时间:11-11 来源:互联网 点击:
;========================================================================================

//在这里用IMPORT伪指令(和c语言的extren一样)引入|Image$$RO$$Base|,|Image$$RO$$Limit|...

//这些变量是通过ADS的工程设置里面设定的RO Base和RW Base设定的,最终由编译脚本和连接程序导入程序.

//那为什么要引入这玩意呢,最简单的用处是可以根据它们拷贝自已,从把RW和ZI变量从加载域中复制到运行域中

//一个arm由RO,RW,ZI三个断组成其中RO为代码段,RW是已经初始化的全局变量,ZI是未初始化的全局变量(对于GNU工具对应的概念是TEXT ,DATA,BSS)。

;========================================================================================
IMPORT |Image$$RO$$Base| ; ROM code(也就是代码)的开始地址
IMPORT |Image$$RO$$Limit| ;ROM code的结束地址 (也就是RW在加载域中的起始地址)
IMPORT |Image$$RW$$Base| ;在运行域中要初始化的RAM的开始地址
IMPORT |Image$$ZI$$Base| ; area(需要清零的RAM区域)的开始地址
IMPORT |Image$$ZI$$Limit| ; area的结束地址

;这里引入一些在其它文件中实现在函数,包括为我们所熟知的main函数
IMPORT Main ; The main entryof mon program

;从这里开始就是正真的代码入口了!
AREA Init,CODE,READONLY;这表明下面的是一个名为Init的代码段
ENTRY ;定义程序的入口(调试用)其中关键字ENTRY是指定编译器保留这段代码,因为

编译器可能会认为这是一段亢余代码而加以优化。链接的时候要确保这段代码

被链接在0地址处,并且作为整个程序的入口
;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 not be used here because the linker generates error.
ASSERT :DEF:ENDIAN_CHANGE
[ ENDIAN_CHANGE ;下面是大小端的一个判断,在Option.inc里已经设为FALSE
ASSERT :DEF:ENTRY_BUS_WIDTH
[ ENTRY_BUS_WIDTH=32 //‘[’=IF
b ChangeBigEndian ;DCD 0xea000007
]

[ ENTRY_BUS_WIDTH=16
andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00
]

[ ENTRY_BUS_WIDTH=8
streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
]
|
b ResetHandler ;因为设成FALSE,所以系统复位后就来到这了,转跳到复位程序入口

]

//=====================================================================================

;ARM要求中断向量表必须放置在仿地址开始,连续8X4字节的空间内.每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理

//=====================================================================================
b HandlerUndef ;转跳到Undefined mode程序入口
b HandlerSWI ;转跳到SWI 中断程序入口
b HandlerPabort ;转跳到PAbort(指令异常)程序入口
b HandlerDabort ;转跳到DAbort(数据异常)程序入口
b . ;保留
b HandlerIRQ ;转跳到IRQ 中断程序入口
b HandlerFIQ ;转跳到FIQ 中断程序入口

;@0x20不知道是什么意思,地址?
b EnterPWDN ; Must be @0x20.

;==================================================================================
;下面是改变大小端的程序,这里采用直接定义机器码的方式,至说为什么这么做就得问三星了
;反正我们程序里这段代码也不会去执行,不用去管它
;==================================================================================
ChangeBigEndian //通过设置CP15中的C1的位7来设置存储格式为大端模式。
;@0x24
[ ENTRY_BUS_WIDTH=32
DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0
DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian
DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0
]
[ ENTRY_BUS_WIDTH=16
DCD 0x0f10ee11
DCD 0x0080e380
DCD 0x0f10ee01
]
[ ENTRY_BUS_WIDTH=8
DCD 0x100f11ee
DCD 0x800080e3
DCD 0x100f01ee
]
DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.
DCD 0xffffffff
DCD 0xffffffff
DCD 0xffffffff
DCD 0xffffffff
b ResetHandler

;Function for entering power down mode,下面这段程序为进入掉电模式及从掉电

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top