【问题标题】:Vector table issue in Application and Bootloader code应用程序和引导加载程序代码中的向量表问题
【发布时间】:2010-11-20 17:32:23
【问题描述】:

我对引导加载程序代码中的向量表(中断表)有疑问,我的应用程序代码无法访问这些表。 好吧,主要问题是引导加载程序和应用程序代码中 ISR 的地址不同。所以,我的应用程序无法启动。 关于如何让我的应用程序代码从我的向量表中找到正确的 ISR 例程地址的任何建议?

我正在使用 HCS08 和 Code Warriors。 它是一个 USB Bootloader,由编程器加载到 FLASH 中,再通过 USB 加载一个 S19 文件。所以,我的 FLASH 上有两个程序。

【问题讨论】:

  • 您需要更具体:什么处理器、什么引导加载程序和什么应用程序?
  • 用具体细节编辑了我的问题。

标签: c bootloader interrupt


【解决方案1】:

HCS08 支持向量重定向,但不支持多个向量表(请参阅我答案末尾的引用)。 This thread 提供了一个有趣的讨论。根据我的阅读,没有直接的方法可以在 HCS08 上的 FLASH 中使用多个向量表。这使您只有几个选择:

  1. RAM 向量表
  2. 引导加载程序中没有中断
  3. 将向量重新定位到未受保护的闪存,并让启动和应用程序都使用该表

RAM 向量表

您可以强制中断向量在 RAM 中查找它们的地址。为此,您将使用主向量表位置。每个向量将被设置为跳转到 RAM 地址的函数。 RAM 地址将是您的中断代码的位置。

使用此策略,您的应用程序和引导加载程序代码可以指定不同的中断函数。将 RAM 用于向量可能会有风险。

引导加载程序中没有中断

另一种选择是在没有中断的情况下实现您的引导加载程序。然后,您可以保护引导加载程序内存、重定向向量位置并让您的应用程序对向量表进行编程。

将向量重新定位到不受保护的闪存

有关此技术的讨论,请参阅 AN2140

以下来自datasheet for the MC9S08EL/SL

4.5.8 向量重定向

当任何 FLASH 被块保护时,复位 和中断向量将是 受保护。矢量重定向允许 用户修改中断向量 未经保护的信息 引导加载程序和复位向量空间。 矢量重定向由 编程中的 FNORED 位 NVOPT 寄存器位于地址 0xFFBF 为 0。为了发生重定向, FLASH 的至少一部分 内存必须被块保护 编程 NVPROT 寄存器 位于地址 0xFFBD。全部 中断向量(内存位置 0xFFC0–0xFFFD) 被重定向,但 复位向量 (0xFFFE:0xFFFF) 是 不是。

例如,如果 1024 字节 FLASH受保护,受保护 地址区域是从 0xFC00 到 0xFFFF。中断向量 (0xFFC0–0xFFFD) 被重定向到 位置 0xFBC0–0xFBFD。如果向量 重定向已启用,并且 中断发生时,在值 位置 0xFBE0:0xFBE1 用于 向量而不是中的值 位置 0xFFE0:0xFFE1。这 允许用户重新编程 闪存的未受保护的部分与 新的程序代码,包括新的 离开时中断向量值 保护区,其中包括 默认向量位置,不变。

另请参阅application note (AN2295),了解如何为该系列微控制器实现串行引导加载程序。

【讨论】:

  • 是的,我的控制器中有这个功能。但是,可能是我在某个地方误解了某些东西。所以,情况是这样的:Bootloader 需要保护它的向量表,所以即使它被重定向,我也需要保护它,因为我在 Bootloader 中使用了 USB 中断。所以,因为这必须受到保护,所以我不能为我的应用程序的向量表重写它。此外,ISR 的地址在 Bootloader 和应用程序代码中是不同的。请在这里改进我​​。
  • @Punit:您的引导加载程序将始终使用位于受保护内存中的主向量表 (0xFFC0-0xFFFD)。它不会修改 FNORED 寄存器。您的应用程序将始终使用辅助向量表(0xFBE0 或它为您的应用程序驻留的任何位置)。当应用程序运行时,它设置 FNORED 将中断路由到辅助表。只有您的应用程序需要关注辅助向量表。
  • 如果我理解:引导加载程序使用默认向量表,即在 FBC4。但是 NVOPT(0x7E) 和 NVPROT 有一些价值应用程序在 DBC4 使用重定向向量表(不记得确切地址),虽然我的向量表在这里很好,因为我可以写它但 NVOPT(0x3E)。现在,由于 NVOPT 和 NVPROT 仅在复位时写入,我的应用程序代码无法重新编写它。我说的对吗?
  • @Punit:听起来很正确(免责声明:我从未在 HCS08 上实现过此功能,但在 HCS12 上使用过类似的策略)
  • 但这就是问题所在,我不能有两个向量表,因为 NVOPT 和 NVPROT 无法重写,因为它们仅设置为 RESET。此外,它们位于受保护的 FLASH 区域。如果它们没有针对应用程序代码进行更新(即一旦执行引导加载程序代码并启动应用程序代码),那么我的应用程序代码将失败。非常感谢您的回复。
【解决方案2】:

我不是 HCS08 专家,但通常存在重新映射或重定向向量的机制,因此您可以加载软件并使用新的中断向量,而不会干扰您的引导加载程序。我不知道您使用的是哪种芯片,但请尝试在芯片的参考手册中搜索“矢量重定向”。

【讨论】:

  • 是的,向量重定向是可用的,但是它也需要保护,因为引导加载程序也使用一个中断并且需要这个向量表。而且我的应用程序代码需要很多中断,而且这些 ISR 的地址也各不相同。请提出一些建议。
【解决方案3】:

我发现这里似乎是正确的,但它不起作用:

***Bootloader Vector.c:*******

ISR(AS1_InterruptTx) { 汇编 { 嘘 ldhx #$DFD4 pshx 跳转 DO_ISR } } .......对于其他具有不同地址的向量类似............

.................................................. ....................

无效 DO_ISR() { 汇编 { 脉冲 ldhx ,x
cphx #$FFFF
beq DI1
jsr ,x

DI1: 拉 rti } }

************ 在 Application Vector.c 中******************

我变了:

ISR(AS1_InterruptTx)

{

...........

...........

}

收件人:

void AS1_InterruptTx() {

.......

.......

}


除此之外,我将向量保留在引导加载程序中的默认位置,即 0xFFC4,并且我已将应用程序代码中的向量表重定向到 0xDFC4。

NVPROT_INIT 的值为 0xDE,NVOPT_INIT 的值为 0x7E。虽然这与应用程序代码的内容冲突(NVOPT = 0x3E 用于重定向),但我们不能覆盖该寄存器,因为它们受到保护。但是,无论何时发生中断,它都会转到位于 0xFFC4 的向量表,然后再将其发送到 0xDFC4。

这似乎是处理这个问题的好方法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2011-05-07
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多