ARM中的異常和中斷
1、復位異常;在以ARM為核的單片機中,常把下列事件作為引起復位的原因。
• 上電復位:在上電后,復位使內(nèi)部達到預定的狀態(tài),特別是程序跳到初始入口;
•復位引腳上的復位脈沖:這是由外部其他控制信號引起的;
• 對系統(tǒng)電源檢測發(fā)現(xiàn)過壓或欠壓;
• 時鐘異常復位。
ARM處理器復位后,處理器硬件將進行以下操作:
• 強制進入管理模式;
• 強制進入ARM狀態(tài);
• 跳轉(zhuǎn)到絕對地址PC=0x00000000處執(zhí)行;
• 禁止IRQ中斷和FIQ中斷。
復位后,程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
上電復位后,進入管理模式,執(zhí)行操作系統(tǒng)程序,一般用做對系統(tǒng)初始化,例如開中斷等;然后切換到用戶模式,開始執(zhí)行正常的用戶程序。
切換到用戶模式可使用下列程序:
MRS R0,CPSR ;讀狀態(tài)寄存器
BIC R0,R0,#03;把末兩位清0
MSR CPRS_c,R0;把修改后的值加載給狀態(tài)寄存器,切換結(jié)束
......;用戶程序
2、未定義指令異常;由于ARM使用32位代碼,包含的信息量很大,可達2的31方(4G)。ARM指令集不能用盡所有代碼。當ARM處理器遇到無法譯碼的指令時就會發(fā)
生未定義指令異常。進入中斷處理程序。
ARM的未定義指令異常有以下兩種情況:
(1)遇到一條無法執(zhí)行的指令,此指令沒有定義;
(2)執(zhí)行一條對協(xié)處理器的操作指令,在正常情況下,協(xié)處理器應該應答,但協(xié)處理器沒有應答。
未定義異常中斷時,狀態(tài)寄存器中的F位不變。使用下列指令退出異常中斷,返回原程序 。
• 把下一條指令的地址拷貝給LR;
• 把程序狀態(tài)寄存器CPSR拷貝給SPSR_und;
• 強制進入未定義模式;
• 強制進入到ARM模式;
• 跳轉(zhuǎn)到絕對地址PC=0x00000004處執(zhí)行;
• 禁止IRQ中斷。
進入中斷后,程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | x | 0 | 1 | 1 | 0 | 1 | 1 |
MOVS PC,R14.
3、軟件中斷異常;是由指令SWI引起的。程序在執(zhí)行這一指令后,進入異常中斷。處理器響應中斷,硬件執(zhí)行如下的操作。
• 把下一條指令的地址拷貝給LR;
• 把程序狀態(tài)寄存器CPSR拷貝給SPSR_svc;
• 強制進入管理模式;
• 強制進入到ARM狀態(tài);
• 跳轉(zhuǎn)到絕對地址PC=0x00000008處執(zhí)行;
• 禁止IRQ中斷。
進入中斷后的程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | x | 0 | 1 | 0 | 0 | 1 | 1 |
軟件中斷處理程序完成后,使用下列指令返回到原中斷處:MOVS PC,R14.
4、預取指中止異常;由程序存儲器引起的中止異常叫做預取指中止異常;由數(shù)據(jù)存儲器引起的中止異常叫做數(shù)據(jù)中止異常。由于ARM的指令是3級流水線結(jié)構(gòu),讀
取指令周期是提前進行的,因此把讀取指令的過程一般稱預取指。如果在取得指令的同時程序存儲器發(fā)出中止信號,則ARM處理器把這一條指令標記位無效,然后等待執(zhí)
行。有兩種可能如下:
• 當執(zhí)行這條指令前程序發(fā)生跳轉(zhuǎn),則這條無效指令不引起異常中斷;
• 當執(zhí)行到這條指令時,處理器會發(fā)生預取指中止異常,引起中斷。
當記進入預取指異常中斷時,處理器硬件響應中斷,執(zhí)行以下的操作:
• 把中斷時PC的地址拷貝給LR;
• 把程序狀態(tài)寄存器CPSR拷貝給SPSR_abt;
• 強制進入中止異常模式;
• 強制進入到ARM狀態(tài);
• 跳轉(zhuǎn)到絕對地址PC=0x0000000C處執(zhí)行;
• 禁止IRQ中斷。
進入中斷后,程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | x | 0 | 1 | 0 | 1 | 1 | 1 |
預取指中止異常中斷返回時,應該執(zhí)行下列指令:SUBS PC,R14,#4.
5、數(shù)據(jù)中止異常;ARM處理器訪問數(shù)據(jù)存儲器時,在讀取數(shù)據(jù)的同時數(shù)據(jù)存儲器發(fā)出了中止信號,引起數(shù)據(jù)中止異常。
數(shù)據(jù)中止異常中斷服務(wù)程序返回時,使用下列指令:
SUBS PC,R14,#8
上述指令是返回到中斷時所執(zhí)行的指令,目的是再一次從數(shù)據(jù)存儲器中讀取數(shù)據(jù)。如果不再一次讀取數(shù)據(jù),則執(zhí)行下一條指令,此時使用下列指令返回:
SUBS PC,R14,#4
• 把中斷時的PC的地址拷貝給LR;
• 把程序狀態(tài)寄存器CPSR拷貝給SPSR_abt;
• 強制進入中止異常模式;
•強制進入到ARM狀態(tài);
• 跳轉(zhuǎn)到絕對地址PC=0x00000010處執(zhí)行;
• 禁止IRQ中斷。
進入中斷后,程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | x | 0 | 1 | 0 | 1 | 1 | 1 |
6、中斷請求(IRQ)異常;例如:定時器中斷、串行口通訊中斷、外部信號中斷和A/D處理中斷等。IRQ中斷是可屏蔽的。在狀態(tài)寄存器中的I位就是IRQ的屏蔽位
。當I=1時。則屏蔽IRQ中斷,當I=0時,則允許中斷。處理器復位后置I為1,關(guān)閉中斷。
當發(fā)生IRQ中斷時,處理器硬件響應中斷,執(zhí)行下列操作:
• 把中斷時的PC的地址值拷貝給LR;
• 把程序狀態(tài)寄存器CPSR拷貝給SPSR_irq;
• 強制進入IRQ異常模式;
•強制進入到ARM狀態(tài);
• 跳轉(zhuǎn)到絕對地址PC=0x00000018處執(zhí)行;
• 禁止IRQ中斷。
進入中斷后,程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | x | 0 | 1 | 0 | 0 | 1 | 0 |
完成中斷處理后,程序執(zhí)行下列返回原中斷處:SUBS PC.R14,#4.
7、快速中斷(FIQ)請求異常;FIQ快速中斷是可屏蔽的。在狀態(tài)寄存器中的F位就是FIQ的屏蔽位。當F=1時。則屏蔽FIQ中斷,當F=0時,則允許中斷。處理器復
位后置F為1,關(guān)閉中斷。
當發(fā)生IRQ中斷時,處理器硬件響應中斷,執(zhí)行下列操作:
• 把中斷時的PC的地址值拷貝給LR;
• 把程序狀態(tài)寄存器CPSR拷貝給SPSR_fiq;
• 強制進入FIQ異常模式;
•強制進入到ARM狀態(tài);
• 跳轉(zhuǎn)到絕對地址PC=0x0000001C處執(zhí)行;
• 禁止FIQ中斷。
進入中斷后,程序狀態(tài)寄存器如下:
...... | I | F | T | M4 | M3 | M2 | M1 | M0 |
1 | x | 0 | 1 | 0 | 0 | 0 | 1 |
完成中斷處理后,程序執(zhí)行下列返回原中斷處:SUBS PC.R14,#4
評論