我有以下几行代码
#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
行吗?提前致谢 最佳答案
__vector_table
包含链接程序脚本中包含的地址(__vector_table = .;
表示获取当前地址的值,即,如果前面的部分占用8kB,__vector_table
将包含下一个地址)。
是的,考虑到SCB_VTOR
在0x00002000
中加星号,interrupts
包含地址0x00002000
,根据链接描述文件,要做的第一件事就是获取地址。
请记住,某些CPU / MCU具有固定的向量表,并且该表始于特定的寄存器。