【问题标题】:C code to relocate the vector table重定位向量表的 C 代码
【发布时间】: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的向量表,更具体地说?知道使用的确切部分会很有帮助。你为什么要重新定位向量表?编写某种方式的引导加载程序?

标签: c gcc linker embedded gnu


【解决方案1】:

__vector_table包含被链接脚本包含时的地址(__vector_table = .;表示获取当前地址的值,即如果前面的段占用8kB,__vector_table将包含下一个地址) .

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

请记住,一些 CPU/MCU 有一个固定的向量表,它从一个特定的寄存器开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多