STM32F4控制器(使用ARM Cortex M4 CPU)允许使用SYSCFG_MEMRMP寄存器对存储空间中的最低地址(0x00000000至0x03FFFFFF)进行所谓的物理重映射。我的理解是寄存器选择哪个存储器(FLASH / RAM /等)别名为最低地址,因此复位后从哪个存储器取出复位向量和堆栈指针。
文档[1]也提到了
在重映射模式下,CPU可以通过ICode总线访问外部存储器 而不是提高性能的系统总线。
这意味着在重新映射之后,例如在RAM中从别名地址空间(0x00000000到0x03FFFFFF)中取出的指令将使用ICode总线。
现在我的问题:经过这样的重映射操作,例如到RAM,获取RAM的非别名位置是使用系统总线还是ICode总线?
问题的背景是我想为仅从RAM执行的图像(在调试器的控制下)编写链接描述文件。 .text部分应该到哪个内存区域?别名空间或物理空间?
[1] ST DocID018909 Rev 7
感谢Sean,我可以在ARM®Cortex®-M4处理器技术参考手册第2.3.1节总线接口中找到答案:
ICode内存接口:从代码存储空间中取出指令, 0x00000000到0x1FFFFFFC,通过[原文!:这个] 32位AHB-Lite总线执行。
DCode存储器接口:对代码存储空间的数据和调试访问, 0x00000000到0x1FFFFFFF,通过[原文!:这个] 32位AHB-Lite总线执行。
系统接口:指令读取和数据以及调试访问 地址范围为0x20000000至0xDFFFFFFF,0xE0100000为0xFFFFFFFF 通过[原文如此!:32位AHB-Lite总线执行。
这也清楚地表明,位于0x08000000的STM32F4 MCU的闪存总是使用ICode / DCode总线访问(由CPU内核),无论它是否被重映射。这是因为原始位置和重映射位置都在代码存储空间(0x00000000到0x1FFFFFFF)内。
但是,如果代码位于SRAM的0x20000000,则访问0x00000000的重映射位置时使用ICode / DCode总线,而访问原始位置(代码存储空间外)则使用系统总线。
答案 0 :(得分:1)
核心上总线接口的选择取决于所访问的地址。如果访问0x00000004处的指令,则在ICode总线上完成。使用系统总线访问0x20000004。
REMAP功能的作用是更改物理内存系统,以便访问0x00000004(ICode总线)将使用相同的RAM,您也可以在系统总线上访问。对0x20000004的任何访问都不受影响,仍然由核心在系统总线上生成。