自己動手做OS之Raspberry Pi interrupt example 筆記

Happy Chinese New Year!!  希望我年假,有更多時間好好學習作業系統...T_T
這是個學習筆記,還未整理好,看起來很亂,但是我會盡量把該注意的重點寫下。


Interrupt example Raspberry Pi source code:

這範例中,我們使用timer 產生IRQ,執行時,可以看到,每隔一小段時間,就會印出IRQ_handler,在IRQ_handler()中,先關掉了IRQ再印出IRQ_handler,接著啟動IRQ,這是一個簡單的範例,但不是有效率的處理IRQ方式,以後我們來討論巢式中斷。

當IRQ發生時,硬體會自動跳到0x18的位址上去執行程式,但我們系統是掛在0x10000上,跳到0x18時並沒有東西,這時有幾個解決方式,1是利用mmu把0x18 mapping 至 0x10018上,或是設定CP15,跳轉到正確的中斷處理向量表上。

ARM的官方網站有很好說明,值得一看。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacbhjjj.html

以下是節錄 陳鐘誠老師的網站(http://sp1.wikidot.com/arm)
-------------------------------------------------------------------------------------------------------------------------
ARM 的可存取暫存器為 R0-R15,其中 R13為堆疊指標 SP (Stack Pointer),R14 為連結暫存器 LR (Link Register),R15 為程式計數器 PC (Program Counter)。
ARM的狀態暫存器有 CPSR (Current Processor Status Register) 與 SPSR (Saved Processor Status Register)。其中 SPSR 乃是在中斷時用來自動儲存CPSR的暫存器。
在 ARM 處理器當中,共有七種模式,包含 1. 使用者模式 (User Mode) 2. 系統模式 (System Mode)、3. 快速中斷模式 (Fast Interrupt Request:FIQ)、4. 特權呼叫模式(Superviser Call:SVC)、5. 中止模式(Abort:ABT)、6. 中斷請求模式 (Interrupt Request:IRQ)、7. 未定義模式(Undefine:Undef) 等。 除了使用者模式外,其它六種模式稱特權模式,而除了使用者模式跟系統模試,其它五種稱為異常模式。

不同的模式會有獨立的堆疊暫存器 SP (R13) 與連結暫存器 LR (R14)-返回地址,這使得 ARM 的模式切換更快,因為不需要以額外的指令儲存這些暫存器。圖二顯示了 ARM 當中的所有暫存器,在每個模式當中,R0-R15 及 CPSR 都是可以存取的,但在後五種模式中,會使用獨立的 R13, R14、以及 SPSR,取代使用者模式的暫存器[1]。 
--------------------------------------------------------------------------------------------------------------------------

R15(PC)當前程式執行的位置
FIQ比IRQ模式多了R8_fiq~R12fiq私有暫存器,可以提高中斷速度。 (原因:.....待補)

中斷發生時要做的事:

  • 保存CPSR到SPSR
•要保存暫存器狀態( SP和LR (除FIQ模式) )
•CPU模式切換應於該異常模式
•設置中註冊的量表來PC的地址




參考資料:
[1] http://sp1.wikidot.com/arm 陳鐘誠老師的網站。

ARM System Developer's Guide
一步步写嵌入式操作系统

留言

這個網誌中的熱門文章

C語言,大數運算,階層筆記

Raspberry Pi (ARMv6)上自幹一個微小作業系統

Linux VLAN 筆記