我对引导加载程序代码中的向量表(中断表)有疑问,我的应用程序代码无法访问。好吧,主要问题是引导加载程序和应用程序代码中 ISR 的地址不同。所以,我的应用程序无法启动。关于如何让我的应用程序代码从我的向量表中找到正确的 ISR 例程地址的任何建议?
我正在使用 HCS08 和 Code Warriors。它是一个 USB Bootloader,由编程器加载到 FLASH 中,再通过 USB 加载一个 S19 文件。所以,我的 FLASH 上有两个程序。
我对引导加载程序代码中的向量表(中断表)有疑问,我的应用程序代码无法访问。好吧,主要问题是引导加载程序和应用程序代码中 ISR 的地址不同。所以,我的应用程序无法启动。关于如何让我的应用程序代码从我的向量表中找到正确的 ISR 例程地址的任何建议?
我正在使用 HCS08 和 Code Warriors。它是一个 USB Bootloader,由编程器加载到 FLASH 中,再通过 USB 加载一个 S19 文件。所以,我的 FLASH 上有两个程序。
HCS08 支持向量重定向,但不支持多个向量表(请参阅我答案末尾的引用)。 这个线程提供了一个有趣的讨论。根据我的阅读,没有直接的方法可以在 HCS08 上的 FLASH 中使用多个向量表。这使您只有几个选择:
您可以强制中断向量在 RAM 中查找它们的地址。为此,您将使用主向量表位置。每个向量将被设置为跳转到 RAM 地址的函数。RAM 地址将是您的中断代码的位置。
使用这种策略,您的应用程序和引导加载程序代码可以指定不同的中断函数。将 RAM 用于向量可能是有风险的。
另一种选择是在没有中断的情况下实现您的引导加载程序。然后,您可以保护引导加载程序内存、重定向向量位置并让您的应用程序对向量表进行编程。
有关此技术的讨论,请参见AN2140。
以下来自MC9S08EL/SL的数据表:
4.5.8 矢量重定向
每当任何 FLASH 受到块保护时,复位和中断向量都会受到保护。向量重定向允许用户修改中断向量信息,而无需取消保护引导加载程序和复位向量空间。通过将位于地址 0xFFBF 的 NVOPT 寄存器中的 FNORED 位编程为 0 来启用矢量重定向。要进行重定向,必须通过对位于地址 0xFFBD 的 NVPROT 寄存器进行编程来对闪存的至少一部分进行块保护。所有中断向量(内存位置 0xFFC0–0xFFFD)都被重定向,但复位向量(0xFFFE:0xFFFF)不是。
例如,如果 1024 字节的 FLASH 受到保护,则受保护的地址区域是从 0xFC00 到 0xFFFF。中断向量 (0xFFC0–0xFFFD) 被重定向到位置 0xFBC0–0xFBFD。如果启用向量重定向并且发生中断,则地址 0xFBE0:0xFBE1 中的值将用于向量,而不是地址 0xFFE0:0xFFE1 中的值。这允许用户使用包括新中断向量值的新程序代码重新编程 FLASH 的未受保护部分,同时保留包括默认向量位置的受保护区域不变。
另请参阅本应用笔记 (AN2295),了解如何为该系列微控制器实现串行引导加载程序。
我在这里发现这似乎是正确的,但是它不起作用:
** *引导加载程序 Vector.c:** * ** * *
ISR(AS1_InterruptTx) { asm { pshh ldhx #$DFD4 pshx jmp DO_ISR } } .......对于其他不同地址的向量类似............
..................................................... ......
无效 DO_ISR() { asm { pulx ldhx ,x
cphx #$FFFF
beq DI1
jsr ,x
DI1: 普鲁蒂 } }
** * ** * ** * ***在 Application Vector.c 中* ** * ** * ** * ** * ** * **
我变了:
ISR(AS1_InterruptTx)
{
............
............
}
至:
无效 AS1_InterruptTx() {
…………
…………
}
除此之外,我将向量保留在引导加载程序的默认位置,即 0xFFC4,并且我已将应用程序代码中的向量表重定向到 0xDFC4。
NVPROT_INIT 的值为 0xDE,NVOPT_INIT 的值为 0x7E。虽然这与应用程序代码的内容冲突(NVOPT = 0x3E 用于重定向),但我们不能覆盖该寄存器,因为它们受到保护。但是,无论何时发生中断,它都会转到位于 0xFFC4 的向量表,然后再将其发送到 0xDFC4。
这似乎是处理这个问题的好方法吗?
我不是 HCS08 专家,但通常存在重新映射或重定向向量的机制,因此您可以加载软件并使用新的中断向量,而不会干扰您的引导加载程序。我不知道您使用的是哪种芯片,但请尝试在芯片的参考手册中搜索“矢量重定向”。