引导程序的向量表

时间:2018-07-13 20:28:20

标签: microcontroller bootloader

大多数(如果不是全部)微控制器都有一个向量表,用于处理程序运行时遇到的所有异常。我对启动程序是否也有自己的用于执行复位处理程序的向量表感到困惑?

2 个答案:

答案 0 :(得分:1)

引导加载程序只是一个程序,那里没有魔术,就像其他任何程序一样,如果它需要向量表,则程序员可以创建一个向量表。当然,如果需要从重置运行,则必须符合相应的硬件/处理器规则。处理器或任何其他逻辑都无法以任何方式知道该位集合,该指令集合是否是引导程序。它只是运行它。

我假设您正在谈论的是许多但不是全部的,在出厂时已编程了引导加载程序的微控制器/品牌?

在一个MCU中,有一个带有存储器总线的处理器内核。芯片中的许多项目,内存,闪存,gpio,spi,计时器,uart,adc等都生活在该总线上,就像在特定街道上拥有多个房屋一样。处理器总线上的每个项目都有地址解码器,它们在总线上寻找其地址,以知道何时获取或提供数据/信息。应用程序闪存和引导加载程序rom没什么不同,并不特殊。就像在软件中一样容易,在硬件中也一样,拥有某种if-then-else,它允许应用程序闪存在向量表地址处应答处理器,该标志驱动then或else情况可以成为零件的输入引脚。将引脚拉高并击中复位,然后从一个存储器中启动,将引脚拉低并击中复位,然后从另一个存储器中启动。还有其他解决方案,可能不是由器件的输入引脚驱动,而是由引导加载程序软件驱动。

有时处理器内核本身会发出一个信号,表明芯片供应商会随心所欲地驱动它,即在处理器内核中执行if-then,否则,则then情况是0x00000000,它在其中查找向量表,并且否则为0xFFFF0000。

最后,尽管引导加载程序只是由某人为此芯片编写的另一个程序,与您为该芯片编写的程序没有什么不同,除了以下事实:如果它是出厂编程的rom引导加载程序,则程序员对于该引导程序,我们可能没有该部分的其他信息/文档。但是,成为引导加载程序并不是什么魔术,它只是一个程序,一组指令。我们的应用程序也可以是引导加载程序,根据引导加载程序的发现有几种可能的不同应用程序,它们的引导加载程序可以引导我们的引导加载程序,然后从多个应用程序中选择并运行其中一个。全部都在一个部分...

答案 1 :(得分:0)

我编写了一个引导加载程序,该引导加载程序已移植到通讯产品(MSP430,AVR32,DSP56300)中使用的许多不同嵌入式处理器之间。该装载机的功能要求非常有限

  1. 硬件初始化。
  2. 使用校验和或密码签名验证主代码图像。
  3. 如果验证通过,则将控制权转移到主应用程序。
  4. 在串行端口上提供最小的命令界面,以允许更新固件。
  5. 进入点,允许主应用程序触发新的固件加载。

在同一处理器的非易失性存储器中保存的两个程序之间的这种操作转移意味着我必须在两个完全独立的应用程序之间提供中断功能的重定向。 MSP430的中断表保存在闪存中,因此无法轻松修改。它还包含必须始终指向引导加载程序代码开头的复位向量,因此擦除和重写该区域可能会导致单元完全变砖。

在这种情况下,解决方案是在引导加载程序中有一个中断服务例程,该例程通过位于应用程序存储空间内固定位置的向量表进行重定向。使用此方法时,向每个中断处理程序添加了一条间接跳转指令,从而为处理的每个中断带来了最小的额外处理器负载。引导加载程序被编写为不使用任何中断,该中断依赖于轮询所有通信的串行端口状态。如果引导加载程序需要使用中断,则可以将向量表移至RAM并由引导加载程序或应用程序根据需要进行初始化。 (我的处理器没有足够的RAM允许这样做)

在主应用程序代码中的固定位置上有一个简单的数据结构,其中包含每个可能的中断/异常的条目以及应用程序代码的起始地址(您可以将其视为应用程序代码复位向量)。只要应用程序在闪存中提供了此数据结构并正确填充,就可以像编译器上唯一的应用程序一样完全编译和完全构建它。