c-Cortex-M3实时中断向量重映射



我在STM32中使用GCC 4.9(arm none-eabi),并希望将中断表放入数组中,以便在代码中需要时更改中断处理程序地址
我阅读了现有的手册和文章,并做了以下工作:

我必须对齐数组,所以我更改了链接器脚本,在RAM中添加自定义部分,并将其放置在0x20001000,以便自动对齐

 .vectorsSection 0x20001000 :
  {    
    KEEP(*(.vectorsSection))       
  } >RAM

声明要放入IVT的数组,我在头中和.cc:中将其声明为extern

volatile word __attribute__((section (".vectorsSection"))) _vectors_[64] = {0};

检查阵列是否位于正确的地址:

arm-none-eabi-nm program.elf | grep _vectors_
20001000 d _ZL9_vectors_

现在是将表重新分配到RAM的时候了。我写了这个函数

void (*new_code_entry)(void);
.......
static void remap_vector_table (void)
{
  //VTOR is 0 on startup, so we change VTOR only once
  if(SCB->VTOR)
    return;
  new_code_entry = (void (*)(void))((word)&_vectors_ + sizeof(word) + 1);//Skip SP and jump to Reset
  memcpy((void*)_vectors_, (void*)SCB->VTOR, sizeof _vectors_);
  SCB->VTOR = 0x1FFFFF80ul & (word)(&_vectors_); //Set VTOR offset
  __DSB(); //Complete all memory requests
  new_code_entry(); //Jump to new code
}

为了方便访问数组,我从启动代码中创建了enum
最后一次跳转后,代码从头开始,VTOR为4096。
数组包含正确的地址,其顺序与启动代码中的顺序相同
但当谈到时

__enable_irq();
__ISB();

它挂在第一个异常上,更具体地说,这是调用堆栈

5 <symbol is not available> 0x697b617a   
4 <signal handler called>() 0xfffffff9   
3 <symbol is not available> 0x200011f8  
2 remap_vector_table() main.cc:31 0x08000cd4
1 main() main.cc:46 0x08000d32 
200011f4:  tickcounter+0   movs r0, r0
200011f6:  tickcounter+2   movs r0, r0
200011f8:  ; <UNDEFINED> instruction: 0xf0d3e321

tickcounter来自肯定首先被调用的SysTick_Handler。也许我应该用堆栈指针做点什么?我不知道这里出了什么问题。

根本原因很简单:

  1. 根据手册第29位显示的是基本偏移:RAM或FLASH。

    SCB->VTOR|=1<lt;SCB_VTOR_TBLBASE_Pos;

这修复了问题

  1. 更改表后无需重置-它会清除我的数组

最新更新