官术网_书友最值得收藏!

2.3 ARM處理器的內部編程結構

2.3.1 ARM7TDMI應用內核的結構及引出信號線

1.ARM7TDMI應用內核的結構

盡管ARM處理器不同版本的結構是有差異的,但它們各自的內部組成還是存在不少相同的地方。下面以ARM7TDMI內核為例討論其內部的編程結構。

所謂的編程結構就是與編程有關的,或程序指令可以涉及的結構內容。ARM7TDMI內核采用了馮·紐曼結構,其構建的應用內核結構框圖如圖2-7所示。

圖2-7 ARM7TDMI應用內核的結構框圖

由圖2-7可看出,一個ARM7TDMI應用核包含了以下主要功能部件。

①ARM7TDMI內核。

②測試訪問口控制器(Test Access Port,TAP)。TAP的作用是實現對芯片所有引出腳的監控,用戶可以通過宿主機經JTAG接口向TAP控制器發送各種JTAG命令,促使各輸出引腳產生規定的信號,或者是將各輸入引腳的狀態讀出,從而在CPU沒有任何存儲器程序運行的情況下,使各引腳產生與特定程序運行時相同的信號變化效果,以此來達到對系統硬件電路的調試。關于JTAG技術的具體內容將在后續的章節中介紹。

③內嵌的在線仿真(In-Circuit Emulator,ICE)邏輯。為了方便快捷地對芯片內部的電路進行調試,在ARM7TDMI及后續的應用內核中都增加了ICE邏輯,以硬件的方式提供對電路調試的支持。具體是在JTAG邏輯的基礎上增加了硬件斷點寄存器、比較器等。通過這些功能部件就可以實現斷點設置、三總線觸發條件設置等調試環境,從而實現快速的程序調試和實時跟蹤。

④數據線分離器(BUS Splitter)。由于ARM應用內核是以可擴展的片上結構形式提供的,不同的芯片廠家會在此基礎上構造不同的具體應用電路。為了提高數據的吞吐量,有些電路需要分離的數據輸入和數據輸出線,所以ARM應用內核提供了兩套數據線結構方案:一套是分離的數據輸入和數據輸出線;另一套是輸入輸出共用的數據線。但目前大多數的應用芯片采用的是輸入輸出共用一組數據線的方案,對此數據線分離器不起作用。

2.ARM7TDMI內核的結構及引出信號

ARM7TDMI內核的結構框圖如圖2-8所示,分類的引出信號如圖2-9所示。

圖2-8 ARM7TDMI內核的結構框圖

圖2-9 ARM7TDMI內核的引出信號

2.3.2 ARM內核編程結構要素

1.ARM微處理器的工作狀態

RISC處理器的特點之一是具有統一的指令代碼長度,而且多數為32位。但考慮到在某些應用中采用16位的代碼進行指令編碼已經完全符合應用需要,若都使用32位長度編碼的指令顯然會造成存儲空間的浪費,因此ARM處理器設置了兩種指令代碼長度的指令模式供用戶靈活的選用。32位代碼長度的指令集稱為ARM指令集,16位代碼長度的指令集稱為Thumb指令集。不同長度的指令代碼將工作于不同的工作狀態下,運行ARM指令的工作狀態稱為ARM狀態,運行Thumb指令模式的工作狀態稱為Thumb狀態。

①ARM狀態:以狀態寄存器中的標志位T=0為標志,所有運行的指令都是32位的,對應的代碼存儲空間以32位對齊。

②Thumb狀態:以狀態寄存器中的標志位T=1為標志,所有運行的指令都是16位的,對應的代碼存儲空間以16位對齊。

程序運行過程中可以由一種指令程序段轉移到另一種指令程序段,但同時也必須進行相應的工作狀態切換。

ARM處理器的初始工作狀態處于32位的ARM狀態,所讀取和執行的必須是ARM指令。當需要轉換到16位指令集運行時,需要采用專門的程序轉移指令進行。通常的做法是采用帶狀態轉換的轉移指令“BX Rm”實現。該指令中操作碼BX中的B表示轉移(Branch),X表示進行ARM與Thumb的工作狀態轉換(eXchange)。操作數Rm是包含了轉移目標地址的寄存器,該地址將指向Thumb指令程序的起始地址。也可以采用相同的方法由Thumb指令段轉移到ARM指令段。

當處理器處于Thumb狀態時,若操作數寄存器的最低位為0,執行BX指令時可以使微處理器從Thumb狀態切換到ARM狀態。另外若發生異常(如IRQ、FIQ、Undef、Abort、SWI等),且異常處理程序為ARM狀態,異常處理返回時將自動切換回原來的Thumb狀態。此外,在處理器進行異常處理時,把PC指針放入異常模式鏈接寄存器中,并從異常向量地址開始執行程序,也可以使處理器切換到ARM狀態。

2.ARM體系結構的數據存儲格式

如同其他計算機體系結構中的存儲器構成方式一樣,ARM體系結構可以支持的存儲器最小尋址單位為字節。按照字節地址形成的存儲器尋址空間稱為線性地址空間。可以將存儲器看成從零地址開始的字節的線性組合。在ARM體系結構中將4字節定義為一個字(Word),2字節定義為半字。如果從0地址開始存放字數據,0號字節到3號字節放置第一個字數據,從第4號字節到第7號字節放置第二個字數據,依次排列。作為32位的微處理器,ARM體系結構所支持的最大尋址空間為4GB(32根地址線尋址232字節)。但由于ARM內核的數據寬度為32位,一次就可以從存儲器讀寫4個字節的數據。當ARM處理器向以字節為單位編址的線性地址空間寫入字數據(或半字)數據時,就存在一個字(或半字)中高位字節和低位字節與存儲器連續的4個字節單元(或2個字節單元)字節對應的問題。即到底是字數據中的低字節對應4個字節存儲空間的低地址單元、高字節對應存儲空間的高地址單元,還是字數據中的低字節對應4個字節存儲空間的高地址單元、高字節對應存儲空間的低地址單元。ARM體系結構可以支持這兩種方式的存儲格式,并分別稱之為大端格式和小端格式。下面以12個字節數據0,1,2,3,4,5,6,7,8,9,10,11按先后順序以字為單位寫入從0地址開始的12個字節存儲單元為例對大端格式和小端格式具體加以說明。

1)大端格式(Big-Endian)

在這種格式中,字數據的高字節存儲在低地址中,而字數據的低字節則存放在高地址中,將3個字數據0X0B0A0908、0X07060504、0X03020100存入存儲器的位置如圖2-10所示。

圖2-10 以大端格式存儲字數據

2)小端格式(Little-Endian)

與大端存儲格式相反,在小端存儲格式中,低地址中存放的是字數據的低字節,高地址存放的是字數據的高字節。將上例3個字數據存入存儲器的位置如圖2-11所示。

在嵌入式系統應用中大部分采用的是小端格式。

圖2-11 以小端格式存儲字數據

3.ARM微處理器的指令長度及數據類型

ARM微處理器的指令長度可以是32位(在ARM狀態下),也可以是16位(在Thumb狀態下)。ARM處理器盡管數據線是32位,但是數據長度可以按照字節(8位)、半字(16位)、字(32位)三種方式訪問外部存儲器中的數據。如果訪問的是字數據則需要地址值的最低兩位保持0,使數據按4字節對齊;若訪問的是半字數據則需要地址值的最低位保持0,使數據按2字節對齊。字節數據的訪問地址可以是任意線性值。

4.ARM微處理器的工作模式

為了保證計算機系統程序運行的可靠性,大多數的多任務操作系統都設計為系統程序和用戶程序相互隔離的工作環境下,其主要目的是為了防止用戶程序有意或無意對系統程序可能造成的破壞。用戶程序通常只具有很有限的資源訪問權限,重要的系統資源都是由系統程序掌控的。用戶程序只能通過特定的方式向操作系統申請提供所需的資源訪問服務。不同的處理器會提供不同的資源訪問權限的硬件支持結構,例如,Intel 80386以上的CPU就提供了4級不同的保護模式工作權限,Windows和Linux都僅采用了其中的2級。

ARM處理器同樣也支持多用戶程序下對系統程序和用戶程序設置不同訪問權限,而且為了加快異常的響應過程更是設置了多種針對不同異常的工作模式。因此ARM處理器包括用戶模式、系統模式、快速中斷模式、普通中斷模式、數據訪問中止模式、未定義指令中止模式,以及管理模式共7種工作模式。不同的工作模式具有不同的特權級別,表現在對系統資源的訪問權限不同。但任意時刻程序都只能運行于這些工作模式內其中的一種。

處理器當前的工作模式由狀態寄存器CPSR中的最低5位M[4:0]標示和確定。

1)用戶模式:usr(user)

用戶程序的執行模式是所有模式中特權級別最低的工作模式。在該模式下,運行的程序不能訪問某些受保護的系統資源,也不能輕易改變自身的工作模式,但是可以通過軟中斷或其他異常的產生,進入具有特權級的模式環境下來使用那些受限制的資源。

除了用戶模式外的其他6種工作模式都可以自由訪問系統資源和在程序中改變自身的工作模式,所以以下的6種模式也稱為特權模式。

2)系統模式:sys(system)

該模式具有與用戶模式完全相同的寄存器組,但是卻可以訪問系統資源。它與其他5種特權模式的不同處是不可以通過異常方式進入。這種方式用于運行具有系統資源訪問特權的操作系統任務。

除了用戶和系統模式外的其他5種工作模式都是通過特定的異常/中斷事件發生后自動進入的,所以也稱為異常模式。ARM處理器中共有7種異常,詳情見后續內容。

3)快速中斷模式:fiq(fast interrupt request)

當ARM處理器的外部快中斷引腳產生有效信號時將觸發快中斷異常,從而使處理器進入快速中斷模式。該模式用于處理器與外設的快速數據傳輸。

4)中斷模式:irq(interrupt request)

當ARM處理器的外部普通中斷引腳產生有效信號時將觸發本中斷異常,從而使處理器進入中斷模式。該模式用于普通方式下的處理器與外設的數據傳輸。

5)數據訪問中止模式:abt(abort)

當數據或指令預取中止時進入該模式,可用于虛擬存儲及存儲保護。

6)未定義指令中止模式:und(undefined)

當未定義的指令執行時進入該模式,可用于支持硬件協處理器的軟件仿真。

7)管理模式:svc(supervisor)

管理模式是常用的系統程序運行模式,也是處理器復位狀態下的工作模式。即當系統復位或開機時將引發復位異常,并因此進入管理模式。另外通過執行軟中斷調用指令SWI也可以進入管理模式,用戶程序可因此方式訪問系統資源。

在上述的7種工作模式中,大多數情況下處理器都會處于系統模式(運行操作系統程序)或用戶模式(運行用戶程序)下,只有當系統產生中斷或異常時處理器才會暫時轉入相應的中止或中斷模式,服務完成后仍將返回原運行模式。而管理模式通常是用于運行那些為系統程序或用戶程序能夠正常運行做準備的程序。處理器在上電或復位時的初始狀態將處于管理模式,初始的復位程序基本上用于實現對系統進行初始化、自檢等準備性操作,之后將轉入系統模式(如果有操作系統)。

在7種工作模式中,用戶模式的權限最低,不僅不能訪問受保護的系統資源,而且不可以自行由指令實現工作模式的切換,即不可以通過改寫CPSR內容實現工作模式的轉換,對CPSR只能讀不能寫。而其他的6種工作模式則屬于特權模式,不僅可以訪問受保護的系統資源,而且可以直接由指令修改CPSR的工作模式位域從而轉換到其他工作模式。這6種特權模式除了系統模式外的其他5種模式又歸類為異常模式,它們的工作模式狀態轉換會伴隨對應異常的產生而自動實現。表2-5給出了不同工作模式的轉換方法。

表2-5 各種工作模式的進入和退出方法

5.ARM7TDMI內核的指令流水線

ARM7TDMI內核設計為三級流水線,如圖2-12所示。了解指令的流水線結構是為了正確地理解當前執行的指令和當前指令指針PC值的關系,特別是在各種異常情況下如何正確設置異常返回的地址。在圖2-12所示的例子中,在時鐘周期3時執行的指令是指令1,同時進行指令譯碼的是指令2,而同時又進行的取指令操作的是指令3。即執行指令1時的當前指令指針PC值所指向的是指令1后面的第2條指令,即指令3。PC值對于ARM指令集為指令1的地址值加8,Thumb指令集為加4。例如ARM指令1的存儲地址為0x1000,PC值就為0x1008。所以在后續的轉移操作或異常處理程序內設置返回指令地址時需要進行相應的處理。

圖2-12 ARM7TDMI內核的三級指令流水線結構

2.3.3 ARM內核的寄存器組織

ARM處理器共有37個32位的內部寄存器,其中31個為通用寄存器,6個為狀態寄存器。當ARM處理器處于7種工作模式下的任何一種時,每種模式下只能使用一組17或18個內部寄存器,系統和用戶模式為17個,其他模式為18個。在這37個寄存器中有些寄存器是7種工作模式下共用的,而另外一些則專屬于不同的工作模式。圖2-13是不同工作模式下可使用內部寄存器的分屬情況,圖中帶左下角陰影的是專屬特定工作模式的寄存器,沒有陰影的是可在多種工作模式下共用的寄存器。這些可共用的寄存器包括16個通用寄存器R0~R15、1個當前程序狀態寄存器CPSR。但需要注意的是這些可共用的寄存器并不是所有工作模式都可共用,其中有些寄存器只在部分工作模式下可共用,并且在ARM指令集狀態下和Thumb指令集狀態下這些寄存器組還有少許區別。

圖2-13 ARM微處理器的內部寄存器組

1.通用寄存器(R0~R15)

盡管R0~R15稱為通用寄存器,但實際上并不是完全通用的。由圖2-13可以看出,只有R0~R7是7種工作模式都可共用的,所以這8個寄存器又稱為未分組寄存器;而R8~R14只在部分工作模式下可共用,所以稱為分組寄存器,它們在不同的工作模式下可共用的寄存器有所不同。另外由于R15的主要功能是作為程序計數器PC,所以在使用中具有一定的特殊性。

1)未分組寄存器(Unbanked Register)R0~R7

所謂的未分組寄存器,也就是所有的工作方式下都可共用的那些寄存器。這些寄存器共有8個,用關鍵字符號R0~R7表示。使用中需要注意的是,當一種工作方式轉換為另一種工作方式之前,應及時保存這些寄存器內的中間結果,否則原有內容將被新工作方式下的程序破壞,因為在另外一種工作模式下仍然可直接使用這些寄存器。

2)分組寄存器(Banked Register)R8~R14

所謂的分組寄存器,也就是不同工作方式下各自的專屬寄存器。這些寄存器分別對應不同工作模式時可共用的寄存器有所不同。例如,在FIQ工作方式下將使用專用的R8~R12寄存器,并用關鍵字R8_irq~R12_irq表示;而其他6種工作方式將共用同一組R8~R12寄存器。為FIQ工作方式設置專用的寄存器組R8_irq~R12_irq的目的是為了在快中斷請求的響應過程中利用它們加快處理的速度。

3)特殊的通用寄存器R13、R14、R15

在16個通用寄存器中有3個寄存器R13、R14、R15有著其他通用寄存器不具有的特殊功能,它們除了可以作為通用寄存器使用外,還分別固定的作為堆棧指針寄存器SP(R13)、鏈接寄存器LR(R14)和程序計數器PC(R15)。

①堆棧指針寄存器R13。R13的主要作用是作為堆棧指針,即SP(Stack Pointer)使用。5種異常工作方式因各自異常處理程序中堆棧的專用性,所以需要專屬的R13作為堆棧指針,分別用關鍵字R13_fiq、R13_svc、R13_abt、R13_irq、R13_und加以區分,而用戶方式和系統方式則共用一個堆棧指針寄存器R13。由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的棧空間,這樣當程序運行進入異常模式時,可將需要保護的寄存器內容放入R13所指向的堆棧;而當程序從異常模式返回時,則從對應的堆棧中恢復。采用這種方式可以保證異常發生后程序的正常執行。當R13不作為堆棧指針時也可以作為通用寄存器使用。

②鏈接寄存器R14。R14稱為鏈接寄存器(Link Register,LR),其作用實際上就是用于保存程序調用或異常響應中的返回地址參考值。當執行BL子程序調用指令或進行各種異常響應時,處理器會自動將R15(程序計數器PC)的值復制到R14中。當子程序結束時可根據R14的內容獲取子程序及異常處理的返回地址。在其他情況下,R14仍可作為通用寄存器使用。另外當發生中斷或異常時,也將產生與程序調用相類似的程序轉地址執行,即進入中斷或異常處理程序,但隨之會產生工作方式的轉換,處理器將由原來的工作模式(系統或用戶)進入相應的異常工作模式,所以對應5種異常工作方式需要設置5個專屬的返回地址寄存器LR,它們分別是R14_fiq、R14_svc、R14_irq、R14_abt和R14_und用來保存R15的返回值。而用戶方式和系統方式將如同R13,共用一個R14。R14也可作為通用寄存器使用,但一定是其中沒有有用的返回地址時。

需要注意的是R14獲得的拷貝值并不一定是真正的返回地址值,有些需要針對不同的工作模式進行一些調整,具體方法見后續內容。

③程序計數器R15。寄存器R15在處理器運行過程中固定的作為程序計數器(Program Counter,PC),用于提供將要讀取的后續指令地址,其內容會自動加4(ARM指令)或加2(Thumb指令)。在ARM狀態下,由于指令都以字為讀取單位,所以PC中指令地址值的最低兩位[1:0]始終為0,以保證對存儲器的取指令操作以字對齊。同理,在Thumb狀態下由于指令都是以半字為讀取單位的,所以PC中指令地址值的最低位[0]始終為0,以保證對存儲器的取指令操作以半字對齊。

盡管R15也可以作為通用寄存器,但由于改變PC的值就意味著改變程序的走向,所以在將R15作為通用寄存器使用時必須謹慎,否則將會產生難以預料的結果。

由于ARM7TDMI內核結構采用了三級流水線技術,對于ARM指令集而言,PC總是指向當前執行指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個字節。

4)不同工作模式下可使用內部寄存器小結

對應ARM的7種工作模式下的任一模式,可以訪問以上所討論的一組16個通用寄存器和一到兩個狀態寄存器。其中的未分組寄存器R0~R7是7種工作模式所共用的,而分組寄存器對應不同的工作模式各具有獨自的寄存器。特別在5種異常模式下,大部分都有自己專用的R13和R14,其中快中斷模式更是具有R8~R14共7個專屬寄存器。表2-6給出了每種運行模式下對應可訪問的寄存器組合。

表2-6 工作模式及其所使用的寄存器對應表

CPSR可在任何運行模式下被訪問,它包括條件標志位、中斷禁止位、當前處理器模式標志位,以及其他一些相關的控制和狀態位。

每一種運行模式下又都有一個專用的狀態,當異常發生時,SPSR用于保存CPSR的當前值,從異常退出時則可由SPSR來恢復CPSR。

由于用戶模式和系統模式不屬于異常模式,因此,它們沒有SPSR,當在這兩種模式下訪問SPSR時,其結果是未知的。

2.程序狀態寄存器

在表2-6中可以看到,每種工作模式下除了擁有16個通用寄存器外,還有一個共用的寄存器CPSR,各異常模式下還擁有其各自專屬的寄存器SPSR_xxx。

寄存器CPSR稱為當前程序狀態寄存器(Current Program Status Register),寄存器SPSR稱為備份的程序狀態寄存器(Saved Program Status Register)。計算機中的程序狀態寄存器主要用途是記錄和反映處理器的工作狀態及某些指令執行結果所產生的特殊標識,同時也會用其中的某些位來設置一些控制信息。

ARM體系結構下無論什么工作模式都共用一個當前程序狀態寄存器CPSR,而對應五種異常模式又分別有五個備份的程序狀態寄存器SPSR_xxx。這是由于大部分情況下處理器是運行系統程序和用戶程序,分別對應系統模式和用戶模式。而異常處理程序通常只是臨時占用一下處理器的執行時間,且大多數要返回原程序主體去運行,所以在進入異常處理程序時需要將主程序斷點處的程序狀態寄存器內容加以保存,以備返回后所用。

ARM體系結構中的程序狀態寄存器結構如圖2-14,其主要作用有以下三個。

圖2-14 程序狀態寄存器格式

1)記錄和反映處理器某些指令執行結果所產生的特殊標識(位31~位27)

主要有N、Z、C、V、Q共5個,這些特殊標識的位狀態是由處理器根據部分指令(如算數和邏輯運算指令)運行結果自動設置的,且主要作為后續指令的執行條件,所以也常常稱為條件碼。ARM的許多指令都可以以這些條件碼作為執行的條件。這幾個狀態位也可以通過指令MSR和LDM進行訪問。這些條件碼的具體含義如表2-7。

表2-7 條件碼標志的具體含義

2)允許或禁止對IRQ和FIQ請求響應位I(位7)和F(位6)
  • I=0表示允許響應IRQ中斷請求,I=1表示禁止響應IRQ中斷請求;
  • F=0表示允許響應FIQ中斷請求,I=1表示禁止響應FIQ中斷請求。

3)記錄和反映處理器的當前工作模式位T(位5)和M[4:0](位4~位0)

①標識處理器當前是Thumb態還是ARM態且僅適用于V4及以上結構版本位T(位5)。

注意:不能直接用MSR指令對CPSR中的T位進行設置,否則將產生不可預見的后果。一般只能通過BX指令或在異常返回時利用SPSR到CPSR的內容拷貝隱含地進行。

②標識處理器當前是何種工作模式M[4:0](位4~位0)。這些位反映了處理器的當前運行模式,通常是在工作模式切換時由處理器自動設置的(如產生異常)。盡管也可以由指令來設置,但只能是在非用戶模式下進行(特權模式下)。如果對此不是很清楚,最好不要盲目進行更改。這些位的具體含義如表2-8所示。

表2-8 運行模式位M[4:0]的具體含義

由表2-8可知,并不是所有的運行模式位的組合都是有效的,其他的組合結果會導致處理器進入一個不可恢復的狀態。

注意:PSR中的其余位為保留位,當改變PSR中的條件碼標志位或者控制位時,保留位不要被改變,在程序中也不要使用保留位來存儲數據。保留位將用于ARM版本的擴展。

對CPSR內容的改動一般發生在以下幾種情況:

  • 改變條件標志;
  • 禁止或允許中斷;
  • 改變處理器的工作模式。
主站蜘蛛池模板: 兴仁县| 彭泽县| 任丘市| 酉阳| 鱼台县| 辽阳市| 京山县| 阿拉尔市| 宝应县| 盐津县| 五台县| 基隆市| 黄陵县| 浪卡子县| 仁寿县| 凤城市| 丰原市| 若尔盖县| 信宜市| 济源市| 滨州市| 万安县| 专栏| 同德县| 万年县| 内丘县| 芦溪县| 成安县| 蒙山县| 海南省| 金山区| 安宁市| 班戈县| 浑源县| 涡阳县| 玛纳斯县| 抚州市| 民县| 信宜市| 武宣县| 仁化县|