你如何处理引导程序中的中断?

时间:2014-01-15 16:17:51

标签: embedded microcontroller pic bootloader microchip

我的bootloader需要使用中断向量,但我的应用程序也是如此。高向量从地址0x08开始,低向量从地址0x18开始。

如何共享中断向量,以便在引导加载程序和下载的应用程序中有一个单独的中断函数?我使用的是PIC18F87J11和MPLAB XC8编译器。

1 个答案:

答案 0 :(得分:3)

我的工作遇到了类似的问题。

在STM32上,您可以在运行时更改向量表的位置,这样很棒。

在PIC18上,我只是选择不在引导加载程序中使用中断,因此0x08和0x18处的中断向量可以使用GOTO指令无条件地重定向到应用程序部分中的等效位置。您确定需要在引导加载程序中使用中断吗?

如果你真的需要中断,我认为你需要有一些聪明的方法在运行时告诉应用程序是否正在运行或者引导程序是否正在运行,这样你就可以重定向到正确的位置。为简单起见,您希望能够在不影响STATUS寄存器或RAM的任何其他部分的情况下进行测试。

我建议保留一个特殊字节的RAM,也许是访问库的顶部字节。 XC8允许您绝对定位变量,因此(如果它没有错误)您可以这样做:

unsigned char inBootloader @ 0x5F;

不幸的是,此引导加载程序加载的每个应用程序都必须知道此约定并在同一位置定义此相同的变量。或者他们至少应该避免写入内存中的那个位置,让bootloader代码保持变量的状态。

然后在0x08和0x18的中断向量中放入一些简单的逻辑重定向到正确的位置:

btfss inBootloader, 0
goto 0x4008   ; go to application high vector
goto bootloaderHighIsr