我想估計一個ARM
cortex A9
單核處理IRQ所需的操作碼數量。Linux內核需要多少條指令才能處理arm arm cortex A9上的中斷?
假設我使用Linux內核3.4
,需要多少操作碼才能調用irq
並執行irq_handler
?
我想估計一個ARM
cortex A9
單核處理IRQ所需的操作碼數量。Linux內核需要多少條指令才能處理arm arm cortex A9上的中斷?
假設我使用Linux內核3.4
,需要多少操作碼才能調用irq
並執行irq_handler
?
你的問題是關於如何計算Linux的interrupt latency。至少你可能會對你的中斷開始之前需要多長時間感興趣。這裏我們將忽略irqs
的這個方面。
一個簡單的方法是切換GPIO
並使用示波器測量中斷。您甚至可以多次切換GPIO
以查看不同階段的時間。這個Window CE link顯示了一個衡量延遲的例子。某些中斷控制器(如IMX)具有I/O複用模式,其中一箇中斷號將升高/降低特定的I/O線。或者,您可以添加代碼來切換行(請參閱下面的例程)。
主要中斷處理源在entry-armv.S。有爲您使用的中斷控制器定義的宏,這些宏取決於.config
文件。例如,存在先佔式中斷,多中斷控制器,SMP等。向量在入口部件的底部被定義爲S。一般的要點是檢查當前的操作模式,然後採取__irq_usr
或__irq_svc
。這些例程有一個不同的預存儲狀態,但它們最終都會調用irq_handler
宏。 _irq_usr
有關於cmpxchg
的內容,但是如果您在您的.config
中指定了ARM皮質,則不適用。主要區別在於IRQ在用戶模式下發生後可能的上下文切換。你的機器定義了mach/entry-macro.S
這是彙編器宏來訪問中斷控制器並獲得一箇中斷號。然後跳轉到頂層內核目錄中的通用irq
handling code。
所以第二種方法是檢查代碼並直接計算它。如果您查看源代碼,編譯您的內核,然後在vmlinux圖像上執行objdump --disassemble
並查找這些符號,這可能會更容易。您將看到擴展的irq_handler
宏,它最終應該跳轉到您的IRQ代碼。
正如您從源頭上看到的那樣,還有TRACE_IRQFLAGS
。您可以檢查是否可以在您使用的Cortex A9上使用make menuconfig
(和/TRACE_IRQFLAGS
)。我不知道它是否可用。
有變體如,
測量範圍將顯示抖動在IRQ
服務。檢查說明通常會顯示IRQ
可能永遠不會被服務;例如,如果較高優先級的中斷不斷搶先/阻止IRQ
。可能你需要同時做到這一點,以完全優化一個艱難的最後期限。
通常你不在乎整個IRQ
需要多長時間,而是在IRQ
行被觸發和寫入/讀取一些外設寄存器之間的時間。例如,FIFO
可能具有有限的深度,如果發生和讀取IRQ之間的延遲的FIFO
寄存器大於FIFO_SIZE X BPS,那麼你必須與FIFO
四溢的問題。
的FIQ
基礎結構是快了很多,但你可以使用內核設施遠不如!
編輯:的Cortex A9 technical reference在附錄B.大多數ARM指令指令計數是在大多數架構一個週期內,除了內存加載/存儲,倍數和分支機構。按照上面的第3段和第4段,找到完整的指令路徑來處理您的配置的Linux中斷,只需將其添加到;對於的估計值(正如原始問題所要求的那樣),您可以對指令進行計數,因爲它們通常是單個週期。
雖然你可以通過源代碼的檢查計算內核週期的理論最小數,實際發生的數量遠不如某些由於緩存,內存和存儲控制器的性能,其他的什麼核心是在做效果時間和各種其他因素,這取決於所討論的ARM處理器的微架構。
我懷疑你會過得更好的測量系統的實際中斷延遲性能,無論是使用數字「範圍或性能計數器。
當然,對於硬實時的應用程序,你需要知道最壞的情況下中斷延遲 - 其中包括所有這些因素的最壞情況。
爲什麼操作碼?你是指指令還是時鐘週期? –
你爲什麼問?不是允許的中斷頻率或延遲(從中斷硬件衝動到內核中的處理程序啓動還是應用程序中的信號處理程序)更相關? –
@BillPringlemeir http://stackoverflow.com/questions/14698229/what-is-the-irq-latency-due-to-the-operating-system請填寫免費主題添加到這個問題,並回答它 – 0x90