关于 Cortex-M3 向量 table 放置的问题
Question about the Cortex-M3 vector table placement
我正在尝试了解向量 table 用于 Cortex-M3 处理器的位置。
根据 Cortex-M3 arch ref 手册,复位行为是这样的(部分省略):
所以,我们可以看到vectortable
来自VTOR
(矢量Table偏移寄存器)。
根据 Cortex-M3 技术参考手册,VTOR
定义为:
所以我们可以看到,它的重置值为0x0
。 所以根据以上2个标准,Cortex-M3处理器期望在复位后代码区的绝对地址0x0处有一个向量table。
但是在我的 MDK uVision IDE 中,我看到我的应用程序被放置在 IROM1
区域,它从 0x8000000
开始,在 0.5G Code
以内] 内存区域根据 Cortex-M3 内存映射。
并且因为它选中了 Starup
按钮,我想这意味着 IROM1
区域应该包含矢量 table(如果我错了请纠正我错了).
所以我认为矢量 table 应该位于 IROM1
区域的开始,即 0x8000000
。确实如此。下图显示在IROM1
的开头,它是向量table的第一个条目,SP值。
更奇怪的是,VTOR
寄存器(在 0xE000ED08
)仍然保存着一个 0x0
值:
那么,我的向量 table 是如何用 0x0
VTOR 重置值找到的?
出于好奇,我检查了 0x0
处的内存内容,其中包含与 IROM1
完全相同的向量 table 内容。 那么这个魔法副本是谁做的??
添加 1 - 4:39 下午 10/9/2020
下图中的 startup
复选框,我想肯定有一些我不知道的地方。
添加 2 - 5:09 下午 10/9/2020
感谢 @RealtimeRik 和 @domen。我下载了 STM32F103x8_xB(https://www.st.com/resource/en/datasheet/stm32f103c8.pdf) 的数据表。在第 4 节内存映射中,我看到了下图:
所以 [0x0, 0x8000000) 范围似乎确实在其他地方别名化了。但是我还没有找到如何确定它的别名...
添加 3 - 5:39 下午 10/9/2020
现在我找到了!
我下载了 STM32Fxxx fef manual(顺便说一句,它真的很大)。
在3.4 引导配置部分,它指定了通过BOOT[1:0]
引脚配置的引导模式。
不同的启动模式,使用不同的地址别名:
Depending on the selected boot mode, main Flash memory, system memory
or SRAM is accessible as follows:
- Boot from main Flash memory: the main Flash memory is aliased in the boot memory space (0x0000 0000), but still accessible from its
original memory space (0x800 0000). In other words, the Flash memory
contents can be accessed starting from address 0x0000 0000 or 0x800 0000.
- Boot from system memory: the system memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original
memory space (0x1FFF B000 in connectivity line devices, 0x1FFF F000 in
other devices).
- Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000.
我看到的是从主闪存启动。
好吧,我终于可以解释为什么选择 0x800 0000
...
添加 4 - 3:19 下午 10/15/2020
地址0处的中断向量table的placement/expectation类似于实模式下的IA32处理器...
没有“魔法副本”。 0x00000000 是 0x08000000 的别名。
实际内存在物理上位于 0x08000000 但也可以在 0x00000000 访问。
如果您查看特定于处理器的参考手册,您应该会在内存映射部分找到它。
我正在尝试了解向量 table 用于 Cortex-M3 处理器的位置。
根据 Cortex-M3 arch ref 手册,复位行为是这样的(部分省略):
所以,我们可以看到vectortable
来自VTOR
(矢量Table偏移寄存器)。
根据 Cortex-M3 技术参考手册,VTOR
定义为:
所以我们可以看到,它的重置值为0x0
。 所以根据以上2个标准,Cortex-M3处理器期望在复位后代码区的绝对地址0x0处有一个向量table。
但是在我的 MDK uVision IDE 中,我看到我的应用程序被放置在 IROM1
区域,它从 0x8000000
开始,在 0.5G Code
以内] 内存区域根据 Cortex-M3 内存映射。
并且因为它选中了 Starup
按钮,我想这意味着 IROM1
区域应该包含矢量 table(如果我错了请纠正我错了).
所以我认为矢量 table 应该位于 IROM1
区域的开始,即 0x8000000
。确实如此。下图显示在IROM1
的开头,它是向量table的第一个条目,SP值。
更奇怪的是,VTOR
寄存器(在 0xE000ED08
)仍然保存着一个 0x0
值:
那么,我的向量 table 是如何用 0x0
VTOR 重置值找到的?
出于好奇,我检查了 0x0
处的内存内容,其中包含与 IROM1
完全相同的向量 table 内容。 那么这个魔法副本是谁做的??
添加 1 - 4:39 下午 10/9/2020
下图中的 startup
复选框,我想肯定有一些我不知道的地方。
添加 2 - 5:09 下午 10/9/2020
感谢 @RealtimeRik 和 @domen。我下载了 STM32F103x8_xB(https://www.st.com/resource/en/datasheet/stm32f103c8.pdf) 的数据表。在第 4 节内存映射中,我看到了下图:
所以 [0x0, 0x8000000) 范围似乎确实在其他地方别名化了。但是我还没有找到如何确定它的别名...
添加 3 - 5:39 下午 10/9/2020
现在我找到了!
我下载了 STM32Fxxx fef manual(顺便说一句,它真的很大)。
在3.4 引导配置部分,它指定了通过BOOT[1:0]
引脚配置的引导模式。
不同的启动模式,使用不同的地址别名:
Depending on the selected boot mode, main Flash memory, system memory or SRAM is accessible as follows:
- Boot from main Flash memory: the main Flash memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x800 0000). In other words, the Flash memory contents can be accessed starting from address 0x0000 0000 or 0x800 0000.
- Boot from system memory: the system memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x1FFF B000 in connectivity line devices, 0x1FFF F000 in other devices).
- Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000.
我看到的是从主闪存启动。
好吧,我终于可以解释为什么选择 0x800 0000
...
添加 4 - 3:19 下午 10/15/2020
地址0处的中断向量table的placement/expectation类似于实模式下的IA32处理器...
没有“魔法副本”。 0x00000000 是 0x08000000 的别名。
实际内存在物理上位于 0x08000000 但也可以在 0x00000000 访问。
如果您查看特定于处理器的参考手册,您应该会在内存映射部分找到它。