garfield

【原创】迁移向量表

0
阅读(2490)

有些应用程序需要的向量表位于 RAM。例如在一个实时操作系统的实例需要向量表在RAM中,这使得在运行时内核通过修改向量表安装ISR。
该NVIC 提供了一种简单的方式重新分配向量表,为此用户需要建立向量表的偏移寄存器(VTOR)的地址偏移量为新位置。使用TBLBASE[ 29 ]位表明向量表在RAM 中为1 或在flash中为0 及TBLOFF28 : 7]表明地址偏移量表。
该CORTEX-M4 假设RAM 起始地址在0x 20000000,如果vtortblbase[ 29]位设置向量表是存储在该地址。因为Kinetis 系列MCU RAM 起始地址在0x1fff0000,该位必须被清除。如果计划将向量表存放在RAM 中,你必须将向量表从flash 到RAM 中。还注意到,在一些低功耗模式,一部分的内存将不供电,从而导致一个向量表损坏。在这种情况下,先在FLASH中定位向量表再进入低功率模式。
代码示例和说明
向量表通常在 flash 中重新设置,这表明,常常需要将向量表从flash 到RAM。 要达到此,两个步骤必须执行:
1. 整个向量表从 flash 复制到RAM。在这步连接器指令文件标签是有用的。 这些代码类似于这样:
/*Address for VECTOR_TABLE and VECTOR_RAM come from the linker file*/
extern uint32 __VECTOR_TABLE[];
extern uint32 __VECTOR_RAM[];

/* Copy the vector table to RAM */
if (__VECTOR_RAM != __VECTOR_TABLE)
{
for (n = 0; n < 0x410; n++)
__VECTOR_RAM[n] = __VECTOR_TABLE[n];
}
2. 复制向量表后,为 VTOR 寄存器设置适当的偏移量。
/* Set the VTOR to be on RAM */
SCB_VTOR = __VECTOR_RAM;
重要的是按照上述步骤的顺序执行。这保证了向量表总是有效的。