2014-01-15 148 views
2

我的引导程序需要使用中断向量,但是这样是我的应用程序。高矢量从地址0x08开始,低矢量从地址0x18开始。你如何处理bootloader中的中断?

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

+2

请问你的引导程序确实需要中断或者是,你是如何发生的实现呢?在解决副作用之前查看原因。 –

+0

现在,它不,我只是删除了引导加载程序代码中的任何中断。 – Ammar

回答

3

我已经在我的工作面临类似的问题。

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

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

如果你真的需要中断,我认为你需要有一些巧妙的方式在运行时告诉应用程序是否正在运行的引导加载程序正在运行,所以你可以重定向到正确的地方。为了简单起见,您希望能够在不影响STATUS寄存器或RAM的任何其他部分的情况下对此进行测试。

我建议保留一个特殊的RAM字节,也许是存取银行的最高字节。 XC8让你绝对位置的变量,所以(如果它不是越野车),你可以这样做:

unsigned char inBootloader @ 0x5F; 

遗憾的是,此引导加载的每个应用程序必须意识到这一公约,并在定义这个相同的变量同一地点。或者他们应该至少避免写入内存中的该位置,并让引导加载程序代码保持变量的状态。

在你的中断向量

然后在0x08的和为0x18把一些简单的逻辑来重定向到正确的地方:

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

我只会避免在引导程序中使用中断,但我明白你的答案,如果我必须采取其他路线。 – Ammar

+2

请注意,STM32上的向量表重定位是所有ARM Cortex-M3/4核心器件的一项功能,不是STM32。 – Clifford

+0

对,Clifford,我应该在我的答案中说了Cortex-M3。 –