ARM存储器:片内Flash、片内静态RAM、片外存储器
存储器映射(Memory Map)
映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。
我们可以把存储器看成一个具有输出和输入口的黑盒子。输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路实现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。
普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。
而ARM比较复杂,ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了(这就是后面要说的重新映射)。例如将0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存储单元。(随便举的例子为了说明道理,没有实际意义)
存储器重新映射(Memory Re-Map)
存储器重新映射是将复位后用户可见的存储器中部分区域,再次映射到其他的地址上。
存储器重新映射包括两个方面:1、Boot Block重新映射(关于Boot Block的相关内容看我博客中的另一篇文章)。2、异常(中断)向量重新映射
Boot Block重新映射:本来Boot Block在片内Flash的最高8KB,但是为了与将来期间相兼容,生产商为了产品的升级换代,在新型芯片中增加内部Flash容量时,不至于因为位于Flash高端的Boot Block的地址发生了变化而改写其代码,整个Boot Block都要被重新映射到内部存储器空间的顶部,即片内RAM的最高8KB。(地址为:0x7FFFE000~0x7FFFFFFF)
异常(中断)向量重新映射:本来中断向量表在片内Flash的最低32字节,重新映射时要把这32个字节再加上其后的32个字节(后面这32个字节是存放快速中断IRQ的服务程序的)共64个字节重新映射(地址为:0x00000000~0x0000003F)重新映射到的地方有三个:内部Flash高端的64字节空间、内部RAM低端的64字节空间和外部RAM低端的64字节空间,再加上原来的内部Flash低端的64字节空间,异常向量一共可以在四个地方出现。为了对存储器映射进行控制,处理器设置了存储器映射控制寄存器MEMMAP,其控制格式如下图所示:
注:1、当MEMMAP[1:0]=00时是映射到内部Flash高端,同内部Flash高端的Boot Block一起又被映射到了内部RAM高端
2、当MEMMAP[1:0]=01时相当于没有重新映射,异常向量表在内部Flash低端
3、当MEMMAP[1:0]=10时映射到了内部RAM的低端
4、当MEMMAP[1:0]=11时映射到了外部RAM低端
小结:1、至于异常向量表为什么要重新映射,而且有那么多种重新映射方法,还不清楚为什么,应该都是为了程序运行的更快吧。
2、其实关于ARM的存储器结构和映射问题,不研究那么清楚也可以,但是弄明白其中结构对以后的使用ARM会有很大好处。关于这一部分以及引导块(Boot Block)部分,北京航空航天大学出版社出版的由任哲等编著的《ARM体系结构及其嵌入式处理器》讲的比较清楚。
——————————————————转自网易博客—凯歌