LPC2104的Boot与Remap详解(一)---(原创)
完整的Remap过程实际上通常始于系统的Bootload过程。具体执行动作为:Bootload将非易失性存储器中的异常向量复制到高速易失性存储器块的一端,然后执行Remap命令,将位于高速易失性存储器中的异常向量块映射到异常向量表地址空间上。此后,系统若产生异常,CPU将从已映射到异常微量表地址空间的高速非易失性存储器中读取异常向量。具体到典型的ARM7嵌入式系统中,就是由Bootload程序将片内或片外的Flash/ROM中的异常向量复制到片内的SRAM中指定的存在器单元中,然后再执行Remap命令。由于片内的SRAM数据位宽通常与CPU数据位宽相等,因而CPU可以无等待地全速跳入异常处理程序,获得最佳的实时异常响应。
LPC2000的Boot和Remap解析
从上面的技术描述中可知,典型的Boot、Memory Map和Remap的时间顺序应该是:Memory Map-〉Boot-〉Remap。但是,LPC2000处理器中这三个动作的顺序却有一点不同,依次为Memory Map-〉Remap-〉Boot-〉Remap,最后一个Remap过程是用户可选的,可执行也可不执行。每当系统复位以后,LPC2000处理器就顺次执行上述四个过程,下面分析这几个阶段。为简化起见,以总线不开放的LPC2104处理器为例。
LPC2106的片上存储器分类
LPC2104片内的存储器类型只有两种:Flash块和SRAM块。其中,部分Flash存储器块在芯片出厂前由Philips写入了Bootload程序和64字节的异常向量表。为方便讨论,我们称这部分Flash块为Bootload子块,其大小为8KB。如前所述,在处理器未上电之前或复位时,Flash块和SRAM块仅仅是两个没有地址编码的物理存储器,与地址编码尚未建立起实际的映射关系。
Memory Map
LPC2104处理器(上电)复位以后,Flash块和SRAM块的地址映射结果为:SRAM占据0x40000000—0x40003FFF范围的地址编码空间;Flash占据0x00000000—0x0001FFFF范围的地址编码空间。该映射结果是个中间态,只存在极短的时间,应用系统开发人员无法看到这个中间态。处理器内核外围模块的地址映射结果为0xE0000000—0xFFFFFFFF。
javascript:window.open(this.src);" style="cursor:pointer;"/>
Remap
Memory Map完成以后,紧接着LPC2104会作一次Remap,这次Remap操作的对象是Bootload子块,由处理的内部硬件逻辑执行完成,不受开发人员的控制。经过Remap后,Bootload子块被整体Remap到了0x7FFFE000—0x7FFFFFFF的片内高地址内存空间;同时,原Memory Map后占用0x00000000—0x0000003F地址空间的那部分64 字节大小的Flash子块被暂时注销映射关系,由Bootload子块中的异常向量部分取而代之。
至此,Flash块对内存地址空间的占用情况如下:
1、除去因Remap被暂时注销了映射关系的那小部分64字节的Flash子块外,Flash块作为一个整体占用的地址编码空间为0x00000040—0x0001FFFF;
2、同时,Bootload子块又占用了0x7FFFE000—0x7FFFFFF的地址编码空间,Bootload子块中的异常向量表部分占用了0x00000000—0x0000003F。
因此,Bootload子块中的异常向量表部分实际上是占用了重复占用了三段地址编码空间:0x00000000—0x0000003F、0x0001E000—0x0001E03F以及0x7FFFE000—0x7FFFE03F。
图2中,存储器的映射顺序为:Memory Map-〉Reset Remap-〉Bootload Remap。
SRAM块和内核外围模块的映射关系在Remap之后保持不变,可参见图1。
* - 本贴最后修改时间:2005-3-10 17:31:19 修改者:andrewpei
* - 修改原因:Append
javascript:window.open(this.src);" style="cursor:pointer;"/>
Boot
LPC2104有效的异常向量表地址编码空间是0x00000000—0x0000003F(严格来说应该是0x00000000—0x0000001F)。处理器复位后的Boot动作就是从0x00000000处起始字中取出跳转指令,开始程序的执行。由于处理器复位后,映射到0x00000000—0x0000003F地址空间的异常向量表源于Bootload子块,因此CPU实际上开始执行的是Philips在芯片出厂前写入的Bootload程序。
进入Bootload后,程序首先检查看门狗溢出标志是否置位。
若看门狗溢出标志置位,则表明当前的系统复位是内部软复位,CPU下一步将对Flash块中的异常向量表进行加和校验。如果加和检验结果为零,Bootload程序将撤销Bootload子块中异常向量表部分在0x00000000—0x00000003F地址空间上的映射,恢复Flash块的异常向量表在这64字节地址空间上的映射关系(如图3),然后跳转到异常向量表地址0x00000000处转入用户程序的执行。如果加和校验结果不为零,Bootload程序将进行UART0接口的波特率自动侦测,随时响应ISP宿主机的编程请求,执行处理器芯片的ISP编程工作。
javascript:window.open(this.src);" style="cursor:pointer;"/>
若Bootload没有发现看门狗溢出标志置位,则表明当前的系统复位是外部硬复位,CPU将采样P0.14引脚的外部逻辑电平输入。如果为0,Bootload执行UART0的自动波特率侦测,随时响应ISP宿主机的编程请求;如果为1,Bootload的后续动作将与前面检测到看门狗溢出标志置位的程序执行完全相同。
javascript:window.open(this.src);" style="cursor:pointer;"/>
Remap(可选