在STM32F4中物理重映射到RAM后使用哪个数据总线?
Which data bus is used after physical remap to RAM in STM32F4?
STM32F4 控制器(带有 ARM Cortex M4 CPU)允许使用 SYSCFG_MEMRMP 寄存器对内存中的最低地址进行所谓的物理重映射 space(0x00000000 到 0x03FFFFFF)。我所理解的是寄存器选择哪个内存(FLASH/RAM/etc。)别名到最低地址,因此在重置后从哪个内存中获取重置向量和堆栈指针。
文档 [1] 还提到
In remap mode, the CPU can access the external memory via ICode bus
instead of System bus which boosts up the performance.
这意味着在重新映射之后,例如从别名地址 space(0x00000000 到 0x03FFFFFF)中获取的指令到 RAM,将使用 ICode 总线。
现在我的问题是:在这样的重新映射操作之后,例如到 RAM,将使用系统总线或 ICode 总线提取到 RAM 的非别名位置?
问题的背景是我想为仅从 RAM 执行的图像编写链接描述文件(在调试器的控制下)。 .text 部分应该放在哪个内存区域?别名 space 或实体 space?
[1] ST DocID018909 版本 7
感谢 Sean,我可以在 ARM® Cortex®‑M4 处理器技术参考手册第 2.3.1 节总线接口中找到答案:
ICode memory interface: Instruction fetches from Code memory space,
0x00000000 to 0x1FFFFFFC, are performed over the [sic!: this] 32-bit AHB-Lite bus.
DCode memory interface: Data and debug accesses to Code memory space,
0x00000000 to 0x1FFFFFFF, are performed over the [sic!: this] 32-bit AHB-Lite bus.
System interface: Instruction fetches and data and debug accesses to
address ranges 0x20000000 to 0xDFFFFFFF and 0xE0100000 to 0xFFFFFFFF
are performed over the [sic!: this] 32-bit AHB-Lite bus.
这也清楚地表明,位于 0x08000000 的 STM32F4 MCU 的闪存总是使用 ICode/DCode 总线访问(由 CPU 内核),无论它是否被重新映射。这是因为原始位置和重新映射的位置都在代码内存 space(0x00000000 到 0x1FFFFFFF)内。
但是,如果代码位于 SRAM 中的 0x20000000,则访问 0x00000000 处的重新映射位置使用 ICode/DCode 总线,而访问原始位置(在代码存储器 space 之外)使用系统总线。
核心总线接口的选择取决于访问的地址。如果您访问位于 0x00000004 的指令,这是在 ICode 总线上完成的。使用系统总线完成对 0x20000004 的访问。
REMAP 函数所做的是更改物理内存系统,以便对 0x00000004(ICode 总线)的访问将使用与您也可以在系统总线上访问的相同的 RAM。对 0x20000004 的任何访问都不会受到影响,并且仍然由内核在系统总线上生成。
STM32F4 控制器(带有 ARM Cortex M4 CPU)允许使用 SYSCFG_MEMRMP 寄存器对内存中的最低地址进行所谓的物理重映射 space(0x00000000 到 0x03FFFFFF)。我所理解的是寄存器选择哪个内存(FLASH/RAM/etc。)别名到最低地址,因此在重置后从哪个内存中获取重置向量和堆栈指针。
文档 [1] 还提到
In remap mode, the CPU can access the external memory via ICode bus instead of System bus which boosts up the performance.
这意味着在重新映射之后,例如从别名地址 space(0x00000000 到 0x03FFFFFF)中获取的指令到 RAM,将使用 ICode 总线。
现在我的问题是:在这样的重新映射操作之后,例如到 RAM,将使用系统总线或 ICode 总线提取到 RAM 的非别名位置?
问题的背景是我想为仅从 RAM 执行的图像编写链接描述文件(在调试器的控制下)。 .text 部分应该放在哪个内存区域?别名 space 或实体 space?
[1] ST DocID018909 版本 7
感谢 Sean,我可以在 ARM® Cortex®‑M4 处理器技术参考手册第 2.3.1 节总线接口中找到答案:
ICode memory interface: Instruction fetches from Code memory space, 0x00000000 to 0x1FFFFFFC, are performed over the [sic!: this] 32-bit AHB-Lite bus.
DCode memory interface: Data and debug accesses to Code memory space, 0x00000000 to 0x1FFFFFFF, are performed over the [sic!: this] 32-bit AHB-Lite bus.
System interface: Instruction fetches and data and debug accesses to address ranges 0x20000000 to 0xDFFFFFFF and 0xE0100000 to 0xFFFFFFFF are performed over the [sic!: this] 32-bit AHB-Lite bus.
这也清楚地表明,位于 0x08000000 的 STM32F4 MCU 的闪存总是使用 ICode/DCode 总线访问(由 CPU 内核),无论它是否被重新映射。这是因为原始位置和重新映射的位置都在代码内存 space(0x00000000 到 0x1FFFFFFF)内。
但是,如果代码位于 SRAM 中的 0x20000000,则访问 0x00000000 处的重新映射位置使用 ICode/DCode 总线,而访问原始位置(在代码存储器 space 之外)使用系统总线。
核心总线接口的选择取决于访问的地址。如果您访问位于 0x00000004 的指令,这是在 ICode 总线上完成的。使用系统总线完成对 0x20000004 的访问。
REMAP 函数所做的是更改物理内存系统,以便对 0x00000004(ICode 总线)的访问将使用与您也可以在系统总线上访问的相同的 RAM。对 0x20000004 的任何访问都不会受到影响,并且仍然由内核在系统总线上生成。