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