2014-01-15 190 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。 –