首页 理论教育 ARMCortex-M3单片机中向量表的位置和重定位

ARMCortex-M3单片机中向量表的位置和重定位

时间:2023-11-23 理论教育 版权反馈
【摘要】:当发生了异常并且要响应它时,Cortex-M3需要定位其处理例程的入口地址。缺省情况下,Cortex-M3认为该表位于零地址处,且各向量占用4字节,因此每个表项占用4字节,见表3.13。表3.13上电后的向量表因为地址0处应该存储引导代码,所以它通常是Flash或者是ROM器件,并且它们的值不得在运行时改变。然而,为了动态重分发中断,Cortex-M3允许向量表重定位——从其他地址处开始定位各异常向量。可以在SRAM中开出一块用于存储向量表。

ARMCortex-M3单片机中向量表的位置和重定位

当发生了异常并且要响应它时,Cortex-M3需要定位其处理例程的入口地址。这些入口地址存储在“(异常)向量表”中。缺省情况下,Cortex-M3认为该表位于零地址处,且各向量占用4字节,因此每个表项占用4字节,见表3.13。

表3.13 上电后的向量表

因为地址0处应该存储引导代码,所以它通常是Flash或者是ROM器件,并且它们的值不得在运行时改变。然而,为了动态重分发中断,Cortex-M3允许向量表重定位——从其他地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但也可以是RAM区。在RAM区就可以修改向量的入口地址了。为了实现这个功能,NVIC中有一个寄存器,称为“向量表偏移量寄存器”(在地址0xE000_ED08处),通过修改它的值就能定位向量表。但必须注意的是,向量表的起始地址是要求的,必须先求出系统中共有多少个向量,再把这个数字向上增大到2的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有32个中断,则共有32+16(系统异常)=48个向量,向上增大到2的整次幂后值为64,因此地址必须能被64×4=256整除,从而合法的起始地址可以是:0x0、0x100、0x200等。向量表偏移量寄存器的定义见表3.14。

表3.14 向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)

如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:(www.xing528.com)

①主堆栈指针(MSP)的初始值;

②复位向量;

③NMI;

④硬fault服务例程。

③④是必需的,因为有可能在引导过程中发生这两种异常。可以在SRAM中开出一块用于存储向量表。然后在引导完成后,就可以启用内存中的向量表,从而实现向量可动态调整的功能。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈