VTOR在ARM M3中的使用

VTOR在ARM M3中的使用,arm,embedded,cortex-m3,Arm,Embedded,Cortex M3,我想知道,在基于ARMM3的MCU上,使用VTOR寄存器重新定位向量表有什么好处?我理解的原因是: 矢量表需要在运行时更改,默认地址(0x0为只读) 从SRAM读取数据(比如重新定位到SRAM区域的开头)可能比闪存区域快 这是否意味着,如果所有中断处理程序都是在编译期间定义和已知的,则根本不需要使用VTOR 原因有很多。然而,我认为可能有三个主要原因 您正在使用一个引导加载程序,它将基于0x00000000。当引导加载程序完成它的工作时,它跳转到应用程序。应用程序可能希望有自己的向量表,以便引导

我想知道,在基于ARMM3的MCU上,使用VTOR寄存器重新定位向量表有什么好处?我理解的原因是:

  • 矢量表需要在运行时更改,默认地址(0x0为只读)
  • 从SRAM读取数据(比如重新定位到SRAM区域的开头)可能比闪存区域快
    这是否意味着,如果所有中断处理程序都是在编译期间定义和已知的,则根本不需要使用VTOR

    原因有很多。然而,我认为可能有三个主要原因

  • 您正在使用一个引导加载程序,它将基于0x00000000。当引导加载程序完成它的工作时,它跳转到应用程序。应用程序可能希望有自己的向量表,以便引导加载程序可以在启动应用程序之前设置地址


  • 您需要一个基于RAM的向量表,以便可以在运行时安装不同的处理程序

  • 在运行之前,应用程序可能会从一些外部ROM加载到RAM中


  • 这些特性的目的是引导加载程序。例如,当引导加载程序正在对用户定义的向量表所在的闪存进行编程时,MCU必须同时使用位于其他位置的向量表。

    每当ARM M3复位时,默认情况下,它从地址0x00000000获取值并将其放入SP寄存器,从地址0x00000004获取值放入PC。这是引导代码执行的起点。 这是因为VTOR寄存器默认设置为0,而向量表起始地址设置为0x0000000

    引导代码检查UART是否要求使用引导代码启动并接收新固件。如果有需求,引导代码将逐字节接收,并使用从UART端口接收的数据对闪存进行编程

    完成此作业后,引导代码将VTOR寄存器更改为0x0801000,并跳转到地址0x0001000,其中是新的向量表开始地址。这是启动用户代码

    void main() 
    

    Cortex M的可编程VTOR的这一功能非常出色,并且简化了引导代码程序和代码。通常微处理器/微控制器有固定的向量值地址。

    “您需要一个基于RAM的向量表,以便在运行时安装不同的处理程序。”。。。重置和硬件错误中断怎么办?将向量表放在RAM中听起来不是一个好主意。显然,您需要确保在RAM表中正确设置了重要的系统向量。在我看来这没什么问题。这是个坏主意,因为你需要2个向量表而不是1个。在重置之外,您需要使用基于闪存的矢量表,然后您必须在启动后恢复到基于RAM的矢量表。。。如果你知道在这一点上,哪一个RAM为基础的一个你以前选择。从NVM ISR内部使用自定义函数调用听起来更好更安全。这样的函数调用可以内联。我完全依赖于您的应用程序。如果您需要尽可能最好的性能和运行时可配置的向量,那么直接安装向量的能力将提高性能。我不是说你应该一直这样做,只是指出这是一种可能性。谢谢!我认为这一点现在更清楚了,因为许多供应商都提供了自己的引导,应用程序只是希望有一个不同的表,而不涉及供应商特定的表。嗯,这是一个有趣的问题……但这是否意味着SRAM区域总是通电,以便可以获取向量表?如果不支持保留,并且在重新启动过程中删除了表,该怎么办?在标准微控制器上,只要微控制器通电,内部RAM通常都会通电。也就是说,应用程序向量表很可能位于同一闪存ROM中的某个位置(与应用程序位于不同的页面)@Jackie。在闪存中,您将有两个向量表,位于不同的地址。微控制器通常不保证复位后RAM数据的完整性,尽管理论上它可能是完整的。当然,除非重置源是低压检测。所以在RAM中有一个向量表基本上可以归结为胡说八道,除非您可以在启动时从flash中复制它。