问题描述
我试图了解Cortex-M3处理器向量表的位置。
根据Cortex-M3 Arch ref手册,重置行为是这样的(某些部分被省略了):
因此,我们可以看到vectortable
来自VTOR
(向量表偏移量寄存器)。
根据Cortex-M3技术参考手册,VTOR
定义为:
因此我们可以看到,它的重置值为0x0
。 因此,基于以上两个条件,Cortex-M3处理器在重置后会期望在代码区域中绝对地址0x0处有一个向量表。
但是在我的MDK uVision IDE中,我看到我的应用程序放置在IROM1
区域中,该区域从0x8000000
开始,该区域在0.5G Code
内存区域内,根据Cortex-M3内存映射。
并且由于选中了Starup
按钮,我想这意味着IROM1
区域应包含向量表(如果我对此有误,请纠正我)
因此,我认为向量表应位于IROM1
区域的开头,即0x8000000
。的确如此。下图显示了IROM1
的开头,它是向量表的第一个条目SP值。
更奇怪的是,VTOR
寄存器(位于0xE000ED08
处)仍然具有0x0
值:
那么,如何用0x0
VTOR重置值找到我的向量表?
出于好奇,我检查了0x0
处的内存内容,其中包含与IROM1
完全相同的向量表内容。 那谁制作了这个魔术拷贝?
ADD 1-4-下午10:9/9下午4:39
我想下面的startup
复选框肯定有些未知。
ADD 2-2020年10月9日下午5:09
感谢 @RealtimeRik 和 @domen 。我下载了STM32F103x8_xB(https://www.st.com/resource/en/datasheet/stm32f103c8.pdf)的数据表。在第4节“内存映射”中,我看到了下图:
所以[0x0,0x8000000)范围似乎确实别名到其他地方。但是我还没有找到如何确定它的别名...
ADD 3-5-2020/10/9下午5:39
现在我找到了!
我下载了STM32Fxxx fef manual(但确实很大)。
在 3.4引导配置部分中,它指定了通过BOOT[1:0]
引脚配置的引导模式。
在不同的启动模式下,将使用不同的地址别名:
取决于所选的引导模式,主闪存,系统内存 或按以下方式访问SRAM:
- 从主闪存启动:主闪存在启动存储空间(0x0000 0000)中具有别名,但仍可从其访问 原始内存空间(0x800 0000)。换句话说,闪存 内容可以从地址0x0000 0000或0x800 0000开始访问。
- 从系统内存引导:系统内存在引导内存空间(0x0000 0000)中具有别名,但仍可从其原始位置进行访问 内存空间(连接线路设备中为0x1FFF B000,英寸为0x1FFF F000 其他设备)。
- 从嵌入式SRAM引导:仅可通过地址0x2000 0000访问SRAM。
我看到的是从主闪存启动。
最后我可以解释为什么选择0x800 0000
...
ADD 4-2020年10月15日下午3:19
地址0处的中断向量表的放置/预期类似于实模式下的IA32处理器...
解决方法
没有“魔术副本”。 0x00000000别名为0x08000000。
实际内存实际位于0x08000000,但也可以访问0x00000000。
如果您查看处理器特定的参考手册,则应在内存映射部分中找到它。