我对引导程序代码中的矢量表(中断表)有问题,并且我的应用程序代码无法访问它们。嗯,主要的问题是is的地址在Bootloader和应用程序代码中是不同的。因此,我的应用程序无法启动。有什么建议可以让我的应用程序代码从我的Vector表中找到正确的ISR例程地址?
我使用的是HCS08和Code warrior。它是一个U盘引导程序,由程序员加载到FLASH中,并通过U盘进一步加载S19文件。所以,我的闪存里有两个程序。
发布于 2010-11-21 03:36:06
HCS08支持向量重定向,但不支持多个向量表(参见我答案末尾的引号)。This thread提供了一个有趣的讨论。据我所知,在HCS08的闪存中没有直接使用多个矢量表的方法。这使得您只有几个选择:
RAM向量表
您可以强制中断向量在RAM中查找它们的地址。要做到这一点,您将使用主向量表位置。每个向量将被设置为跳转到RAM地址的函数。RAM地址将是您的中断代码的位置。
使用此策略,您的应用程序和bootloader代码可以指定不同的中断函数。将RAM用于向量可能会有风险。
引导加载程序中没有中断
另一种选择是在没有中断的情况下实现引导加载程序。然后,您可以保护bootloader内存,重定向向量位置,并让您的应用程序访问向量表。
将矢量重新定位到未受保护的闪存
有关此技术的讨论,请参阅AN2140。
以下内容来自datasheet for the MC9S08EL/SL
4.5.8向量重定向
任何闪存受到块保护时,复位和中断向量都将受到保护。向量重定向允许用户修改中断向量信息,而无需取消对引导加载程序和重置向量空间的保护。通过将位于地址0xFFBF的NVOPT寄存器中的FNORED位编程为0,可使能矢量重定向。要进行重定向,必须通过对位于地址0xFFBD的NVPROT寄存器进行编程,对闪存的至少一部分进行块保护。重定向所有中断向量(存储器位置0xFFC0-0xFFFD),但不重定向复位向量(0xFFFE:0xFFFF)。
例如,如果1024字节的闪存受到保护,则受保护的地址区域为0xFC00至0xFFFF。中断向量(0xFFC0-0xFFFD)被重定向至位置0xFBC0-0xFBFD。如果使能矢量重定向并发生中断,则矢量将使用位置0xFBE0:0xFBE1中的值,而不是位置0xFFE0:0xFFE1中的值。这允许用户使用包括新中断向量值的新程序代码对闪存的未受保护部分进行重新编程,同时保持包括默认向量位置的受保护区域不变。
另请参阅此application note (AN2295),了解如何为该系列micros实现串行引导加载程序。
发布于 2010-11-21 03:01:20
我不是HCS08专家,但通常会有重新映射或重定向向量的机制,以便您可以加载软件和使用新的中断向量,而不会干扰您的引导加载程序。我不知道您使用的是哪种芯片,但请尝试在您的芯片参考手册中搜索"Vector Redirection“。
发布于 2010-11-23 04:04:57
我在这里找到了似乎是正确的,但它不起作用:
***__Bootloader Vector.c:*******
用于具有不同地址的其他向量的ISR(AS1_InterruptTx) { asm { pshh ldhx #$DFD4 pshx jmp DO_ISR }} .......Similar .
..................................................................
void DO_ISR() { asm { pulx ldhx,x
cphx #$FFFF beq DI1 jsr ,x DI1: pulh rti }}
************In应用程序Vector.c__******************
我改变了:
ISR(AS1_InterruptTx)
{
.
.
}
至:
无效AS1_InterruptTx() {
.
.
}
除此之外,我将向量保存在Bootloader中的默认位置,即0xFFC4,并将应用程序代码中的向量表重定向到0xDFC4。
NVPROT_INIT值为0xDE,NVOPT_INIT值为0x7E。虽然这与应用程序代码(重定向的NVOPT= 0x3E )的设置冲突,但我们不能覆盖此寄存器,因为它们是受保护的。但是,每当中断到来时,它都会转到位于0xFFC4的矢量表,后者会进一步将其发送到0xDFC4。
这看起来是解决这个问题的好方法吗?
https://stackoverflow.com/questions/4234032
复制相似问题