2013-11-09 125 views
2

我正在閱讀有關如何在ARM中處理中斷以及何時發生任何硬件中斷來知道執行的地址0x00000018處的指令,這通常是跳轉到受尊重的中斷處理程序,但可能會有很多中斷處理程序的不同模塊。多箇中斷處理程序共享地址如何多箇中斷處理程序共享地址0x00000018

然後,如何將這些不同的處理程序映射到地址0x00000018?

此外,arm cpu如何知道中斷提升是irq或fiq,誰決定它以及哪個設備產生中斷,如何映射到該中斷的受尊重處理程序。

任何機構都可以指向一個簡單的中斷處理程序代碼,我可以看到中斷處理程序的所有功能嗎?

回答

5

ARM CPU通常有兩個引腳(FIQ和IRQ),它們在產生中斷時由設備聲明。發生這種情況時,CPU只需切換模式並跳轉到地址0x00000018

但是,由於通常有比中斷引腳數量多的器件,通常會有一箇中斷控制器在CPU和器件之間。您可以將其視爲將更多中斷連接到CPU的集線器。中斷控制器可以配置爲爲其接收的某些類型的中斷聲明FIQ。

中斷處理程序通常詢問中斷控制器哪個引腳引起中斷,然後調用相應的處理程序。

這是一個精簡版,沒有錯誤檢查我在一個小項目中使用的中斷處理程序代碼。

#include <types.h> 
#include <irq.h> 

static void (*irq_handlers[32])(void); 

void __attribute__((interrupt)) handle_irq() { 
    int irq = irq_hw_get_and_ack(); 

    if (irq_handlers[irq]) { 
     irq_handlers[irq](); 
    } 
} 

void setup_irq() { 
    irq_hw_init(); 
    cpu_enable_irq(); 
} 

void irq_request(int irq, void (*func)(void)) { 
    irq_handlers[irq] = func; 
    irq_hw_enable(irq); 
} 

void irq_unrequest(int irq) { 
    irq_hw_disable(irq); 
    irq_handlers[irq] = NULL; 
} 
+0

非常感謝@ tangrs.I有疑問,我問過dwelch,我想只有一個,其在地址0x0000018映射中斷處理程序和該處理程序是負責具體到模塊採取其他處理的照顧?還有,這將是很好,你可以建議我一些代碼爲「中斷處理程序通常詢問中斷控制器哪個引腳引起中斷,然後調用適當的處理程序」,我的意思是如何中斷處理程序問中斷控制器哪個引腳引起中斷? –

+0

它取決於您使用的確切的SoC和配置,但通常涉及讀取某種內存映射的IO寄存器。 – tangrs

+0

罰款糾纏不清,請問你是否確認我的這種理解,即只有一箇中斷處理程序映射到地址0x0000018,並且此處理程序負責照顧模塊特定的其他處理程序? –

2

對於只有一箇中斷的處理器來說,這是相當典型的。 x86就像這樣一段時間,也許還是這樣。手臂傳統上有兩個,但更新的核心有許多現在32,256等。

如果你有一個共享中斷線,作爲纏結提到你通常有一些東西在處理器外,在手臂的情況下,在芯片,但在手臂核心本身之外。有許多中斷輸入和輸出或輸出到處理器一個或幾個中斷。當處理器中斷髮生時,您會檢查處理器/內核之外的這個邏輯/硬件,看看是誰造成的,然後你就去了。

嵌套的中斷控制器也不是非典型的,比如說帶有一個輸出的8個輸入。並且對於這8個輸入中的一些或每一個輸入另一個8對1中斷控制器。那麼軟件就需要簡單地遵循路徑。檢查一級中斷控制器以查看哪一個中斷控制器觸發了中斷,然後從那裏知道需要與之通話的下一層控制器,等等,直到你隔離單箇中斷爲止。

也知道並理解,對於這些共享中斷系統,基本上從程序開始停止並調用中斷向量開始,「同時」發生多箇中斷是非常可能的,並且您執行中斷啓動的東西,並最終讀取中斷狀態寄存器,不止一個可以進來。你需要決定如何處理,並根據系統/邏輯,如果你從其中一個返回,其他人被聲稱可能會讓你回到中斷處理程序,這樣,只有一個掛起可以處理。其他邏輯可能會要求您在返回之前處理所有掛起。

由於手臂犯規一定要控制哪些綁中斷或FIQ線就可以得到各種來自不同廠商的解決方案,以中斷系統如何作用於特定的ARM芯片。

+0

謝謝@ dwelch,當處理器中斷髮生時,你檢查與處理器/核心之外的這個邏輯/硬件,看看是誰造成它。你是指處理器檢查與中斷控制器誰造成它?只是一個映射到地址0x0000018的中斷處理程序,並且此處理程序負責處理特定於模塊的其他處理程序。 –

+0

我只是找到了一箇中斷處理程序代碼https://github.com/xinu-os/xinu/blob/master/system/arch/arm/irq_handler.S,我想在行號69,有跳轉到特定模塊中斷處理程序code.Is這種理解很好? –

+0

是的,軟件檢查中斷控制器和/或外設(最終檢查可能產生中斷的外設)。 –

相關問題