b ResetHandler ;Reset Handler
ldr pc,=0x0c000004 ;Undefined Instruction Handler
ldr pc,=0x0c000008 ;Software Interrupt Handler
ldr pc,=0x0c00000c ;Prefetch Abort Handler
ldr pc,=0x0c000010 ;Data Abort Handler
b . ;Reserved
ldr pc,=0x0c000018 ;IRQ Handler&n
bsp;
ldr pc,=0x0c00001c ;FIQ Handler
如果在
Bootloader运行过程中不必响应中断,那么上面的配置已能满足要求。如果某些Bootloader功能要求使用中断(例如用Timer Interrupt实现精确定时),那么Bootloader必须在同样的位置建立自己的二级异常向量表,以便同
uClinux保持一致。这张表应存放在Flash中,并由Bootloader复制到RAM地址0x0C000000处。
1.3 初始化各种处理器模式
ARM7TDMI内核支持7种处理器模式:User,FIQ,IRQ,Supervisor,Abort,System和Undefined。Bootloader需要依次切换到每种模式,初始化该模式的程序状态寄存器(SPSR)和堆栈指针(SP)。S3C44B0X在上电或复位后处于Supervisor模式;本步骤中应该在最后切换回Supervisor模式,即Bootloader后续部份仍将运行在Supervisor模式下。
1.4 section重定位 对于ADS或RVDS等开发工具,一个ARM程序通常由RO、RW和ZI三个section组成,其中RO是代码和常量,RW是已初始化的全局变量,ZI是未初始化的全局变量(在GNU中对应的概念是TEXT、DATA和BSS)。RO代码既可以在Flash中运行,也可以在RAM中运行。考虑到Bootloader可能需要烧写Flash,而烧写时处理器无法从Flash中读取指令,因此应将RO和RW复制到RAM中,并将ZI清零。RO复制完毕之后,程序就可以跳转到RAM中运行。若不考虑烧写Flash,则Bootloader不必复制RO,程序始终在Flash中运行。
1.5 填写中断向量表
中断向量表一般位于RAM地址的最高端,存放着各个ISR的入口地址。由于IRQ Exception为全部中断所共用,因此必须在IRQ Exception服务例程中根据中断状态寄存器来判断中断源并调用相应的ISR。各个ISR的入口地址需要在这一步里填写。
另外,S3C44B0X的中断控制器支持Vectored和Non-Vectored两种中断处理模式,其中前者是Samsung自行开发的模式,并不被大多数ARM处理器所支持。考虑到代码的可移植性,上面只讨论了Non-Vectored Mode。