詳細(xì)剖析Cortex-M3處理器
工作模式
線程模式(Thread mode):處理器復(fù)位或異常退出時為此模式。此模式下的代碼可以是特權(quán)代碼也可以是用戶代碼,通過CONTROL[0]控制。
處理模式(Handler mode):出現(xiàn)異常(包括中斷)時進(jìn)入此模式,此模式下所有代碼為特權(quán)訪問。
代碼權(quán)限
特權(quán)訪問:對處理器資源擁有完全訪問限權(quán);處理器復(fù)位后進(jìn)入此訪問模式;清零 CONTROL[0]進(jìn)入用戶模式。
用戶訪問:禁止訪問多數(shù)系統(tǒng)寄存器。只能通過進(jìn)入異常(中斷)來返回特權(quán)模式。進(jìn)入異常前是用戶級訪問,則退出異常時自動回到用戶及,除非在異常中修改CONTROL[0]位。
工作狀態(tài)
Thumb狀態(tài)(正常執(zhí)行指令狀態(tài))和調(diào)試狀態(tài)。
寄存器
r0-r12:通用寄存器,其中r8-r12只能被32位指令訪問。
r13(SP):堆棧指針;線程模式時可以在線程堆棧和主堆棧之間切換,但處理模式只使用主堆棧。兩個堆棧同一時刻只有一個可見,進(jìn)入、退出異常時自動切換堆棧。
r14(LR):鏈接寄存器,保存子程序或異常的返回地址(要實現(xiàn)嵌套,必須入棧)。
r15(PC):程序計數(shù)器。
xPSR:特殊用途的程序狀態(tài)寄存器。
異常
進(jìn)入異常步驟:
1.處理器在當(dāng)前堆棧上把xPSR、PC、LR、r12、r3~r0八個寄存器自動依次入棧。
2.讀取向量表(如果是復(fù)位中斷,更新SP值)。
3.根據(jù)向量表更新PC值。
4.加載新PC處的指令(2、3、4步與1步同時進(jìn)行)。
5.更新LR為EXC_RETURN(EXC_RETURN表示退出異常后返回的模式及使用的堆棧)。
退出異常步驟
1.根據(jù)EXC_RETURN指示的堆棧,彈出進(jìn)入中斷時被壓棧的8個寄存器。
2.從剛出棧的IPSR寄存器[8:0]位檢測恢復(fù)到那個異常(此時為嵌套中斷中),若為0則恢復(fù)到線程模式。
3.根據(jù)EXC_RETURN,選擇使用相應(yīng)SP。
末尾連鎖(Tail-chaining):當(dāng)前正在執(zhí)行中斷,又有一個中斷到來且這個中斷優(yōu)先級比正在執(zhí)行的中斷優(yōu)先級低(如果有其他被壓棧的低優(yōu)先級中斷則要比這些中斷優(yōu)先級高),這個中斷暫時被掛起,等到當(dāng)前中斷執(zhí)行完后不再執(zhí)行堆棧操作,而直接進(jìn)入掛起的中斷。
遲來:前一個中斷還沒有進(jìn)入執(zhí)行階段(但處理器狀態(tài)已經(jīng)保存),后面來了一個高優(yōu)先級中,則前一個中斷被搶占,后來的高優(yōu)先級中斷不需要再保存寄存器狀態(tài)。
中斷
Cortex-M3中有兩個優(yōu)先級的概念——搶占式優(yōu)先級和響應(yīng)優(yōu)先級,有人把響應(yīng)優(yōu)先級稱作‘亞優(yōu)先級‘或‘副優(yōu)先級‘,每個中斷源都需要被指定這兩種優(yōu)先級。
具有高搶占式優(yōu)先級的中斷可以在具有低搶占式優(yōu)先級的中斷處理過程中被響應(yīng),即中斷嵌套,或者說高搶占式優(yōu)先級的中斷可以嵌套低搶占式優(yōu)先級的中斷。
當(dāng)兩個中斷源的搶占式優(yōu)先級相同時,這兩個中斷將沒有嵌套關(guān)系,當(dāng)一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。如果這兩個中斷同時到達(dá),則中斷控制器根據(jù)他們的響應(yīng)優(yōu)先級高低來決定先處理哪一個;如果他們的搶占式優(yōu)先級和響應(yīng)優(yōu)先級都相等,則根據(jù)他們在中斷表中的排位順序決定先處理哪一個。