《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業(yè)界動態(tài) > ARM開發(fā):二 ARM微處理器的編程模型

ARM開發(fā):二 ARM微處理器的編程模型

2015-09-28

  2.1  ARM微處理器的工作狀態(tài)
  從編程的角度看,ARM微處理器的工作狀態(tài)一般有兩種,,并可在兩種狀態(tài)之間切換:
 ?。?第一種為ARM狀態(tài),此時處理器執(zhí)行32位的字對齊的ARM指令,;
 ?。?第二種為Thumb狀態(tài),此時處理器執(zhí)行16位的,、半字對齊的Thumb指令,。
  當ARM微處理器執(zhí)行32位的ARM指令集時,工作在ARM狀態(tài),;當ARM微處理器執(zhí)行16位的Thumb指令集時,,工作在Thumb狀態(tài)。在程序的執(zhí)行過程中,,微處理器可以隨時在兩種工作狀態(tài)之間切換,,并且,處理器工作狀態(tài)的轉變并不影響處理器的工作模式和相應寄存器中的內容,。
  狀態(tài)切換方法:
  ARM指令集和Thumb指令集均有切換處理器狀態(tài)的指令,,并可在兩種工作狀態(tài)之間切換,但ARM微處理器在開始執(zhí)行代碼時,,應該處于ARM狀態(tài),。
  進入Thumb狀態(tài):當操作數寄存器的狀態(tài)位(位0)為1時,可以采用執(zhí)行BX指令的方法,,使微處理器從ARM狀態(tài)切換到Thumb狀態(tài),。此外,當處理器處于Thumb狀態(tài)時發(fā)生異常(如IRQ,、FIQ,、Undef、Abort,、SWI等),,則異常處理返回時,自動切換到Thumb狀態(tài)。
  進入ARM狀態(tài):當操作數寄存器的狀態(tài)位為0時,,執(zhí)行BX指令時可以使微處理器從Thumb狀態(tài)切換到ARM狀態(tài),。此外,在處理器進行異常處理時,,把PC指針放入異常模式鏈接寄存器中,,并從異常向量地址開始執(zhí)行程序,也可以使處理器切換到ARM狀態(tài),。
  2.2  ARM體系結構的存儲器格式
  ARM體系結構將存儲器看作是從零地址開始的字節(jié)的線性組合,。從零字節(jié)到三字節(jié)放置第一個存儲的字數據,從第四個字節(jié)到第七個字節(jié)放置第二個存儲的字數據,,依次排列,。作為32位的微處理器,ARM體系結構所支持的最大尋址空間為4GB(232字節(jié)),。
  ARM體系結構可以用兩種方法存儲字數據,,稱之為大端格式和小端格式,具體說明如下:
  大端格式:
  在這種格式中,,字數據的高字節(jié)存儲在低地址中,,而字數據的低字節(jié)則存放在高地址中,如圖2.1所示:
  小端格式:
  與大端存儲格式相反,,在小端存儲格式中,,低地址中存放的是字數據的低字節(jié),高地址存放的是字數據的高字節(jié),。如圖2.2所示:
  2.3  指令長度及數據類型
  ARM微處理器的指令長度可以是32位(在ARM狀態(tài)下),,也可以為16位(在Thumb狀態(tài)下)。
  ARM微處理器中支持字節(jié)(8位),、半字(16位)、字(32位)三種數據類型,,其中,,字需要4字節(jié)對齊(地址的低兩位為0),、半字需要2字節(jié)對齊(地址的最低位為0),。
  2.4  處理器模式
  ARM微處理器支持7種運行模式,分別為:
  ─ 用戶模式(usr):       ARM處理器正常的程序執(zhí)行狀態(tài)
  ─ 快速中斷模式(fiq):   用于高速數據傳輸或通道處理
  ─ 外部中斷模式(irq):   用于通用的中斷處理
  ─ 管理模式(svc):       操作系統(tǒng)使用的保護模式
  ─ 數據訪問終止模式(abt): 當數據或指令預取終止時進入該模式,,可用于虛擬存儲及存儲保護,。
  ─ 系統(tǒng)模式(sys):       運行具有特權的操作系統(tǒng)任務。
  ─ 未定義指令中止模式(und):當未定義的指令執(zhí)行時進入該模式,,可用于支持硬件協(xié)處理器的軟件仿真,。
  ARM微處理器的運行模式可以通過軟件改變,也可以通過外部中斷或異常處理改變。
  大多數的應用程序運行在用戶模式下,,當處理器運行在用戶模式下時,,某些被保護的系統(tǒng)資源是不能被訪問的。
  除用戶模式以外,,其余的所有6種模式稱之為非用戶模式,,或特權模式(Privileged Modes);其中除去用戶模式和系統(tǒng)模式以外的5種又稱為異常模式(Exception Modes),,常用于處理中斷或異常,,以及需要訪問受保護的系統(tǒng)資源等情況。
  2.5  寄存器組織
  ARM微處理器共有37個32位寄存器,,其中31個為通用寄存器,,6個為狀態(tài)寄存器。但是這些寄存器不能被同時訪問,,具體哪些寄存器是可編程訪問的,,取決微處理器的工作狀態(tài)及具體的運行模式。但在任何時候,,通用寄存器R14~R0,、程序計數器PC、一個或兩個狀態(tài)寄存器都是可訪問的,。
  2.5.1  ARM狀態(tài)下的寄存器組織
  通用寄存器:
  通用寄存器包括R0~R15,,可以分為三類:
  ─  未分組寄存器R0~R7;
  ─ 分組寄存器R8~R14
  ─  程序計數器PC(R15)
  未分組寄存器R0~R7:
  在所有的運行模式下,,未分組寄存器都指向同一個物理寄存器,,他們未被系統(tǒng)用作特殊的用途,因此,,在中斷或異常處理進行運行模式轉換時,,由于不同的處理器運行模式均使用相同的物理寄存器,可能會造成寄存器中數據的破壞,,這一點在進行程序設計時應引起注意,。
  分組寄存器R8~R14
  對于分組寄存器,他們每一次所訪問的物理寄存器與處理器當前的運行模式有關,。
  對于R8~R12來說,,每個寄存器對應兩個不同的物理寄存器,當使用fiq模式時,,訪問寄存器R8_fiq~R12_fiq,;當使用除fiq模式以外的其他模式時,訪問寄存器R8_usr~R12_usr,。
  對于R13,、R14來說,,每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式與系統(tǒng)模式共用,,另外5個物理寄存器對應于其他5種不同的運行模式,。
  采用以下的記號來區(qū)分不同的物理寄存器:
  R13_<mode>
  R14_<mode>
  其中,mode為以下幾種模式之一:usr,、fiq,、irq、svc,、abt,、und。
  寄存器R13在ARM指令中常用作堆棧指針,,但這只是一種習慣用法,,用戶也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,,某些指令強制性的要求使用R13作為堆棧指針,。
  由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶應用程序的初始化部分,,一般都要初始化每種模式下的R13,,使其指向該運行模式的棧空間,,這樣,,當程序的運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,,而當程序從異常模式返回時,,則從對應的堆棧中恢復,采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行,。
  R14也稱作子程序連接寄存器(Subroutine Link Register)或連接寄存器LR,。當執(zhí)行BL子程序調用指令時,R14中得到R15(程序計數器PC)的備份,。其他情況下,,R14用作通用寄存器。與之類似,,當發(fā)生中斷或異常時,對應的分組寄存器R14_svc,、R14_irq,、R14_fiq、R14_abt和R14_und用來保存R15的返回值,。
  寄存器R14常用在如下的情況:
  在每一種運行模式下,,都可用R14保存子程序的返回地址,,當用BL或BLX指令調用子程序時,將PC的當前值拷貝給R14,,執(zhí)行完子程序后,,又將R14的值拷貝回PC,即可完成子程序的調用返回,。以上的描述可用指令完成:
  1,、執(zhí)行以下任意一條指令:
  MOV       PC,LR
  BX        LR
  2,、在子程序入口處使用以下指令將R14存入堆棧:
  STMFD   SP,!,{<Regs>,LR}
  對應的,使用以下指令可以完成子程序返回:
  LDMFD   SP,!,{<Regs>,PC}
  R14也可作為通用寄存器,。
  程序計數器PC(R15)
  寄存器R15用作程序計數器(PC)。在ARM狀態(tài)下,,位[1:0]為0,,位[31:2]用于保存PC;在Thumb狀態(tài)下,,位[0]為0,,位[31:1]用于保存PC;雖然可以用作通用寄存器,,但是有一些指令在使用R15時有一些特殊限制,,若不注意,執(zhí)行的結果將是不可預料的,。在ARM狀態(tài)下,,PC的0和1位是0,在Thumb狀態(tài)下,,PC的0位是0,。
  R15雖然也可用作通用寄存器,但一般不這么使用,,因為對R15的使用有一些特殊的限制,,當違反了這些限制時,程序的執(zhí)行結果是未知的,。
  由于ARM體系結構采用了多級流水線技術,,對于ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,,即PC的值為當前指令的地址值加8個字節(jié),。
  在ARM狀態(tài)下,任一時刻可以訪問以上所討論的16個通用寄存器和一到兩個狀態(tài)寄存器,。在非用戶模式(特權模式)下,,則可訪問到特定模式分組寄存器,,圖2.3說明在每一種運行模式下,哪一些寄存器是可以訪問的,。
  寄存器R16:
  寄存器R16用作CPSR(Current Program Status Register,,當前程序狀態(tài)寄存器),CPSR可在任何運行模式下被訪問,,它包括條件標志位,、中斷禁止位、當前處理器模式標志位,,以及其他一些相關的控制和狀態(tài)位,。
  每一種運行模式下又都有一個專用的物理狀態(tài)寄存器,稱為SPSR(Saved  Program Status Register,,備份的程序狀態(tài)寄存器),,當異常發(fā)生時,SPSR用于保存CPSR的當前值,,從異常退出時則可由SPSR來恢復CPSR,。
  由于用戶模式和系統(tǒng)模式不屬于異常模式,他們沒有SPSR,,當在這兩種模式下訪問SPSR,,結果是未知的。
  2.5.2  Thumb狀態(tài)下的寄存器組織
  Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下寄存器集的一個子集,,程序可以直接訪問8個通用寄存器(R7~R0),、程序計數器(PC)、堆棧指針(SP),、連接寄存器(LR)和CPSR,。同時,在每一種特權模式下都有一組SP,、LR和SPSR,。圖2.4表明Thumb狀態(tài)下的寄存器組織。
  Thumb狀態(tài)下的寄存器組織與ARM狀態(tài)下的寄存器組織的關系:
  ─  Thumb狀態(tài)下和ARM狀態(tài)下的R0~R7是相同的,。
  ─  Thumb狀態(tài)下和ARM狀態(tài)下的CPSR和所有的SPSR是相同的,。
  ─  Thumb狀態(tài)下的SP對應于ARM狀態(tài)下的R13。
  ─  Thumb狀態(tài)下的LR對應于ARM狀態(tài)下的R14,。
  ─  Thumb狀態(tài)下的程序計數器對應于ARM狀態(tài)下R15
  以上的對應關系如圖2.5所示:
  訪問THUMB狀態(tài)下的高位寄存器(Hi-registers):
  在Thumb狀態(tài)下,,高位寄存器R8~R15并不是標準寄存器集的一部分,但可使用匯編語言程序受限制的訪問這些寄存器,,將其用作快速的暫存器,。使用帶特殊變量的MOV指令,數據可以在低位寄存器和高位寄存器之間進行傳送,;高位寄存器的值可以使用CMP和ADD指令進行比較或加上低位寄存器中的值,。
  2.5.3  程序狀態(tài)寄存器
  ARM體系結構包含一個當前程序狀態(tài)寄存器(CPSR)和五個備份的程序狀態(tài)寄存器(SPSRs)。備份的程序狀態(tài)寄存器用來進行異常處理,,其功能包括:
  ─  保存ALU中的當前操作信息
  ─  控制允許和禁止中斷
  ─  設置處理器的運行模式
  程序狀態(tài)寄存器的每一位的安排如圖2.6所示:
  條件碼標志(Condition Code Flags)
  N,、Z、C,、V均為條件碼標志位,。它們的內容可被算術或邏輯運算的結果所改變,并且可以決定某條指令是否被執(zhí)行,。
  在ARM狀態(tài)下,,絕大多數的指令都是有條件執(zhí)行的。
  在Thumb狀態(tài)下,,僅有分支指令是有條件執(zhí)行的,。
  條件碼標志各位的具體含義如表2-1所示:
  表2-1        條件碼標志的具體含義
 

1.png

  ─  T標志位:該位反映處理器的運行狀態(tài)。
  對于ARM體系結構v5及以上的版本的T系列處理器,,當該位為1時,,程序運行于Thumb狀態(tài),否則運行于ARM狀態(tài),。
  對于ARM體系結構v5及以上的版本的非T系列處理器,,當該位為1時,執(zhí)行下一條指令以引起為定義的指令異常,;當該位為0時,,表示運行于ARM狀態(tài)。
  ─  運行模式位M[4:0]:M0,、M1,、M2、M3,、M4是模式位,。這些位決定了處理器的運行模式。具體含義如表2-2所示:
  表2-2        運行模式位M[4:0]的具體含義
 

2.png

  由表2-2可知,,并不是所有的運行模式位的組合都是有效地,,其他的組合結果會導致處理器進入一個不可恢復的狀態(tài)。
  保留位
  PSR中的其余位為保留位,,當改變PSR中的條件碼標志位或者控制位時,,保留位不要被改變,在程序中也不要使用保留位來存儲數據,。保留位將用于ARM版本的擴展,。
  2.6  異常(Exceptions)
  當正常的程序執(zhí)行流程發(fā)生暫時的停止時,稱之為異常,,例如處理一個外部的中斷請求,。在處理異常之前,,當前處理器的狀態(tài)必須保留,這樣當異常處理完成之后,,當前程序可以繼續(xù)執(zhí)行,。處理器允許多個異常同時發(fā)生,它們將會按固定的優(yōu)先級進行處理,。
  ARM體系結構中的異常,,與8位/16位體系結構的中斷有很大的相似之處,但異常與中斷的概念并不完全等同,。
  2.6.1  ARM體系結構所支持的異常類型
  ARM體系結構所支持的異常及具體含義如表2-3所示,。
  表2-3  ARM體系結構所支持的異常
  

3.png

  2.6.2  對異常的響應
  當一個異常出現(xiàn)以后,ARM微處理器會執(zhí)行以下幾步操作:
  1,、將下一條指令的地址存入相應連接寄存器LR,,以便程序在處理異常返回時能從正確的位置重新開始執(zhí)行。若異常是從ARM狀態(tài)進入,,LR寄存器中保存的是下一條指令的地址(當前PC+4或PC+8,,與異常的類型有關);若異常是從Thumb狀態(tài)進入,,則在LR寄存器中保存當前PC的偏移量,,這樣,異常處理程序就不需要確定異常是從何種狀態(tài)進入的,。例如:在軟件中斷異常SWI,,指令 MOV PC,R14_svc總是返回到下一條指令,,不管SWI是在ARM狀態(tài)執(zhí)行,,還是在Thumb狀態(tài)執(zhí)行。
  2,、將CPSR復制到相應的SPSR中,。
  3、根據異常類型,,強制設置CPSR的運行模式位,。
  4、強制PC從相關的異常向量地址取下一條指令執(zhí)行,,從而跳轉到相應的異常處理程序處,。
  還可以設置中斷禁止位,以禁止中斷發(fā)生,。
  如果異常發(fā)生時,,處理器處于Thumb狀態(tài),則當異常向量地址加載入PC時,處理器自動切換到ARM狀態(tài),。
  ARM微處理器對異常的響應過程用偽碼可以描述為:
  R14_<Exception_Mode> = Return Link
  SPSR_<Exception_Mode> = CPSR
  CPSR[4:0] = Exception Mode Number
  CPSR[5] = 0                 ,;當運行于ARM工作狀態(tài)時
  If <Exception_Mode> == Reset or FIQ then
  ,;當響應FIQ異常時,,禁止新的FIQ異常
  CPSR[6] = 1
  CPSR[7] = 1
  PC = Exception Vector Address
  2.6.3  從異常返回
  異常處理完畢之后,ARM微處理器會執(zhí)行以下幾步操作從異常返回:
  1,、將連接寄存器LR的值減去相應的偏移量后送到PC中。
  2,、將SPSR復制回CPSR中,。
  3、若在進入異常處理時設置了中斷禁止位,,要在此清除,。
  可以認為應用程序總是從復位異常處理程序開始執(zhí)行的,因此復位異常處理程序不需要返回,。
  2.6.4  各類異常的具體描述
  FIQ(Fast Interrupt Request)
  FIQ異常是為了支持數據傳輸或者通道處理而設計的,。在ARM狀態(tài)下,系統(tǒng)有足夠的私有寄存器,,從而可以避免對寄存器保存的需求,,并減小了系統(tǒng)上下文切換的開銷。
  若將CPSR的F位置為1,,則會禁止FIQ中斷,,若將CPSR的F位清零,處理器會在指令執(zhí)行時檢查FIQ的輸入,。注意只有在特權模式下才能改變F位的狀態(tài),。
  可由外部通過對處理器上的nFIQ引腳輸入低電平產生FIQ。不管是在ARM狀態(tài)還是在Thumb狀態(tài)下進入FIQ模式,,F(xiàn)IQ處理程序均會執(zhí)行以下指令從FIQ模式返回:
  SUBS   PC,R14_fiq ,#4
  該指令將寄存器R14_fiq的值減去4后,,復制到程序計數器PC中,從而實現(xiàn)從異常處理程序中的返回,,同時將SPSR_mode寄存器的內容復制到當前程序狀態(tài)寄存器CPSR中,。
  IRQ(Interrupt Request)
  IRQ異常屬于正常的中斷請求,可通過對處理器的nIRQ引腳輸入低電平產生,,IRQ的優(yōu)先級低于FIQ,,當程序執(zhí)行進入FIQ異常時,IRQ可能被屏蔽,。
  若將CPSR的I位置為1,,則會禁止IRQ中斷,若將CPSR的I位清零,處理器會在指令執(zhí)行完之前檢查IRQ的輸入,。注意只有在特權模式下才能改變I位的狀態(tài),。
  不管是在ARM狀態(tài)還是在Thumb狀態(tài)下進入IRQ模式,IRQ處理程序均會執(zhí)行以下指令從IRQ模式返回:
  SUBS  PC , R14_irq , #4
  該指令將寄存器R14_irq的值減去4后,,復制到程序計數器PC中,,從而實現(xiàn)從異常處理程序中的返回,同時將SPSR_mode寄存器的內容復制到當前程序狀態(tài)寄存器CPSR中,。
  ABORT(中止)
  產生中止異常意味著對存儲器的訪問失敗,。ARM微處理器在存儲器訪問周期內檢查是否發(fā)生中止異常。
  中止異常包括兩種類型:
  ─  指令預取中止:發(fā)生在指令預取時,。
  ─  數據中止:發(fā)生在數據訪問時,。
  當指令預取訪問存儲器失敗時,存儲器系統(tǒng)向ARM處理器發(fā)出存儲器中止(Abort)信號,,預取的指令被記為無效,,但只有當處理器試圖執(zhí)行無效指令時,指令預取中止異常才會發(fā)生,,如果指令未被執(zhí)行,,例如在指令流水線中發(fā)生了跳轉,則預取指令中止不會發(fā)生,。
  若數據中止發(fā)生,,系統(tǒng)的響應與指令的類型有關。
  當確定了中止的原因后,,Abort處理程序均會執(zhí)行以下指令從中止模式返回,,無論是在ARM狀態(tài)還是Thumb狀態(tài):
  SUBS PC, R14_abt, #4      ;指令預取中止
  SUBS PC, R14_abt, #8      ,;數據中止
  以上指令恢復PC(從R14_abt)和CPSR(從SPSR_abt)的值,,并重新執(zhí)行中止的指令。
  Software Interruupt(軟件中斷)
  軟件中斷指令(SWI)用于進入管理模式,,常用于請求執(zhí)行特定的管理功能,。軟件中斷處理程序執(zhí)行以下指令從SWI模式返回,無論是在ARM狀態(tài)還是Thumb狀態(tài):
  MOV  PC , R14_svc
  以上指令恢復PC(從R14_svc)和CPSR(從SPSR_svc)的值,,并返回到SWI的下一條指令,。
  Undefined Instruction(未定義指令)
  當ARM處理器遇到不能處理的指令時,會產生未定義指令異常,。采用這種機制,,可以通過軟件仿真擴展ARM或Thumb指令集。
  在仿真未定義指令后,,處理器執(zhí)行以下程序返回,,無論是在ARM狀態(tài)還是Thumb狀態(tài):
  MOVS PC, R14_und
  以上指令恢復PC(從R14_und)和CPSR(從SPSR_und)的值,,并返回到未定義指令后的下一條指令。
  2.6.5  異常進入/退出小節(jié)
  表2-4總結了進入異常處理時保存在相應R14中的PC值,,及在退出異常處理時推薦使用的指令,。
  表2-4  異常進入/退出
  

4.png

  注意:
  1、在此PC應是具有預取中止的BL/SWI/未定義指令所取的地址,。
  2,、在此PC是從FIQ或IRQ取得不能執(zhí)行的指令的地址。
  3,、在此PC是產生數據中止的加載或存儲指令的地址,。
  4、系統(tǒng)復位時,,保存在R14_svc中的值是不可預知的,。
  2.6.6  異常向量(Exception Vectors)
  表2-5顯示異常向量地址。
  表2-5 異常向量表
  

5.png

  2.6.7  異常優(yōu)先級(Exception Priorities)
  當多個異常同時發(fā)生時,,系統(tǒng)根據固定的優(yōu)先級決定異常的處理次序。異常優(yōu)先級由高到低的排列次序如表2-6所示,。
  表2-6        異常優(yōu)先級
 

6.png

  2.6.8  應用程序中的異常處理
  當系統(tǒng)運行時,,異常可能會隨時發(fā)生,,為保證在ARM處理器發(fā)生異常時不至于處于未知狀態(tài),,在應用程序的設計中,首先要進行異常處理,,采用的方式是在異常向量表中的特定位置放置一條跳轉指令,,跳轉到異常處理程序,當ARM處理器發(fā)生異常時,,程序計數器PC會被強制設置為對應的異常向量,,從而跳轉到異常處理程序,當異常處理完成以后,,返回到主程序繼續(xù)執(zhí)行,。
  2.7  本章小節(jié)
  本章對ARM微處理器的體系結構、寄存器的組織,、處理器的工作狀態(tài),、運行模式以及處理器異常等內容進行了描述,這些內容也是ARM體系結構的基本內容,,是系統(tǒng)軟,、硬件設計的基礎。

本站內容除特別聲明的原創(chuàng)文章之外,,轉載內容只為傳遞更多信息,,并不代表本網站贊同其觀點。轉載的所有的文章、圖片,、音/視頻文件等資料的版權歸版權所有權人所有,。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容,、版權和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,,避免給雙方造成不必要的經濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。