ARM微處理器的編程模型之:異常中斷處理
3.4 異常中斷處理
異常或中斷是用戶程序中最基本的一種執(zhí)行流程和形態(tài)。這部分主要對(duì)ARM架構(gòu)下的異常中斷做詳細(xì)說(shuō)明。
ARM有7種類型的異常,按優(yōu)先級(jí)從高到低的排列如下:復(fù)位異常(Reset)、數(shù)據(jù)異常(Data Abort)、快速中斷異常(FIQ)、外部中斷異常(IRQ)、預(yù)取異常(Prefetch Abort)、軟件中斷(SWI)和未定義指令異常(Undefined instruction)。
注意 | 在ARM文檔中,使用術(shù)語(yǔ)Exception來(lái)描述異常。Exception主要是從處理器被動(dòng)接受異常的角度出發(fā),而Interrupt帶有向處理器主動(dòng)申請(qǐng)的色彩。在本書中,對(duì)“異常”和“中斷”不做嚴(yán)格區(qū)分,兩者都是指請(qǐng)求處理器打斷正常的程序執(zhí)行流程,進(jìn)入特定程序循環(huán)的一種機(jī)制。 |
3.4.1 異常種類
ARM體系結(jié)構(gòu)中,存在7種異常處理。當(dāng)異常發(fā)生時(shí),處理器會(huì)把PC設(shè)置為一個(gè)特定的存儲(chǔ)器地址。這一地址放在被稱為向量表(vector table)的特定地址范圍內(nèi)。向量表的入口是一些跳轉(zhuǎn)指令,跳轉(zhuǎn)到專門處理某個(gè)異常或中斷的子程序。
存儲(chǔ)器映射地址0x00000000是為向量表(一組32位字)保留的。在有些處理器中,向量表可以選擇定位在存儲(chǔ)空間的高地址(從偏移量0xffff0000開始)。一些嵌入式操作系統(tǒng),如Linux和Windows CE就要利用這一特性。
表3.4列出了ARM的7種異常。
表3.4 ARM的7種異常
異 常 類 型 | 處理器模式 | 執(zhí)行低地址 | 執(zhí)行高地址 |
復(fù)位異常(Reset) | 特權(quán)模式 | 0x00000000 | 0xFFFF0000 |
未定義指令異常(Undefined interrupt) | 未定義指令中止模式 | 0x00000004 | 0xFFFF0004 |
軟中斷異常(Software Abort) | 特權(quán)模式 | 0x00000008 | 0xFFFF0008 |
預(yù)取異常(Prefetch Abort) | 數(shù)據(jù)訪問中止模式 | 0x0000000C | 0xFFFF000C |
數(shù)據(jù)異常(Data Abort) | 數(shù)據(jù)訪問中止模式 | 0x00000010 | 0xFFFF0010 |
外部中斷請(qǐng)求IRQ | 外部中斷請(qǐng)求模式 | 0x00000018 | 0xFFFF0018 |
快速中斷請(qǐng)求FIQ | 快速中斷請(qǐng)求模式 | 0x0000001C | 0xFFFF001C |
異常處理向量表如圖3.5所示。
當(dāng)異常發(fā)生時(shí),分組寄存器r14和SPSR用于保存處理器狀態(tài),操作偽指令如下。
R14_exception_mode> = return link
SPSR_exception_mode> = CPSR
CPSR[4∶0] = exception mode number
CPSR[5] = 0 /*進(jìn)入ARM狀態(tài)*/
If exception_mode> = = reset or FIQ then
CPSR[6] = 1 /*屏蔽快速中斷FIQ*/
CPSR[7] = 1 /*屏蔽外部中斷IRQ*/
PC = exception vector address
圖3.5 異常處理向量表
異常返回時(shí),SPSR內(nèi)容恢復(fù)到CPSR,連接寄存器r14的內(nèi)容恢復(fù)到程序計(jì)數(shù)器PC。
1.復(fù)位異常
當(dāng)處理器的復(fù)位引腳有效時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況下。
· 系統(tǒng)上電。
· 系統(tǒng)復(fù)位。
當(dāng)復(fù)位異常時(shí),系統(tǒng)執(zhí)行下列偽操作。
R14_svc = UNPREDICTABLE value
SPSR_svc = UNPREDICTABLE value
CPSR[4∶0] = 0b10011 /*進(jìn)入特權(quán)模式*/
CPSR[5] = 0 /*處理器進(jìn)入ARM狀態(tài)*/
CPSR[6] = 1 /*禁止快速中斷*/
CPSR[7] = 1 /*禁止外設(shè)中斷*/
If high vectors configured then
PC = 0xffff0000
Else
PC = 0x00000000
評(píng)論