嵌入式ARM 中斷 IRQ程式碼編寫 基於S5pv210
阿新 • • 發佈:2019-02-20
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地址。