ARM处理器启动代码的分析与设计

ARM处理器启动代码的分析与设计ARM体系结构

目前,ARM系列的通用32位RISC微处理器有ARM7、ARM9、ARM9E、ARM 10等多个产品,这些处理器可以工作于7种模式下。除User模式以外的其它模式都叫做特权模式,除User和System以外的其它5种模式叫做异常模式。大部分应用程序都在User模式下运行,当处理器处于User模式下时,执行的程序无法访问一些被保护的系统资源,以利于操作系统控制系统资源的使用,也不能改变模式,否则就会导致一次异常。对于System模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和User模式下基本相同,主要是用于有访问系统资源请求而又避免使用额外的寄存器的操作系统任务。在特权模式下,它们可以完全访问系统资源,可以自由地改变模式。在处理特定的异常时,系统进入对应的异常模式下。这5种异常模式都有各自额外的寄存器,用于避免在发生异常的时候与用户模式下的程序发生冲突。

&n

bsp; 在任意一种处理器模式中,都使用同一个寄存器来标识当前处理器的工作模式,这个寄存器叫做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字节)的起始地址。按这种方式设置其它模式下的堆栈。

相关主题
相关文档
最新文档