arm中斷異常處理:
arm系統中止品種:按中斷處理降序排列優先順序:重置、資料訪問中止、高速中斷請求、外部中斷請求、預取中止、令、軟體中斷。
arm體系中的異常中斷向量表:
0x0 復位
0x4 沒有定義指令
0x8 軟體中斷(swi)
0x0c 預取指中止
0x10 資料訪問中止
0x14 保留
0x18 外部中斷請求(irq)
0x1c 高速中斷請求(fiq)
各異常中斷相應著一定的處理器模式,不同處理器模式下有各自的物理暫存器。
假設異常中斷處理程式中使用它自己的物理暫存器之外的其它暫存器,異常中斷處理程式
必須儲存和恢復這些暫存器。
進入和退出異常中斷的過程:
進入中斷的過程:
<1>將當前程式狀態暫存器cpsr的內容儲存到將要執行的異常中斷相應的spsr暫存器中。
<2>設定當前程式狀態暫存器cpsr中對應的位。使處理器進入對應的執行模式;設定cpsr中的位。禁止irq中斷。當進入fiq模式時,禁止fiq中斷。
<3>將暫存器lr_mode設定成返回位址
<4>將程式計數器pc,設定成該異常中斷的中斷向量位址。從而跳轉到對應的異常中斷處理程式處執行。
上述的處理器對異常中斷的響應過程能夠用例如以下的偽**描寫敘述:
r14_= return_link
spsr_= cpsr
cpsr[4:0] = exception_mode_number
/*當執行於arm狀態時*/
cpsr[5] = 0
/*當對應的fiq異常中斷時,禁止新的fiq中斷*/
if == reset or fiq then
cpsr[6] = 1
/*禁止新的irq中斷*/
cpsr[7] = 1
pc = exception_vector_address
響應復位異常中斷:當處理器的復位引腳有效時。處理器中止當前指令。當處理器的復位引腳變成無效時,處理器開始執行以下的操作:
r14_svc = unpredictable value
spsr_svc = unpredictable value
/*進入特權模式*/
cpsr[4:0] = 0b10011
/*切換到arm狀態*/
cpsr[5] = 0
/*禁止新的fiq中斷*/
cpsr[6] = 1
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff0000
else
pc = 0x00000000
響應沒有定義指令異常中斷:處理器檢測到沒有定義指令異常時,處理器開始執行以下的操作:
r14_und = address_of_next_instruction_after_the_undefined_instruction
spsr_und = cpsr
/*進入沒有定義指令異常中斷模式*/
cpsr[4:0] = 0b11011
/*切換到arm狀態*/
cpsr[5] = 0
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff0004
else
pc = 0x00000004
響應swi異常中斷:處理器檢測到swi異常時,處理器開始執行以下的操作:
r14_svc = address_of_next_instruction_after_the_swi_instruction
spsr_svc = cpsr
/*進入特權模式*/
cpsr[4:0] = 0b10011
/*切換到arm狀態*/
cpsr[5] = 0
/*cpsr[6]不變*/
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff0008
else
pc = 0x00000008
響應預取指中止異常中斷:處理器檢測到預取指中止異常時,處理器開始執行以下的操作:
r14_abt = address_of_the_aborted_instruction + 4
spsr_abt = cpsr
/*進入預取指中止異常中斷模式*/
cpsr[4:0] = 0b10111
/*切換到arm狀態*/
cpsr[5] = 0
/*cpsr[6]不變*/
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff000c
else
pc = 0x0000000c
響應資料訪問中止異常中斷:處理器檢測到資料訪問中止異常時。處理器開始執行以下的操作:
r14_abt = address_of_the_aborted_instruction + 8
spsr_abt = cpsr
/*進入資料訪問中止異常中斷模式*/
cpsr[4:0] = 0b10111
/*切換到arm狀態*/
cpsr[5] = 0
/*cpsr[6]不變*/
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff0010
else
pc = 0x00000010
響應irq異常中斷:處理器檢測到irq異常時,處理器開始執行以下的操作:
r14_irq = address_of_next_instruction_to_be_executed + 4
spsr_irq = cpsr
/*進入irq異常中斷模式*/
cpsr[4:0] = 0b10010
/*切換到arm狀態*/
cpsr[5] = 0
/*cpsr[6]不變*/
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff0018
else
pc = 0x00000018
響應fiq異常中斷:處理器檢測到fiq異常時。處理器開始執行以下的操作:
r14_fiq = address_of_next_instruction_to_be_executed + 4
spsr_fiq = cpsr
/*進入fiq異常中斷模式*/
cpsr[4:0] = 0b10001
/*切換到arm狀態*/
cpsr[5] = 0
/*禁止新的fiq中斷*/
cpsr[6] = 1
/*禁止新的irq中斷*/
cpsr[7] = 1
if high_vectors_configured then
pc = 0xffff001c
else
pc = 0x0000001c
退出中斷的過程:從異常中斷處理程式中返回包含下面兩個基本操作
<1>將spsr_mode暫存器的內容拷貝到當前程式狀態暫存器cpsr中。以恢復被中斷的程式的處理器狀態。
<2>將lr_mode暫存器的內容拷貝到程式計數器pc中,以返回到發生異常中斷的指令的下一條指令處執行。
對不同的異常中斷。pc所指的位置是不同的,同一時候,返回位址也是不同的。
swi和沒有定義指令異常中斷處理程式的返回:
swi和沒有定義指令異常中斷是由當前執行的指令自身產生的。中斷發生時,pc指向當前指令後的第2條指令,處理器將pc-4儲存到異常模式下的lr_mode暫存器中,因此通過下面命令來實現返回:movs pc, lr 。當異常中斷處理程式中使用了資料棧時。能夠通過下面指令在進入中斷處理程式時儲存被中斷程式的執行現場,在退出中斷處理程式時恢復被中斷程式的執行現場:
stmfd sp!,
;... ...
ldmfd sp!, ^
irq和fiq異常中斷處理程式的返回:
irq和fiq異常中斷發生時,pc指向當前指令後的第3條指令。處理器將pc-4儲存到異常模式下的lr_mode暫存器中,這時,pc-4指向當前指令後的第2條指令。因此通過下面命令來實現返回:subs pc, lr,#4 。
當異常中斷處理程式中使用了資料棧時,能夠通過下面指令在進入中斷處理程式時儲存被中斷程式的執行現場,在退出中斷處理程式時恢復被中斷程式的執行現場:
subs lr, lr, #4
stmfd sp!,
;... ...
ldmfd sp!, ^
將異常中斷處理程式註冊到異常中斷向量表中:
<1>使用跳轉指令:在異常中斷相應的向量表中特定的位置放一條跳轉指令,直接跳轉到該異常中斷的處理程式。缺點:僅僅能在32m的空間內跳轉
<2>的資料讀出命令ldr:使用ldr至pc直付值。
筆記 ARM架構和ARM晶元(一)
arm經營模式 ip arm holdings 是全球領先的半導體智財權 ip 提供商,並因此在數字電子產品的開發中處於核心地位。arm 公司的總部位於英國劍橋,它擁有 1700 多名員工,在全球設立了多個辦事處,其中包括比利時 法國 印度 瑞典和美國的設計中心。arm的經營模式在於 其半導體智財權...
ARM核心架構
接下來我們可以討論arm核心架構,這裡我提一下,為啥討論這個arm,因為筆者最先接觸和知道這個,riscv熟悉了我後面會補上這個內容,毫不誇張的說,riscv可能也會像linux那樣成功引領乙個時代的發展。廢話不扯多了,前面繞了個大圈子再回來講了這個arm架構,主要目的是也是為了講這個作一些鋪墊,a...
關於ARM和MIPS的架構討論
問題 通常說 arm架構和 mips 架構,根本點究竟在哪一點?回答 mips 是第乙個 riscmicroprocessor,arm是 ciscmicroprocessor,這是早期的分別。問題 在 risc 和cisc 具體指什麼呢?能否深入簡出的說明一下?risc 精簡指令集 cisc 複雜指...