地址重映射详解:
http://blog.sina.com.cn/s/blog_4aad56b001000985.html
实际上对于学习S3C44B0X的人来说,对于这个芯片的启动过程还有很多不解之处,我想谈谈我对启动过程的理解,实际上这将是书写Bootloader重要的一部分。
44B0启动时一定是从0地址开始执行指令,系统中0地址是片选引脚GCS0对应的Bank0空间。如果系统使用Flash作为程序储存设备且具有Bootloader这样的引导代码的话,则0地址一定是Flash区域,即从Flash中的第一条指令执行!但是很多44B0的系统中并不把Bootloader直接放在0址开始的Flash空间中,而是放置在以0x1f0000为起始地址的Flash空间中。这是为什么呢?显然将Bootloader放在0地址为起始地址的空间内是可以在系统加电时被执行来引导系统的。但是,每次烧写新的程序时,都会擦去0地址开始内容,会破坏Bootloader,从而使系统不能启动。所以,把Bootloader放在别的地方,而在0地址开始的位置放入中断向量表,而中断向量表的第一条指令一定是跳转到Bootloader的起始处。之所以把0地址填入中断向量表,这和芯片的体系结构有关,44B0没有重映射(Remap)的功能,在触发中断之后,还是要到Flash中的开头地址空间中执行指令,所以所谓的这段中断向量表完成的是跳转的功能,具体说来不应叫中断向量表,而应该叫做中断跳转表。如果不在Flash的起始地址处烧入中断跳转表的话就无法正确相应中断,从而所有需要中断的程序都不能正常运行。切忌这个中断跳转表一定必不可少!
如下是中断跳转表的源程序,将其编译烧入0地址之中:
AREA boot, CODE, READONLY
VECTORS EQU 0x0c000000
ENTRY
mov pc, #VECTORS
ldr pc, =VECTORS+4
ldr pc, =VECTORS+8
ldr pc, =VECTORS+0x0c
ldr pc, =VECTORS+0x10
ldr pc, =VECTORS+0x14
ldr pc, =VECTORS+0x18
ldr pc, =VECTORS+0x1c
END
还有很多人讨论,书写一个Bootloader最为基本的代码是什么?一般来说,像诸如跑马灯这样的程序可以测出最少代码,你可以想象一个系统只用到Flash,而不用RAM,中断,Cache等东西,这样在Bootloader中仅需要对看门狗、时钟频率、片内锁相环设置,而不用书写中断例程、中断向量表、RAM配置、堆栈指针初始化、DMA配置、电源管理等等,一个简约的Bootloader如下,足以启动系统转入main中执行。
;Watchdog timer
WTCON EQU 0x01d30000
;Clock Controller
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
M_DIV EQU 0x48 ;Fin=10MHz Fout=40MHz
P_DIV EQU 0x3
S_DIV EQU 0x2
IMPORT Main ; The main entry of mon program
AREA Init,CODE,READONLY
ENTRY
b ResetHandler ;for debug
ResetHandler
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,=LOCKTIME
ldr r1,=0xfff
str r1,[r0]
ldr r0,=PLLCON ;temporary setting of PLL
ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;Fin=10MHz,Fout=40MHz
str r1,[r0]
ldr r0,=CLKCON
ldr r1,=0x7ff8 ;All unit block CLK enable
str r1,[r0]
BL Main
B .
END