《ARM Cortex-M3與Cortex-M4權威指南》第四章筆記

 

4.2 編程模型

  1. OS內核與系統中斷使用MSP(僅能在特權模式下訪問),用戶任務使用PSP
  2. CPU操作狀態分爲:調試狀態(處於DEBUG斷點)、THUMB狀態(M系列處理器無ARM狀態)。操作模式分爲:處理模式(在中斷ISR狀態下)、線程模式(執行普通程序)
  3. 線程模式可以切換獨立的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?又如碰到16THUMB指令時,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存儲器系統

  1. 基本映射圖

    2.  棧的用途可分爲:調用函數時保存現場、函數或子程序參數傳遞,局部變量存儲,中斷時保存寄存器值。

    3.  在CORTEXM中,棧從高地址生長至低地址,PUSH操作先移動SP指針,再在SP的上一個數據框中存入數據。

    4.  對於使用OS的應用,如果發生了中斷,則壓棧的參數會存於PSP中,如下圖所示

 

 4.5  異常與中斷

1.0x00000000存放的是MSP初值,上電覆位時,處理器會一次讀取2個字的內容即MSP初始值和復位向量,之所以在復位時需要MSP是因爲在復位過程中有可能會發生NMI或HARDFAULT,需要參數壓棧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章