ARM启动代码从系统上电开始接管CPU,依次需要负责初始化 CPU在各种模式下的堆栈空间、设定CPU的内存映射、对系统的各种控制寄存器做初始化、对CPU的外部存储器进行初始化、设定各外围设备的基地址、创建正确的中断向量表、为C代码执行创建ZI(零创建)区,然后进入到C代码。 在C代码中继续对时钟、RS232端口进行初始化,然后打开系统中断允许位。最后进入到应用代码中执行,执行期间响应各种不同的中断信号并调用预先设置好的中断服务程序处理这些中断。
初始化过程中模式变化过程为:管理模式-----各种特权模式(堆栈初始化阶段)----用户模式。若在系统初始化之前就触发了有效的中断,会导致系统的死机。
mini2440启动过程
1. 分配中断向量表
ARM要求中断向量表必须放置在从0X0开始的连续32字节的空间内。
关键字ENTRY确保编译器保留这段代码,避免其作为冗余代码优化。同时被链接成整个程序的入口地址。当ARM启动时,PC指针会自动寻找该关键字并从该关键字处开始执行。
2. 初始化存储器系统
3. 初始化各工作模式下的堆栈
ARM有7中运行状态,每一种状态的堆栈指针寄存器都是独立的。因此对于程序中需要用到的每一种模式都要给SP定义一个堆栈地址。在ARM处理器中,只有MRS(Move to Register from State register)指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
4. 初始化有特殊要求的硬件模块
5. 初始化用户程序的执行环境
6. 切换处理器的工作模式
7. 调用主应用程序