gpt4 book ai didi

重定位 vector 表的C代码

转载 作者:行者123 更新时间:2023-11-30 19:04:49 27 4
gpt4 key购买 nike

我有以下代码行

#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的地址,所以它会指向 vector 表的当前位置,对吗? SCB_VTOR = (uint32_t)__vector_table; 的含义是什么?我的 SCB_VTOR 是否指向地址 0x00002000 代码行?提前致谢

最佳答案

__vector_table 包含了被包含在链接器脚本中时的地址(__vector_table = .; 表示获取当前地址的值,即如果之前的部分占用 8kB,__vector_table 将包含下一个地址)。

是的,SCB_VTOR 包含地址 0x00002000,假设 interrupts 部分位于 0x00002000 中,并且根据对于链接描述文件,首先要做的是获取地址。

请记住,某些 CPU/MCU 具有固定 vector 表,并且它从特定寄存器开始。

关于重定位 vector 表的C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51057464/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com