2013-10-18 37 views
1

我有這樣或多或少的理論問題,而我所有的IDE重新安裝...如果爲單箇中斷創建多個ISR,會發生什麼情況?

所以我MSP430s工作主要是,我很好奇,如果我創建一個單一的中斷向量多的ISR會發生什麼。

比方說,我在看端口2(引腳輸入),用於按下按鈕。

#pragma vector = PORT2_VECTOR 
__interrupt void Port2_ISR_1 (void) 
{ 
    if (BUTTON1_DOWN) 
    { 
     g_temp = 1234; 
    } 
} 

現在,如果我再補充一點對應於同一PORT2_VECTOR另外一個地方?

#pragma vector = PORT2_VECTOR 
__interrupt void Port2_ISR_2 (void) 
{ 
    if (BUTTON2_DOWN) 
    { 
     g_temp = 2345; 
    } 
} 

它們對應於被按下的不同按鈕,但是對於相同的中斷向量。當編譯器編譯時,如果它們屬於同一個向量,它是否將服務例程放在一起?當PORT2中斷關閉時,微控制器是否連續執行?

+0

這是依賴於實現,但一定要遇到一些討厭的未定義的行爲。 – ouah

+0

那麼可以說我寫了一個使用中斷的SPI庫。我建立它,併發送.dlb(或w/e)給我的朋友。我的朋友使用我的庫,但想要實現巧合使用相同向量的中斷。然後會發生什麼?我會認爲許多庫使用中斷,這個問題是如何避免的? – Mewa

+3

IIRC,ISR表由鏈接器構建,因此鏈接階段會導致_duplicate symbol error_。你試過了嗎? – rodrigo

回答

2

如上所述,這是與實施有關的;然而,到目前爲止,我從來沒有遇到過支持多種中斷服務程序的微控制器。

通過最常見的微控制器系列實現的標準行爲是:一個向量=一個服務程序。

此外,其他用戶的評論中指出,您的代碼將同時鏈接觸發一個重複的符號錯誤。

1

你可以寫出儘可能多的ISR,因爲你有空間。然而,中斷向量表(IVT)是中斷和ISR地址之間的一一對應關係。因此,當你的程序加載時,只有一個地址可以寫入IVT條目中,用於任何特定的中斷。沒有處理器或中斷控制器允許每個中斷有多個ISR地址。

處理器中斷向量表是由你和你的程序鏈接C運行時程序(「信息crt0」)初始化。 Here是AVR微處理器的示例crt0。如您所見,此crt0實現使用全局符號將值分配給中斷向量表條目。這意味着鏈接器應該檢測多個ISR符號。

一些信息crt0實現,包括一些用於MSP430,從一個符號的位置複製IVT到IVT的硬件位置,0xFFE0到0xFFFE。對於這種類型的crt0,編譯器需要檢測多個ISR,因爲它構建了IVT併爲crt0設置了符號。

哪個CRT0您正在使用依賴於編譯器配置,除非通過在GCC_EXEC_PREFIX環境變量指定自定義目錄名稱覆蓋它,例如,在海灣合作委員會。

相關問題