Cortex-M3支持2個模式(Handler模式、線程模式)和2個特權等級(特權級、非特權級)。
- 當處理器處在線程模式時,既可以使用特權級,也可以使用非特權級。
- 當處理器處在Handler模式時,總是特權級的。
- 在復位后,處理器進入“線程模式+特權級”。
- 在“線程模式+非特權級(用戶級)”下,禁止對系統控制空間(SCS)的訪問。
- 在“線程模式+非特權級(用戶級)”下,禁止使用MRS/MSR訪問除了APSR之外的特殊功能寄存器。
【操作模式與特權等級狀態轉換圖】
【線程模式特權級 與 Handler模式特權級 相互切換】
當CONTROL[0]=0時,線程模式特權級,在異常處理的始末,只發生了處理器模式的切換,如:
【線程模式非特權級 與 Handler模式特權級 相互切換】
當CONTROL[0]=1時,線程模式非特權級(用戶級),則在異常處理的始末,處理器模式和特權等級都發生變化,如:
【線程模式非特權級 與 線程模式特權級&Handler模式特權級 切換】
- 芯片復位后,進入線程模式特權級。
- 線程模式特權級與Handler模式特權級之間通過異常/中斷的進出來切換。
- 在特權級下的代碼可以通過置位CONTROL[0]來進入非特權級。
- Handler模式永遠都是特權級的。不管是任何原因產生了任何異常,處理器都將以特權級來運行其服務例程,異常返回后,系統將回到產生異常時所處的級別。
- Handler模式通過異常/中斷進入,退出即返回線程模式。從Handler模式異常返回時,也可以通過置位CONTROL[0](非特權級的線程模式)或清零CONTROL[0](特權級的線程模式)來改變返回線程模式的級別。
- 線程模式非特權級下的代碼不能再試圖修改CONTROL[0]來回到線程模式特權級。它必須通過一個異常進入到Handler模式,由那個異常Handler處理來修改,清零CONTROL[0]為線程模式特權級,才能在返回到線程模式后拿到特權級。
參考摘錄:
《Cortex-M內核系列和STM32-講座2教程.pdf》
《ARM Cortex-M3權威指南.pdf》