存储器映射的基本概念是:每个存储器组在存储器映射中都有一个物理上的位置,它是一个地址范围,在该范围内可以写入程序代码,每一个存储器空间的内容都永久固定在同一个位置,这样就不需要将代码设计成在不同地址范围内运行。ARM7处理器的异常向量地址如表3-1所列。
表3-1 ARM7处理器异常向量地址
为了与将来器件相兼容,整个Boot Block都被映射到片内存储器空间的顶端。在这种方式下,使用较大或较小的Flash模块都不需要改变Boot Block(需要改变Boot装载程序自身的代码)的位置或改变Boot Block异常向量的映射。除了异常向量之外的存储器空间都保持固定的位置。
存储器重新映射的部分允许在不同模式下处理中断,LPC2138处理器支持3种存储器映射方式,如表3-2所列。当处理器工作在用户Flash模式下时,不需要进行异常向量的重新映射,而在其他模式下则需要重新映射。它包括异常向量区的32B和额外的32B,一共64B。重新映射的代码位置与地址0x00000000~0x0000003F相重叠。一个位于Flash存储器中的典型用户程序,可以将整个FIQ处理程序从地址0x0000001C开始存放,而不需要考虑存储器边界。在SRAM、Flash和Boot Block中的向量必须包含跳转到实际异常处理程序的分支或者其他执行跳转到异常处理程序的转移指令。
表3-2 外设存储器地址空间映射
选择这种配置有三个原因:
●使Flash存储器中的FIQ处理程序不必考虑因为重新映射所导致的存储器边界问题。
●用来处理代码空间中段边界仲裁的SRAM和Boot Block向量的使用大大减少。
●为超过单字转移指令范围的跳转提供空间来保存常量。
重新映射的存储器组包括Boot Block和异常向量,除了重新映射的地址外,仍然继续出现在它们最初的位置。已重新映射和可重新映射区域的存储器地址空间如图3-3所示。
图3-3 已重新映射和可重新映射区域的低存储器地址空间
存储器映射控制用于改变从地址0x00000000开始的异常向量映射,从而允许运行在不同存储器空间中的代码对异常进行控制,这是通过存储器映射控制寄存器MEMMAP来实现的。(www.daowen.com)
MEMMAP是一个可读/写寄存器(地址为0xE01F C040),其功能为选择从Flash Boot Block、用户Flash或SRAM中读取异常向量,如表3-3所列。
表3-3 存储器地址映射控制寄存器MEMMAP功能
根据存储器映射的不同,异常向量的读取位置也不相同。存储器映射控制只从处理ARM异常必需的3个数据源(Flash异常向量、SRAM异常向量和Boot Block异常向量,每个64B)中选择一个使用,如图3-4所示。
例如,每当产生一个软件中断请求时,ARM内核就从0x00000008地址读取32位数据。这意味着当MEMMAP[1:0]=00(Boot装载程序模式)时,从0x00000008地址的读数/取指操作实际上是对0x7FFFD008地址单元进行操作。当MEMMAP[1:0]=10(用户RAM模式)时,从0x00000008地址的读数/取指操作实际上是对0x40000008地址单元进行操作。当MEMMAP[1:0]=01(用户Flash模式)时,从0x00000008地址的读数/取指操作实际上是对片内Flash 0x00000008地址单元进行操作。
图3-4 存储器映射控制
如果试图访问一个保留地址或未分配区域的地址,LPC21318将产生适当的总线周期中止异常。这些区域包括:
●特定的ARM器件所没有的存储器映射区域,在图3-2和图3-3中标志为“保留地址空间”。
●AHB和VPB空间的保留区域。
●未分配的AHB外设空间和未分配的VPB外设空间。
对于这些区域,对数据的访问和对指令的取指都会产生异常。此外,对AHB或VPB外设地址执行任何指令取指,都会导致产生预取指中止异常。
在现有的VPB外设地址空间内,对未定义地址的访问不会产生数据中止异常。每个外设内的地址译码被限制为外设内部需要判别的已定义寄存器。例如,对地址0xE000D000(UART0空间内一个未定义的地址)的访问可能导致对定义在地址0xE000C000处的寄存器进行访问。
需要注意的是,只有在试图执行从非法地址取指的指令时,ARM才会将预取指中止标志与相关的指令(没有意义的指令)一起保存到流水线,并对中止进行处理(即读取指令时仅设置标志,指令实际执行时才产生中止)。当代码在非常靠近存储器边界执行时,这样可防止由预取指导致的意外中止。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。