您的位置 首页 知识

ARM储存器映射问题

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设等进行共同编址。即用地址来表明方针。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部RAM或FLASH的情况下可进行自界说。

ARM7TDMI的存储器映射能够有0X00000000~0XFFFFFFFF的空间,即4G的映射空间,但一切器材加起来肯定是填不满的。一般来说, 0X00000000顺次开端寄存FLASH——0X00000000,SRAM——0X40000000,外部存储器 0X80000000,VPB(低速外设地址,如GPIO,UART)——0XE0000000,AHB(高速外设:向量间断控制器,外部存储器控制器) ——从0XFFFFFFFF回头。他们都是从固定方位开端编址的,而占用空间又不大,如AHB只占2MB,所以从中心有很大部分是空白区域,用户若运用这些空白区域,或许界说野指针,就或许呈现取指令间断或许取数据间断。

因为体系在上电复位时要从0X00000000 开端运转,而第一要运转的便是厂家固化在片子里的Bootloader,这是判别运转哪个存储器上的程序,查看用户代码是否有用,判别芯片是否加密,芯片是否IAP(在使用编程),芯片是否ISP(在体系编程),所以这个Bootloader要首要履行。而芯片中的Bootloader不能放在FLASH的头部,因为那要寄存用户的反常向量表的,以便在运转、间断时跳到这来找进口,所以Bootloader只能放在FLSAH尾部才干好找到,呵呵。而ARM7的各芯片的FLASH巨细又不共同,厂家为了Bootlader在芯片中的方位固定,就在编址的2G靠前编址的方位虚拟区分一个区域作为Bootloader区域,这便是重映射,这样拜访<2G即<0X80000000的方位时,就能够拜访到在FLASH尾部的Bootloader区域了。

Bootloader运转完便是要运转用户自己写的发动代码了,而发动代码中最重要的便是反常向量表,这个表是放在FLASH的头部首要履行的,而反常向量表中要处理多方面的工作,包括复位、未界说指令、软间断、预取指间断、数据间断、IRQ(间断) ,FIQ (快速间断),而这个反常向量表是总表,还包括许多涣散的反常向量表,比方在外部存储器,SRAM中固化的,不或许都由用户直接界说,所以仍是需求重映射把那些反常向量表的地址映到总表中。

______________________________________________________________________________

为存储器分配地址的进程称为存储器映射,那么什么叫存储器重映射呢?为了添加体系的灵活性,体系中有部分地址能够一起呈现在不同的地址上,这就叫做存储器重映射。重映射首要包括引导块“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
UndefinedAddrDCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddrDCD PrefetchAbort
DataAbortAddrDCD DataAbort
Nouse DCD 0
IRQ_AddrDCD 0
FIQ_Addr DCD FIQ_Handler

重映射的原因:

因为ARM处理器的存储器结构比较复杂,或许一起存在片内存储器和片外存储器等,他们在存储器映射上的开始地址都不相同,因而ARM内核要拜访的间断向量表或许不在0x0000~0x003F地址上,因而采用了存储器重映射来完成将存在于不同当地的间断向量表都映射到0x0000~0x003F地址上。

留意:Boot Block也存在间断向量表,并且复位后这段代码首要映射到 0x0000~0x003F地址上,也便是说复位后首要运转的是Boot Block程序。各个存储区域的间断向量表也不尽相同。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/262985.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部