1. 程式人生 > >嵌入式ARM 中斷 IRQ程式碼編寫 基於S5pv210

嵌入式ARM 中斷 IRQ程式碼編寫 基於S5pv210

ARM共有7種模式

IRQ是異常模式的一種。

IRQ 處理流程:  1)保護現場;

                            2)中斷IRQ處理;

                             3)恢復現場;

首先:我們要知道幾個重要的暫存器LR , PC , CPSR , SPSR .

LR 儲存程式返回地址
PC 儲存程式執行地址
CPSR 程式狀態暫存器
SPSR 備份程式狀態暫存器

那麼我們程式都會做什麼呢?

1.保護現場。假設開啟ARM系統最先進入SVC模式,當發生IRQ後,會儲存SVC模式下的必要暫存器R0-R12,既然需要儲存資料,那麼就需要棧SP暫存器,當我們執行完中斷處理函式的時候需要返回,所以LR暫存器也需要儲存,

同時將SVC模式下的CPSR自動備份在IRQ模式下的SPSR中。

2.中斷處理。 當發生IRQ時,所要執行的中斷處理函式。

3.恢復現場。 當執行玩中斷處理函式,將儲存在SP中的資料恢復,並將1步中LR,給當前模式下的PC,將備份的SPSR,恢復到當前的CPSR中。

程式碼實現:

irq_handler:
      sub  lr,lr,#4 
      stmfd sp!,{r0-r12,lr}   //保護現場
      .weak do_irq
      bl do_irq               //跳轉到中斷處理函式
      ldmfd sp!,{r0-r12,pc}^  //恢復現場

在程式碼之前一定要完成好棧的設定,很多人可能不理解sub  lr,lr,#4 這句程式碼的意思!舉個簡單的例子:

這是一段彙編程式碼:


經過反彙編後:

位置0x0000_0048:

我們發下0x0000_0048位置上的數就是0x11111,這種方式叫做地址池,所以當前的位置減去立即數64, 

十六進位制就是0x0000_0040,當前PC的值是0X0000_0048-0X0000_0040。

PC=0X0000_0008,意思就是執行當前語句時,實際CPU已經執行第3條指令了,這就是指令流水。

然而我們要的返回的LR,是當前指令的下一句,所以-4,就是我們需要返回之後要執行的地址!

圖:

所以要存當前-4地址。