1. 程式人生 > >STM32學習之:Context—M3簡介

STM32學習之:Context—M3簡介

Cortex-M3概覽
(1)簡介     
Cortex-M3是一個 32位處理器核心。內部的資料路徑是 32位的,暫存器是 32位的,儲存器介面也是 32 位的。CM3 採用了哈佛結構,擁有獨立的指令匯流排和資料匯流排,可以讓取指與資料訪問並行不悖。這樣一來資料訪問不再佔用指令匯流排,從而提升了效能。為實現這個特性, CM3內部含有好幾條匯流排介面,每條都為自己的應用場合優化過,並且它們可以並行工作。但是另一方面,指令匯流排和資料匯流排共享同一個儲存器空間(一個統一的儲存器系統)。     
比較複雜的應用可能需要更多的儲存系統功能,為此CM3提供一個可選的MPU,而且在需要的情況下也可以使用外部的 cache。另外在CM3中,Both小端模式和大端模式都是支援的。
(2)Cortex-M3的簡化圖

(3)暫存器組 
處理器擁有R0-R15的暫存器組,其中R13最為堆疊指標SP,SP有兩個,但是同一時刻只能有一個可以看到,這就是所謂的“banked”暫存器。

a、R0-R12都是 32位通用暫存器,用於資料操作。但是注意:絕大多數 16位Thumb指令只能訪問R0-R7,而 32位 Thumb-2指令可以訪問所有暫存器。  
b、Cortex-M3擁有兩個堆疊指標,然而它們是 banked,因此任一時刻只能使用其中的一個。 
主堆疊指標(MSP):復位後預設使用的堆疊指標,用於作業系統核心以及異常處理例程(包括中斷服務例程) 
程序堆疊指標(PSP):由使用者的應用程式程式碼使用。
堆疊指標的最低兩位永遠是0,這意味著堆疊總是4位元組對齊的。 
c、R14:連線暫存器--當呼叫一個子程式時,由R14儲存返回地址
d、R15:程式計數暫存器--指向當前的程式地址,如果修改它的值,就能改變程式的執行流(這裡有很多高階技巧)
e、Cortex-M3還在核心水平上搭載了若干特殊功能暫存器,包括
程式狀態字暫存器組(PSRs)
中斷遮蔽暫存器組(PRIMASK, FAULTMASK, BASEPRI) 
控制暫存器(CONTROL)

Cortex-M3處理器支援兩種處理器的操作模式,還支援兩級特權操作。 
       
兩種操作模式分別為:處理者模式和執行緒模式(thread mode)。引入兩個模式的本意,是用於區別普通應用程式的程式碼和異常服務例程的程式碼——包括中斷服務例程的程式碼。
Cortex-M3 的另一個側面則是特權的分級——特權級和使用者級。這可以提供一種儲存器訪問的保護機制,使得普通的使用者程式程式碼不能意外地,甚至是惡意地執行涉及到要害的操作。處理器支援兩種特權級,這也是一個基本的安全模型。

在 CM3 執行主應用程式時(執行緒模式),既可以使用特權級,也可以使用使用者級;但是異常服務例程必須在特權級下執行。復位後,處理器預設進入執行緒模式,特權極訪問。在特權級下,程式可以訪問所有範圍的儲存器(如果有 MPU,還要 在MPU規定的禁地之外),並且可以執行所有指令。
在特權級下的程式可以為所欲為,但也可能會把自己給玩進去——切換到使用者級。一旦進入使用者級,再想回來就得走“法律程式”了——使用者級的程式不能簡簡單單地試圖改寫 CONTROL暫存器就回到特權級,它必須先“申訴”:執行一條系統呼叫指令(SVC)。這會觸發SVC異常,然後由異常服務例程(通常是作業系統的一部分)接管,如果批准了進入,則異常服務例程修改 CONTROL暫存器,才能在使用者級的執行緒模式下重新進入特權級。信盈達,扣扣:一以七捂捂吧就領久要!
        
事實上,從使用者級到特權級的唯一途徑就是異常:如果在程式執行過程中觸發了一個異常,處理器總是先切換入特權級,並且在異常服務例程執行完畢退出時,返回先前的狀態。
通過引入特權級和使用者級,就能夠在硬體水平上限制某些不受信任的或者還沒有除錯好的程式,不讓它們隨便地配置涉及要害的暫存器,因而系統的可靠性得到了提高。進一步地,如果配了 MPU,它還可以作為特權機制的補充——保護關鍵的儲存區域不被破壞,這些區域通常是作業系統的區域。 
(4)內建的巢狀向量中斷控制器
Cortex-M3 在核心水平上搭載了一顆中斷控制器——巢狀向量中斷控制器 NVIC(Nested Vectored Interrupt Controller)。它與核心有很深的“親密接觸”——與核心是緊耦合的。
NVIC提供如下的功能: 
·   可巢狀中斷支援 
·   向量中斷支援 
·   動態優先順序調整支援 
·   中斷延遲大大縮短 
·   中斷可遮蔽
可巢狀中斷支援:  可巢狀中斷支援的作用範圍很廣,覆蓋了所有的外部中斷和絕大多數系統異常。外在表現是,這些異常都可以被賦予不同的優先順序。當前優先順序被儲存在 xPSR 的專用欄位中。當一個異常發生時,硬體會自動比較該異常的優先順序是否比當前的異常優先順序更高。如果發現來了更高優先順序的異常,處理器就會中斷當前的中斷服務例程(或者是普通程式),而服務新來的異常——即立即搶佔。
向量中斷支援:  當開始響應一箇中斷後,CM3會自動定位一張向量表,並且根據中斷號從表中找出 ISR的入口地址,然後跳轉過去執行。不需要像以前的 ARM那樣,由軟體來分辨到底是哪個中斷髮生了,也無需半導體廠商提供私有的中斷控制器來完成這種工作。這麼一來,中斷延遲時間大為縮短。