在MCU的启动过程中,NXP官方提供的启动代码会对中断向量表进行重定向,将向量表从flash定向到ram。具体实现分析如下。
Vector_Table.s
- SECTION .intvec:DATA:ROOT(2)
通过这个命令,声明一个.intvec的段,这条指令下面申明的变量都存放在这个段中。
- VTABLE
DCD __Stack_dtcm_start /* Top of Stack for Initial Stack Pointer */
#ifdef MCAL_TESTING_ENVIRONMENT
DCD _core_loop
#else
DCD Reset_Handler /* Reset Handler */
#endif
DCD NMI_Handler /* NMI Handler */
DCD HardFault_Handler /* Hard Fault Handler */
......
VTABLE是一个内存地址符号(Label),它代表.intvec段的起始位置。
所以,这里就有了.intvec这个段,并且这个段中存放的是中断向量表的地址。而且我们可以通过VTABLE来找到这个段的首地址。
linker_flash_s32k311.icf
define block intcVectorBlock with fixed order, alignment = 2048 { section .intvec };
place in int_dtcm_region { first block intcVectorBlock, block dataDtcmBlock, block bssDtcmBlock};
通过这两行代码,将.intvec段放在DTCM区域的最开始位置。
startup_cm7.s
SetVTOR:
/* relocate vector table to RAM */
LDR R0, =VTOR_REG
LDR R1, =VTABLE
STR R1,[R0]
这里通过VTABLE将向量表(ram区域向量表)的首地址给到SCB.VTOR,实现了向量表的重定位。
到这里问题来了,存放在flash区域的向量表是通过什么方式实现的呢?