異常返回
1、 從SWI和未定義 返回
內核在計算LR(返回地址)時沒有更新PC 因此 MOVS PC ,LR
當前lr=pc-4 (mov pc pc-4)=movs pc.lr
2、 從FIQ IRQ和預取 返回 SUBSPC, LR ,#4
內核計算LR時更新了PC movs pc, pc-8 =movs pc , pc-4-4 =movs pc,lr-4
3、從數據異常返回(有硬件/軟件產生的 爲保證數據完整性) SUBS PC, LR,#8
PC movs pc, pc-12 =movs pc , pc-4-8 =movs pc, lr-8
中斷處理程序
從向量表中直接跳轉到中斷
HandleIRQ: 跳轉到中斷
stmfd sp!, {r0-r12, lr} 保護現場
bl do_irq 跳過異常處理函數
ldmfd sp!, {r0-r12, pc}^ 回覆現場
subs pc, lr, #4 計算返回地址
中斷編程流程
• 啓動代碼
• 建立異常向量表
• 關閉看門過
• 初始化系統時鐘
• Main函數入口
• 異常中斷入口
HandleIRQ:
stmfd sp!, {r0-r12, lr}
bl do_irq
ldmfd sp!, {r0-r12, pc}^
subs pc, lr, #4