4.2 編程模型
- OS內核與系統中斷使用MSP(僅能在特權模式下訪問),用戶任務使用PSP
- CPU操作狀態分爲:調試狀態(處於DEBUG斷點)、THUMB狀態(M系列處理器無ARM狀態)。操作模式分爲:處理模式(在中斷ISR狀態下)、線程模式(執行普通程序)
- 線程模式可以切換獨立的SP,處理器啓動後處於特權線程模式以及THUMB狀態,部分架構無非特權線程模式(如M0)
4. MSP與PSP均爲32位,對於CORTEXM處理器,PUSH與POP均爲32位操作,因此指針地址後2位爲0
5. LR寄存器記錄函數或子程序調用後的返回地址,若函數又調用了函數或子程序,爲了保證LR值不丟失,需要將LR入棧;在 異常處理時LR會被更新爲特殊的EXC_RETURN數值。典型的有如下3種值:
值 |
含義 |
0xFFFFFFF1 |
中斷返回時從MSP恢復棧,返回之後操作模式爲處理模式,使用MSP棧,即在中斷嵌套情況下,返回上一級中斷 |
0xFFFFFFF9 |
中斷返回時從MSP恢復棧,返回之後操作模式爲線程模式,使用MSP棧,該情況在只使用MSP不使用PSP時發生 |
0xFFFFFFFD |
中斷返回時從PSP恢復棧,返回之後操作模式爲線程模式,使用PSP棧,即一般的從中斷返回用戶線程的情況 |
由於處理器指令均爲對齊至偶數地址,會出現LR寄存器最後1位沒有用到的情況,設計者因此將LR寄存器的最後1位作爲 THUMB狀態的標誌位,爲1時爲THUMB狀態。
6. PC寄存器爲程序計數器。若讀取PC寄存器時返回的是當前指令地址加4的地址,(按書中所說指令需要對齊至半字或字 地址,即4字節或2字節對齊,這樣的話PC爲什麼不是指令地址加2?又如碰到16位THUMB指令時,PC值又如何計 算?)這裏需要注意處理器爲三級流水線設計,即取指、譯碼、執行三級,當前指令取指完成後,PC即會進行PC=PC+4 的操作,當處理器處於執行某條指令的狀態時,由於是三級流水線設計,此時PC的值爲當前指令地址加8。
(摘自https://www.cnblogs.com/jack-hzm/p/11961878.html)
7. 特殊寄存器。
(1) 程序狀態寄存器。包括:APSR EPSR IPSR。
(2) PRIMASK FAULTMASK BASEPRI寄存器
PRIMASK 阻止除NMI和HARDFAULT的其它中斷
FAULTMASK 在PRIMASK基礎上可屏蔽HARDFAULT中斷,FAULTMASK在異常返回後會自動清除
BASEPRI 設定門限屏蔽優先級較低中斷
(3) CONTROL寄存器
控制MSP與PSP、特權與非特權、浮點上下文活躍(具備FPU的M4)
8. 浮點寄存器
包含數據S0-S31或D0-D15、浮點狀態和控制寄存器、經過存儲器映射的浮點單元控制寄存器
4.4存儲器系統
- 基本映射圖
2. 棧的用途可分爲:調用函數時保存現場、函數或子程序參數傳遞,局部變量存儲,中斷時保存寄存器值。
3. 在CORTEXM中,棧從高地址生長至低地址,PUSH操作先移動SP指針,再在SP的上一個數據框中存入數據。
4. 對於使用OS的應用,如果發生了中斷,則壓棧的參數會存於PSP中,如下圖所示
4.5 異常與中斷
1.0x00000000存放的是MSP初值,上電覆位時,處理器會一次讀取2個字的內容即MSP初始值和復位向量,之所以在復位時需要MSP是因爲在復位過程中有可能會發生NMI或HARDFAULT,需要參數壓棧。