为什么我们需要创建一个中断向量表?

时间:2014-02-20 15:56:01

标签: linux arm interrupt avr bootloader

我已经在net的一些教程中读到,中断的分支地址已经硬连线。 他们为什么需要在bootloader中创建IVT?

2 个答案:

答案 0 :(得分:8)

问题是您希望使用不同的硬件检测到事件或异常或中断,无论您想要调用它们。并且您希望有机会根据该事件运行单独的代码。硬件必须以某种方式将控制权移交给那些单独的例程。因此对于每个处理器架构都有一个解决方案。通常我们只是将它称为基于历史的中断向量表,但有些人可能称之为异常表,而在arm的情况下(大多数不是所有的武器)它真的是一个表,因为它不是地址列表而是实际指令?

代码执行的地址通常不是硬编码的,在ARM是的情况下,但通常中断向量表是地址列表,该表的位置和表中的每个条目都是固定地址但是在某种程度上,软件人员用该地址代码填写该表。这些情况的硬件检测到事件,基于该事件从已知到所有位置的存储器读取,该位置包含地址并且它开始在该地址处获取/运行。要执行的硬编码地址最终会出现arm情况或类似情况,例如,重置为0x0000并且预取中止为0x1000,数据中止为0x2000等,这是没有意义的。您希望该表指令或地址为要好又紧。除非获得专利,否则您可以为几乎任何架构创建一个类似于表的臂,每个例外可能超过四个字节,但您仍然可以这样做。或者只是做地址的事情。

ARM已经切换到Cortex-M中的传统地址,但与传统的地址不同,有几十个可能有数百个单独的向量(在微控制器中!),每个小东西都有一个入口点。原因在于,如果你在他们的文档中读取或者在他们之间读取的是cortex-m被设计为你不需要在你的C处理程序周围组装,使用传统处理器中断返回是特殊的并且需要特殊指令,例如,中断的输入通常涉及保存所有寄存器,其中该处理器的C调用约定可能没有保存所有内容。因此需要一些程序集和/或编译器特定的指令来让编译器为您完成。使用皮质m你可以有一个正常的,而不是特殊的C函数,只需将地址放在正确位置的巨大中断向量表中的那个C函数。

为什么在引导程序中。

  • bootloader通常是非易失性代码,flash / rom。
  • 引导加载程序处理重置事件
  • 为了能够启动处理器,您需要至少足够的IVT In flash / rom来找到重置处理程序。

因此,您通常会在该架构的向量表地址处及其周围划出一块地址空间,并将非易失性存储器放在那里。通常在附近但不需要你需要一块地址空间来为重置处理程序放置一个非易失性存储器,否则你根本无法启动处理器(如果处理器使用表中的地址来找到重置处理程序,一个典型的解决方案)。

由于你已经在flash / rom中有一个矢量表项,所以你可以将其余部分放在那里。并将整个事件称为引导程序。一旦启动,您可能希望将向量表设置为volatile,以便您可以在基于操作系统的处理程序中指向引导加载程序而不是非易失性指向引导加载程序处理程序或空间中的某些硬编码地址。并且有很多不同的方法可以解决这个问题,一般类别的内存控制器切换到ram(启动和运行后),让引导加载程序处理程序使用某种间接到某些ram位置,除了重置。你如何实现它等等各不相同。例如,在系统中使用MMU,您可以轻松地将矢量表重新映射到ram ...

答案 1 :(得分:6)

中断向量表不仅仅是中断。它也称为例外表。有两种一般形式,

  1. 功能指针
  2. 固定代码入口点。
  3. 例如,在68K上,地址0x8处的值可能用作数据错误函数指针。在传统的ARM cpus上,数据错误异常会将程序计数器设置为地址0x8。中断处理程序可能位于偏移量0x10等处。处理的不仅仅是中断。在ARM上,

    1. 重置
    2. 未定义的指令
    3. 主管处理程序(SWI)
    4. 预取处理程序
    5. 数据中止处理程序
    6. 中断处理程序
    7. 快速中断处理程序
    8. 正如您所看到的,有多个条目。通过使用表格,CPU硬件可以是最小的,只需要知道一个地址而不是七个或更多。在较旧的ARM系统中,矢量表可以根据供应商配置的方式为高或低(0xffff0000或0x0)。在较新的(至少是Cortex-A)中,您可以使用VBAR指定表地址。

        

      那么为什么我们需要在bootloader中创建IVT?

      偏移可能在芯片中固定。引导加载程序需要将代码放在那里,以便有一些东西可以处理它。

      让我们说我们家有一个邮箱。邮递员把邮件放在盒子里。我们去包装盒并删除邮件。邮箱是矢量表位置。帖子是CPU。我们是向量表中的代码。邮箱和矢量表位置位于固定的位置。