1. 程式人生 > >cpu執行模式切換以及異常處理

cpu執行模式切換以及異常處理

s3c6410的cpu核總共有7中模式,體現在cpsr[4..0]暫存器上: user 使用者模式 fiq 快速中斷模式 irq 通常的中斷模式 svc 管理模式 abt 資料訪問終止模式 sys 系統模式 und 未定義指令中止模式 一般在發生異常的時候會伴隨cpu執行模式的自動切換,通常都是切換至除使用者模式以外的其他模式。使用者模式只有手動切換(即通過修改cpsr的值來切換模式),那麼在發生異常的時候: 硬體會做如下的事情: ①cpu切換到該異常對應的模式(如 swi軟中斷指令會使cpu進入svc模式,發生一般中斷則進入irq模式,遇到cpu不認識的機器碼則會使cpu切換到未定義指令中止模式) ②cpu切換正在使用的暫存器R13(sp),R14(lr) ③儲存當前cpsr到當前模式
下的spsr,將下一條指令的地址儲存到當前模式下的R14(lr) ④接著跳轉到相應的異常處理的地址下。(如reset跳到0x0 swi跳到0x8 等等)         ——此處延伸出了一個實驗時遇到的問題:用了正確的程式,即使執行也得不到正確的結果。究其原因是因為我程式執行的時候是在superboot上downlaod並run在ddram上的。從0x5000_0000地址上開始執行。而跳轉時跳到0x0 即開發板剛上電的時候對映到的那塊區域。如果是nandflash 啟動,開發板會自動將前8K搬到stepping stone,如果是sd卡啟動,則是sd卡的前8K(此處是猜的)。 所以使用superboot在執行程式的時候就不會出現正確的結果,就算髮生中斷了也是跳到superboot程式的第x條語句執行。
那麼在程式設計時候,軟體應該做什麼呢? ①設定新的堆疊(因為每個模式都有對應的新的R13(sp 堆疊指標)) ②儲存現場(將每個模式下非獨有的,公共的暫存器儲存下來,以及R14(lr 此時R14存的是跳轉前的下一條地址,用於中斷返回)) ③處理中斷(根據相應引數,或進行相應輪詢的過程來確定選擇哪個中斷服務程式,或直接在此處貼上公共的處理程式碼) ④恢復現場(將剛剛儲存的對應暫存器恢復,並且將硬體上儲存下來的spsr恢復到cpsr中)