启动代码解读
- 格式:doc
- 大小:47.00 KB
- 文档页数:2
系统在运行过程中,一旦有内部异常或外部中断事件产生,处理器内核通常会响应这些事件。
LPC2138的ARM内核ARM7TDMI支持7种异常类型,分别为复位异常、指令未定义异常、软件中断异常、指令预取中止异常、数据中止异常、快速中断异常和普通中断异常。
其中复位异常和软件中断异常的处理被安排在处理器的管理模式(svc mode)下进行。
指令预取中止异常和数据中止异常的处理被安排在中止模式(abt mode)下进行。
指令未定义异常的处理被安排在未定义模式(und mode)下进行。
快速中断异常和普通中断异常的处理分别安排在快中断(fiq mode)和中断模式(irq mode)下进行。
LPC2138所有外设中断的处理被安排在快中断模式或中断模式下进行,具体一个外设中断的处理在哪个模式下进行,需要程序开发人员通过配置LPC2138的VIC控制器来实现。
在系统启动阶段,异常中断矢量表必须存在。
通常ARM处理器要求矢量表安排在系统地址空间的0x00处。
LPC2138的异常中断矢量表位于从0地址开始的一片连续的内存区域内。
此表由8个表项组成,其中有7项对应中7种异常类型。
每个表项占用4字节空间,存放32位的跳转指令。
内部异常或外部中断事件发生时,ARM处理器内核响应该事件,硬件自动保存当前模式下的CPSR寄存器内容至异常事件处理模式下的SPSR寄存器,修改CPSR 寄存器的模式位,将系统操作模式强行切换至异常事件处理模式,并禁止普通中断或快速中断,强制定位PC至矢量表中对应异常的表项处,通过该表项处的跳转指令,执行异常中断事件的处理服务函数。
ARM异常向量位置
地址异常
0x0000 0000 复位
0x0000 0004 未定义指令
0x0000 0008 软件中断
0x0000 000C 预取指中止(从存储器取指出错)
0x0000 0010 数据中止(数据访问存储器出错)
0x0000 0014 保留*
0x0000 0018 IRQ
0x0000 001C FIQ
系统上电复位时刻将产生复位异常事件,处理器内核对此事件是无条件响应的。
响应该事件,处理器内核进入管理模式下,通过矢量表中的复位异常表项处的跳转指令,程序流程定位到复位异常事件处理服务函数处,执行复位异常事件处理。
复位异常事件的处理首先从配置几个硬件模块开始。
包括锁相环(PLL)、VBP分频器、外部存储控制器、存储器加速控制和内存映射控制模块。
接着切换进入ARM处理器各操作模式,配置该模式下栈指针(对R13寄存器赋值)。
处理器内核依次被切换进入未定义指令模式、中止模式、快中断模式、中断模式、管理模式和用户模式。
最终处理器内核停留在用户模式下。
此后复位异常事件处理函数调用C标准库的_main()函数,执行
__main:
0x0000019C EB000000 BL __scatterload(0x000001A4)
0x000001A0 EB00003B BL __rt_entry(0x00000294)
__scatterload实现(1)把RO/RW输出段从加载地址复制到运行地址。
(2)清零初始化ZI 运行域。
__rt_entry实现(1)初始化库函数。
(2)建立堆栈。
(至此已完成建立C库运行必须的环境)(3)转入用户程序入口函数main()。
在启动汇编源文件中,存在4个节。
节在ARM汇编中使用AREA伪操作符标示。
节是
不可分割的代码块或数据块。
工程中其他的C源文件在编译器处理后,也形成若干节。
所有这些节被链接器由链接器来处理。
通常链接器将属性相同的节合并,形成不同属性的输出段。
最终这些输出段依照分散加载描述文件的安排,定位到系统地址空间相应的地址处。
分散加载描述文件描述了两种视图(1)加载视图(2)执行视图。
加载视图描述了程序代码和数据在加载时的地址安排。
执行视图描述了程序代码和数据在执行时的地址安排。
在启动汇编源文件中,有一段进行存储器重映射的代码。
这里解释一下存储器映射和存储器重映射的概念。
(1)存储器映射
对于任意类型的存储器,必须首先为它分配一个地址空间才能对其进行访问,这样就在地址空间和存储器之间建立了某种对应关系,称为存储器映射。
不管是微处理器内置的片内存储器,还是扩展的外部存储器,在电路板制作完成之后,它的存储器映射也就自然的固定下来,这个特定的地址空间也称为它的固有地址空间。
例如对于LPC2138来说,地址空间0x4000 0000-0x40008000映射到片内SRAM,即片内SRAM的固有地址空间为
0x40000000-0x40008000。
(2) 存储器重映射
对于ARM处理器来说,为了获得多种引导选项或者提高性能,某个特定的地址空间可以映射到不同的存储器,或者反过来一个存储器可以对应多个地址空间,这种现象称之为存储器重映射。
总之,从地址空间的角度看,这个特殊的重映射区域对应的存储器映射具有多重性和临时性,但是在任意时刻它的存储器映射具有唯一性。
除了这个特殊的重映射区域,其它地址空间和存储器之间是一一对应的。
反之从存储器的角度看,无论何时总是可以通过它的固有地址空间访问它,但是只有当满足某些条件时才能从重映射区域访问它。
最后,启动代码中涉及到的指令,伪指令及伪操作符,请大家搞清楚。
伪操作符:EQU AREA PROC ENDP END SPACE IMPORT EXPORT
伪指令:LDR
指令:LDR STR MRS MSR BL。