Cortex A8異常處理

2021-09-14 04:44:32 字數 1852 閱讀 4094

異常發生時,處理器會將pc設定為乙個特定的儲存器位址,這些特定的儲存器位址稱為異常向量。所有的異常向量被集中放在程式儲存器的乙個連續位址空間中,稱為異常向量表。每個異常向量佔4位元組,異常向量處是一些跳轉指令,跳轉到相應的異常處理函式。

通常儲存器位址對映位址0x00000000是為異常向量表保留的。但某些嵌入式系統配置使能的時候,低端的異常向量可以選擇對映到特定的高階位址0xffff0000。cortex-a8處理器支援通過cp15的c12暫存器將異常向量的首位址設定在任意位置。

每一種異常都會導致核心進入一種特定的模式。此外,也可以通過程式設計改變cpsr,進入arm處理器模式。使用者模式和系統模式是僅有的不可通過異常進入的倆種模式,要進入這倆種模式,必須通過程式設計改變cpsr。

通常異常響應的過程大致分為以下幾個步驟:

尋找中斷入口,根據不同的中斷源產生的中斷,查詢不同的入口位址;

執行中斷處理程式;

中斷返回,執行完中斷指令後,就從中斷處返回到主程式繼續執行。

在arm處理器中,當異常發生時,除了復位異常會立即中止當前指令的執行,其他的異常都是在處理器完成當前指令後再執行異常處理程式。arm處理器對異常的響應過程如下:

進入與特定的異常響應的執行模式。

將cpsr暫存器的值儲存到將要執行的異常中斷對應的spsr_mode中,以實現對處理器當前狀態、中斷遮蔽和各標誌位的保護。

將引起異常指令的下一條指令的位址存入相應的鏈結暫存器lr(r14_mode),以便程式在異常處理結束能正確返回到原來的程式繼續向下執行。

設定cpsr暫存器的低5位,使處理器進入相應的工作模式。設定i=1,以禁止irq(外部)中斷;如果進入復位異常、快速中斷異常,還要設定f=1禁止fiq中斷。

根據異常型別,將向量位址強制複製給程式計數器pc,以便執行相應的異常處理程式。例如,復位異常發生的時候,儲存器位址對映位址0x00000000是為異常向量保留的情況下,則pc=0x00000000;如果異常向量表選擇對映到特定的高階位址0xffff0000處,則pc=0xffff0000。

每種異常模式對應的倆個暫存器r13_mode、r14_mode,分別存放堆疊指標和斷點的位址。

復位異常發生後,系統自動從0x00000000開始重新執行程式,因此復位異常處理程式執行完後無須返回。其他的異常處理完成後必須返回程式的端點處繼續執行。

恢復原來儲存的使用者暫存器。

將spsr_mode暫存器的值複製到cpsr中,以恢復被中段的程式工作狀態。

根據異常型別將pc暫存器恢復成斷點位址,以執行原來被中斷打斷的程式。

清除cpsr中的中斷遮蔽標誌位i和f,開放外部中斷和快速中斷。

程式狀態字和斷點位址的恢復必須同時進行。

當返回位址儲存在當前模式的r14_mode中時,從不同的模式返回,所用的指令有所不同:

(1)fiq(快速中斷)和irq(外部中斷)的返回指令

sub pc, r14_fiq, #4 sub pc, r14_irq, #4

fiq和irq必須返回前一條指令(r14_mode中存的是被打斷的下一條),以便執行因為異常而未執行的指令,所以該返回指令將暫存器r14的值減4後複製到程式計數器pc中,從而實現從異常處理程式中返回,同時將spsr_fiq/spsr_irq暫存器的值複製到當前程式狀態字暫存器cpsr中。

(2)abort(資料訪問終止)的返回指令

sub pc, r14_abt, #4;指令預取中止返回 sub pc, r14_abt, #8;資料中止返回

(3)swi(軟體中斷異常)/未定義指令的返回值指令

Cortex A8核心中新增RTC驅動和設定時間

最近,移植qt程式到arm 九鼎科技x210 上,發現獲取到的rtc時間,時間相差太大。想到可能是rtc驅動沒有新增或者驅動有些沒有配置完整。於是到核心原始碼目錄下檢視配置 make menuconfig 發現九鼎科技已經把rtc驅動已經配置好,可以在arm開發板根檔案系統輸入ls proc dri...

php筆記(8) 異常處理

try catch exception e exception是所有異常處理的基類。exception具有幾個基本屬性與方法,其中包括了 屬性說明 message 異常訊息內容 code 異常 file 丟擲異常的檔名 line 丟擲異常在該檔案的行數 常用方法 方法說明 gettrace 獲取異常...

Python day 8 異常處理)

以下是 python 內建異常類的層次結構 baseexception systemexit keyboardinterrupt generatorexit exception stopiteration arithmeticerror floatingpointerror overflowerro...