Application和Bootloader代码中的向量表问题

时间:2010-11-20 17:32:23

标签: c bootloader interrupt

我遇到了矢量表(中断表)的问题,它们位于Bootloader代码中,无法通过我的应用程序代码访问。 那么,主要问题是在Bootloader和Application代码中ISR的地址是不同的。所以,我的应用程序无法启动。 有关如何使我的应用程序代码从我的Vector表中找到正确的ISR例程地址的任何建议?

我正在使用HCS08和Code warrior。 它是一个USB Bootloader,由程序员加载到FLASH中,并通过USB进一步加载S19文件。所以,我的FLASH上有两个程序。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

    Bootloader中没有中断

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

    将矢量重新定位到未受保护的闪存

    有关此技术的讨论,请参阅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。

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