【发布时间】:2018-06-27 07:56:47
【问题描述】:
我有以下代码行
#define SCB_VTOR SCB_VTOR_REG(SystemControl_BASE_PTR)
#define SCB_VTOR_REG(base) ((base)->VTOR)
/* VTOR Bit Fields */
#define SCB_VTOR_TBLOFF_MASK 0xFFFFFF80u
#define SCB_VTOR_TBLOFF_SHIFT 7
#define SCB_VTOR_TBLOFF(x) (((uint32_t)(((uint32_t)(x))<<SCB_VTOR_TBLOFF_SHIFT))&SCB_VTOR_TBLOFF_MASK)
extern uint32_t __vector_table[];
SCB_VTOR = (uint32_t)__vector_table;
在我的 main.c 文件中。
我的 __vector_table 在链接器描述文件的中断部分如下:
MEMORY
{
m_interrupts (rx) : ORIGIN = 0x00002000, LENGTH = 0xC0 /*192 Bytes*/
....
....
....
....
.interrupts :
{
__vector_table = .;
. = ALIGN(4);
KEEP(*(.vectortable)) /* Startup code */
. = ALIGN(4);
} > m_interrupts
当中断来临时,由于我将寄存器SCB_VTOR加载到__vector_table的地址,它会指向向量表的当前位置对吗?? SCB_VTOR = (uint32_t)__vector_table;是什么意思是我的SCB_VTOR指向地址0x00002000这行代码吗?提前致谢
【问题讨论】:
-
@Someprogrammerdude:
__vector_table在链接器控制文件中定义,因此它是实现的一部分,而不是关于 C 标准的应用程序代码。长话短说:这很好(而且很常见)。 -
what MCU的向量表,更具体地说?知道使用的确切部分会很有帮助。你为什么要重新定位向量表?编写某种方式的引导加载程序?