1. 程式人生 > >處理器之中斷(二)

處理器之中斷(二)

效率 完全 問題: inux 通信 watermark itl 觸發 linux

我們今天來看看中斷,什麽是中斷呢?中斷是一種處理器與外設進行通信的機制,它用於“通知”處理器外部有“重要事件”發生。在一般情況下,中斷需要被處理器響應。下來我們來看看中斷服務程序(ISR):1、從外設中讀取中斷狀態寄存器的值,以便了解中斷類型;2、根據中斷類型具體設計處理邏輯;3、清除外設狀態寄存器中的中斷標識位;4、清除處理器中的中斷標識位。具體過程如下

技術分享圖片

我們看到先是外部設備觸發中斷,然後處理器響應,進行當前上下文信息的保存。再通過獲得外部設備中斷的類型,當外部設備的類型傳進來之後處理器再進行相應的處理。處理完之後再清除外部中斷的標誌位,進而清除中斷的標誌位,最後再次獲得之前保存的上下文信息進行繼續執行。

那麽軟件工程師眼中的中斷服務程序是怎樣的呢?1、不能有返回值,不能有參數傳遞;2、必須小而高效,避免浮點運算。下面的程序就是不允許的。

技術分享圖片

下來來看看中斷的意義。1、應用程序不必關心中斷的發生與處理;2、中斷服務程序不必關心應用程序的執行狀態;3、中斷是“上層應用”與“底層代碼”的“分隔邊界”。如下

技術分享圖片

中斷分為兩類:硬中斷和軟中斷。硬中斷是指通過處理器中斷信號線產生的中斷;軟中斷是指通過非法指令或特殊指令觸發的中斷。中斷是分優先級的,當多個中斷同時出現時,處理器先響應高優先級的中斷。當低優先級中斷的 ISR 執行時,可以被高優先級中斷再次打斷,ISR 比 App Code 擁有更高的執行優先級。那麽中斷的一個應用就是程序的斷點,斷點是指調試工具用於暫停代碼執行的指令位置,斷點的實現原理為處理器的中斷支持。軟件斷點是指利用非法指令異常產生中斷實現,而硬件中斷是指利用中斷寄存器的特性產生中斷實現。

程序斷點的實現原理:1、獲取原程序指定行對應的代碼地址;2、把代碼地址中的指令替換為中斷觸發指令;3、在中斷服務程序中將控制權交給調試程序;4、調試程序讀寫原程序上下文信息;5、調試程序將代碼地址中的指令還原;6、原程序從斷點處繼續向下執行。過程如下

技術分享圖片

下來我們來看個工程產品的案例,是要做一款可以進行斷點調試的工具,但是不能夠影響其實時性。其提出的背景是嵌入式實時系統對時序的要求比較嚴格,各個線程的執行有相對嚴格的時間要求。痛點就在於斷點調試在嵌入式實時系統中不適用。那麽最常規的解決方案是日誌調試法,它的原理是:1、在代碼中的“關鍵位置”添加打印語句;2、打印語句盡可能詳細的打印上下文信息(函數名,局部變量等);3、當系統出現問題時,查看日誌文件,分析問題。

但是日誌調試法也存在有一定的問題:1、不易維護,打印語句分散於產品代碼的各個角落;2、影響效率,過多的打印語句意味著過多的 IO 操作最終會影響產品的整體效率執行;3、分析困難,當日誌輸出量非常多的時候,很難精確定位問題,另一個就是可能只有添加打印語句的工程師才能看得懂日誌輸出的信息。

那麽這時唐長老就產生了一個瘋狂的想法:同時結合日誌調試法和斷點調試法的優點,使得實時系統調試時,能夠任意查看指定代碼行上下文的信息;並且不增加打印語句,不暫停執行。解決方案便是:1、獲取原程序指定行對應的代碼地址;2、把代碼地址中的指令替換為中斷觸發指令;3、在中斷服務程序中抓取全局信息和棧信息;4、抓取的信息發送回調試程序解析並輸出。實踐的結果便是有了 MProbe 這一款產品,它的特點:1、基於 ARM + Linux 平臺完整實現;2、通過中斷原理成功獲取上下文信息;3、完全不影響程序的執行時序;4、產品關鍵技術點有中斷、ISR、編譯信息、GDB、GUI、Socket 以及多線程。

處理器之中斷(二)