C代码重定位向量表

时间:2018-06-27 07:56:48

标签: c gcc linker embedded gnu

我有以下代码行

MEMORY
{
  m_interrupts  (rx) : ORIGIN = 0x00002000, LENGTH = 0xC0   /*192 Bytes*/
  ....
  ....
  ....
  ....

 .interrupts :
  {
    __vector_table = .;             
    . = ALIGN(4);
    KEEP(*(.vectortable)) /* Startup code */
    . = ALIGN(4);
  } > m_interrupts

在我的main.c文件中。

并且我的__vector_table在链接描述文件的中断部分中如下所示:

SCB_VTOR = (uint32_t)__vector_table;

当中断发生时,由于我将寄存器SCB_VTOR加载到__vector_table的地址,它将指向向量表的当前位置? SCB_VTOR是什么意思,我的0x00002000指向代码的地址<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script> <script src="https://code.angularjs.org/1.6.9/angular-route.js"></script> 行?预先感谢

1 个答案:

答案 0 :(得分:1)

__vector_table包含链接程序脚本中包含的地址(__vector_table = .;表示获取当前地址的值,也就是说,如果前面的部分占用8kB,则__vector_table将包含下一个地址)。

是的,假设SCB_VTOR中的0x00002000部分在interrupts中加注,0x00002000包含地址<Route path={YOURPATH} render={(props) => <YourComp {...props} keyProp={id} key={id}/>} /> ,根据链接描述文件,第一件事就是获取地址。

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