我遇到了矢量表(中断表)的问题,它们位于Bootloader代码中,无法通过我的应用程序代码访问。 那么,主要问题是在Bootloader和Application代码中ISR的地址是不同的。所以,我的应用程序无法启动。 有关如何使我的应用程序代码从我的Vector表中找到正确的ISR例程地址的任何建议?
我正在使用HCS08和Code warrior。 它是一个USB Bootloader,由程序员加载到FLASH中,并通过USB进一步加载S19文件。所以,我的FLASH上有两个程序。
答案 0 :(得分:1)
HCS08支持向量重定向,但不支持多个向量表(请参阅我的答案末尾的引用)。 This thread提供了一个有趣的讨论。根据我的阅读,在HCS08上没有直接的方法在FLASH中使用多个向量表。这只剩下几个选项:
您可以强制中断向量在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。这个 允许用户重新编程 FLASH的无保护部分 新程序代码包括新的 离开时中断向量值 保护区,包括 默认矢量位置,未更改。
另请参阅此application note (AN2295)关于为此系列微处理器实现串行引导加载程序。
答案 1 :(得分:0)
我不是HCS08专家,但通常有重新映射或重定向向量的机制,因此您可以加载软件并使用新的中断向量而不会干扰引导加载程序。我不知道您使用的是哪种芯片,但请尝试在芯片的参考手册中搜索“矢量重定向”。
答案 2 :(得分:0)
我在这里发现这似乎是正确的,但它不起作用:
** * Bootloader Vector.c: < / EM>的 ** * ** * * 强>
ISR(AS1_InterruptTx) { ASM { PSHH ldhx#$ DFD4 pshx jmp DO_ISR } } .......类似于其他具有不同地址的向量...........
............................................... ...................
无效DO_ISR()
{
ASM
{
pulx
ldhx,x
cphx#$ FFFF
beq DI1
jsr,x
DI1: pulh 器R } }
的 强> 的 ** * ** * ** * 的*** 在应用程序Vector.c * ** * ** * ** * ** * ** * ** 强>
我改变了:
ISR(AS1_InterruptTx)
{
...........
...........
}
要:
void AS1_InterruptTx() {
..........
..........
}
除此之外,我将Vector保留在Bootloader的默认位置,即0xFFC4,我已将应用程序代码中的Vector表重定向到0xDFC4。
NVPROT_INIT的值为0xDE,NVOPT_INIT为0x7E。虽然这与应用程序代码(NVOPT = 0x3E重定向)的内容相冲突,但我们无法覆盖此寄存器,因为它们受到保护。但是,无论何时中断,它都会转到位于0xFFC4的向量表,进一步将其发送到0xDFC4。
这似乎是处理这个问题的好方法吗?