ARM体系结构
现在,ARM系列的通用32位RISC微处理器有ARM7、ARM9、ARM9E、ARM10等多个产品,这些处理器能够作业于7种形式下。除User形式以外的其它形式都叫做特权形式,除User和System以外的其它5种形式叫做反常形式。大部分使用程序都在User形式下运转,当处理器处于User形式下时,履行的程序无法拜访一些被维护的体系资源,以利于操作体系操控体系资源的运用,也不能改动形式,不然就会导致一次反常。关于System形式,任何反常都不会导致进入这一形式,并且它运用的寄存器和User形式下根本相同,首要是用于有拜访体系资源恳求而又防止运用额定的寄存器的操作体系使命。在特权形式下,它们能够彻底拜访体系资源,能够自由地改动形式。在处理特定的反常时,体系进入对应的反常形式下。这5种反常形式都有各自额定的寄存器,用于防止在产生反常的时分与用户形式下的程序产生冲突。
在恣意一种处理器形式中,都运用同一个寄存器来标识当时处理器的作业形式,这个寄存器叫做CPSR(当时程序状况寄存器),它的0~4位用来表明CPU形式,并且在每一种处理器反常形式下,都有一个对应的SPSR(缓存程序状况寄存器),用来保存进入反常形式前的CPSR的值。SPSR的效果便是当CPU从反常形式退出时,经过一条简略的汇编指令就能够康复进入反常形式前的CPSR,该值保存在当时反常形式的SPSR中。
发动代码的规划
发动代码类似于电脑中的BIOS,它从体系上电开端接收CPU,顺次需求担任初始化 CPU在各种形式下的仓库空间、设定CPU的内存映射、对体系的各种操控寄存器做初始化、对CPU的外部存储器进行初始化、设定各外围设备的基地址、创立正确的中止向量表、为C代码履行创立ZI(零创立)区,然后进入到C代码。 在C代码中持续对时钟、RS232端口进行初始化,然后翻开体系中止答应位。最终进入到使用代码中履行,履行期间呼应各种不同的中止信号并调用预先设置好的中止服务程序处理这些中止。整个进程的流程图如图1所示。

图1 发动代码流程图
仓库初始化
仓库的初始化要处理的工作是为处理器的7个处理器形式分配仓库空间。以下以FIQ形式下的仓库设置为例阐明:
ORR r1, r0, #LOCKOUT | FIQ_MODE;把形式放在r1中,LOCKOUT用来屏蔽中止位;
MSR cpsr, r1 ;改动CPU的CPSR寄存器,进入到指定的FIQ形式;
MSR spsr, r2 ;保存前一形式;
LDR sp, =FIQ_STACK ;把FIQ形式下的仓库开端值赋给当时的SP,FIQ_STACK是分配给FIQ形式仓库空间(比如说1K字节)的开端地址。按这种方法设置其它形式下的仓库。
DRAM的初始化依据体系装备信息来决议,因为体系纷歧定会用到DRAM,可是必定要做SDRAM的初始化。首要的处理内容是ROM和RAM基址的设定、数据总线的宽度、SDRAM的改写时刻等等,这些能够参照S3C4510B芯片的用户手册。特别寄存器的设置首要是针对I/O口,比方说设定几个I/O位用做体系状况指示灯LED。寄存器的设定首要依据硬件的装备状况而定,值得注意的是因为这段发动代码是烧录到ROM中的,而中止向量有必要坐落零地址,所以在存储单元没有从头映射之前ROM基址的设定应该为零地址。
复制(image)首要是为了进步运转速度,编译生成的映像文件代码从ROM内复制到RAM中去,而程序的履行也就在RAM中。当然,发动代码对运转速度的要求不是很严厉,所以这个复制动作能够不用做,让代码存放在ROM中,代码的履行也在ROM中,而运转中所需求的数据在RAM中。
内存的初始化是为C代码的运转拓荒内存区,代码编译后会分为三个区:只读区、可读可写区,
零初始化区。内存的初始化处理的内容是:当只读区截止地址等于可读可写区基址时,把零初始化区各字节清零;当只读区截止地址不等于可读可写区基址时,假如可读可写区基址小于零初始化基址,就从只读区截止地址处开端把数据复制到可读可写区基址处,直到抵达零初始化基址,然后把零初始化区各字节清零,不然也只用把零初始化区各字节清零。
中止向量表是用于处理反常状况的,当产生反常时,首先要保存当时程序的回来地址和CPSR寄存器的值,然后进入到相应的反常向量地址,一般来说在反常向量地址是一个跳转指令,使程序进入相应的反常处理进程。因为中止向量表要坐落体系的零地址,当把发动代码烧录到EEPROM中运转时就需求把ROM的地址界说到零地址,所以程序的入口处如下:
