原创 ARM-用汇编语言编写启动程序学习笔记1--映射与重映射

2009-9-22 16:45 3649 11 11 分类: MCU/ 嵌入式

地址映射:把芯片里和芯片外的FLASHRAMBootBlock和外设进行统一编址。一般来说,芯片厂商都把这些地址分好了,搞清楚在哪里,使用就行了。外扩FLASHRAM的时候,需要进行地址映射。使用ADS编译器的时候,有一个scf文件,用来描述地址映射的。而比较新的Keil MDK 采用的可视化的方法(方便啊,Keil公司真强大)。


ARM7TDMI的地址映射位置:ARM7TDMI采用32位寻址,<?XML:NAMESPACE PREFIX = ST1 />4G的地址空间。一般而言。在0x0000000FLASH0x40000000RAM0x80000000以上是外部存储器、0xE0000000向上是APB(低速外设,如GPIOUart等)、0xFFFFFFFF向下是APB(高速设备,如USB,向量中断控制器)。一个比较怪异的地址是BootBlock的,单独来说。


BootBlockARM芯片厂商提供的芯片引导程序,判断用户代码是否有效、芯片是否加密,芯片是否工作在ISP状态、芯片是否工作在IAP状态。这段代码在芯片启动的时候用,生产芯片的时候,厂商已经固化进去了,用户不用管。比较难搞的事情是这段芯片的地址,这段代码一般是放在FLASH中的,放在地址0x00000000似乎最合理,但是这个地址,中断向量表已经用了,于是干脆放到FLASH的尾部了。另一个问题出来了,不同的芯片,内部的FLASH不一样大,这段代码的地址该怎么定哪?办法就是重映射。


BootBlock的重映射:BootBlock的实际位置在片内FLASH的尾部,但是编地址的时候,重新映射到地址0x80000000向下的地方。这样以来,编程的时候采用的地址是固定在接近0x80000000地方的,而实际的位置是在FLASH的尾部。地址重映射:通过芯片的存储器管理部件,把不同的程序可见地址映射到同一个物理位置。还有一种更加实用的地址重映射叫异常向量表重映射。


异常向量表重映射:异常向量表在0x00000000的位置,BootBlock启动完之后,就到这里开始程序的运行,分别对应ARM7种异常状态进行处理。


 


 


为存储器分配地址的过程称为存储器映射,那么什么叫存储器重映射呢?为了增加系统的灵活性,系统中有部分地址可以同时出现在不同的地址上,这就叫做存储器重映射。重映射主要包括引导块“Boot  Block”重映射和异常向量表的重映射。


 1.引导块“Boot  Block”及其重映射


       Boot  Block是芯片设计厂商在LPC2000系列ARM内部固化的一段代码,用户无法对其进行修改或者删除。这段代码在复位时被首先运行,主要用来判断运行哪个存储器上面的程序,检查用户代码是否有效,判断芯片是否被加密,系统的在应用编程(IAP)以及在系统编程功能(ISP)等。


       Boot Block存在于内部Flash,LPC2200系列大小为8kb,它占用了用户的Flash空间,但也有其他的LPC系列不占用FLash空间的,而部分没有内部Flash空间的ARM处理器仍然存在Boot  Block。


       重映射的原因:


       Boot  Block中有些程序可被用户调用,如擦写片内Flash的IAP代码。为了增加用户代码的可移植性,所以最好把Boot  Block的代码固定的某个地址上。但由于各芯片的片内Flash大小不尽相同,如果把Boot  Block的地址安排在内部Flash结束的位置上,那就无法固定Boot  Block的地址。


       为了解决上面的问题,于是芯片厂家将Boot  Block的地址重映射到片内存储器空间的最高端,即接近2Gb的地方,这样无论片内存储器的大小如何,都不会影响Boot  Block的地址。因此当Boot  Block中包含可被用户调用的IAP操作的代码时,不用修改IAP的操作地址就可以在不同的LPC系列的ARM上运行了。


2.异常向量表及其重映射


      ARM内核在发生异常后,会使程序跳转到位于0x0000~0x001C的异常向量表处,再经过向量跳转到异常服务程序。但ARM单条指令的寻址范围有限,无法用一条指令实现4G范围的跳转,所以应在其后面的0x0020~0x003F地址上放置跳转目标,这样就可以实现4G范围内的任意跳转,因此一个异常向量表实际上占用了16个字的存储单元。以下为一张中断向量表:
                                    LDR     PC, ResetAddr
                                    LDR     PC, UndefinedAddr 
                                    LDR     PC, SWI_Addr
                                    LDR     PC, PrefetchAddr
                                    LDR     PC, DataAbortAddr
                                    DCD     0xb9205f80
                                    LDR     PC, [PC, #-0xff0]
                                    LDR     PC, FIQ_Addr


                    ResetAddr            DCD     ResetInit
                    UndefinedAddr      DCD     Undefined
                    SWI_Addr            DCD     SoftwareInterrupt
                    PrefetchAddr        DCD     PrefetchAbort
                    DataAbortAddr     DCD     DataAbort
                    Nouse                  DCD     0
                    IRQ_Addr             DCD     0
                    FIQ_Addr             DCD     FIQ_Handler


      重映射的原因:


      由于ARM处理器的存储器结构比较复杂,可能同时存在片内存储器和片外存储器等,他们在存储器映射上的起始地址都不一样,因此ARM内核要访问的中断向量表可能不在0x0000~0x003F地址上,因此采用了存储器重映射来实现将存在与不同地方的中断向量表都映射到0x0000~0x003F地址上。


      注意:Boot  Block 也存在中断向量表,而且复位后这段代码首先映射到 0x0000~0x003F地址上,也就是说复位后首先运行的是Boot Block程序。各个存储区域的中断向量表也不尽相同。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条