ARM core 介紹一
時間:2016-12-14作者:華清遠見
一、ARM處理器的特點 (1)支持的數據類型 A.字節 8bit (2)采用32位精簡指令集(RISC)處理器架構 ARM處理器可以工作在兩種狀態: A . ARM狀態 指令長度為32位,這種狀態執行的是字對齊方式的ARM指令 B. Thumb狀態 指令長度為16位,這種狀態執行半字對齊方式的Thumb指令 主意:這兩個狀態間的切換并不影響處理器模式和寄存器內容 小知識:RISC和CISC 指令的強弱是CPU的重要指標,指令集是提高微處理器效率的有效工具之一。從現階段的主流體系結構講,指令集可分為復雜指令集(CISC)和精簡指令集(RISC)兩部分。相應的,微處理隨著微指令的復雜度也可分為CISC及RISC這兩類。 CISC是一種為了便于編程和提高記憶體訪問效率的晶片設計體系。在20世紀90年代中期之前,大多數的微處理器都采用CISC體系——包括Intel的80x86和Motorola的68K系列等。即通常所說的X86架構就是屬于CISC體系的。RISC是為了提高處理器運行的速度而設計的晶片體系。它的關鍵技術在于流水線操作(Pipelining):在一個時鐘周期里完成多條指令。而超流水線以及超標量技術已普遍在晶片設計中使用。RISC體系多用于非x86陣營高性能微處理器CPU。像ARM(Advanced RISC Machines),既可以認為是一個公司的名字,也可以認為是對一類微處理器的通稱,還可以認為是一種技術的名字。而ARM體系結構目前被公認為是業界的32位嵌入式RISC 微處理器結構。所有ARM處理器共享這一體系結構。 (1)CISC CISC復雜指令系統計算機通過增強計算機指令系統功能,通過程序去執行大量功能各異的指令,從而優化計算機系統的性能。 由于具有大量的指令,因此CISC體系的優缺點也很明顯。 優點: a)具有豐富的指令系統,很大程度上簡化了程序設計的難度。 b)CISC中不要求指令長度統一,可以節省存儲空間。 c)CISC指令可以直接對存儲器操作,使得通用寄存器數目較少。 同時CISC指令系統也帶來很多問題: a)由于指令系統龐大,尋址方式、指令格式較多,指令長度不一,增加了硬件復雜程序,設計成本較高。 b)指令操作復雜、執行周期長、速度低,難以優化編譯生成高效的機器語言。 c)許多指令使用頻度低,增加了系統負擔,降低了性價比。 (2)RISC 和CISC相比,RISC的指令就要少得多,通常在幾十條左右,其基本設計思想是盡量簡化計算機的指令功能,從而降低硬件執行指令的復雜度,因為軟件比硬件容易提供更大的靈活性和更高的智能。因此CISC的主要特點如下: a) 精簡指令集:只保留了數量很少、功能簡單、能在一個機器周期內完成的指令,如果要執行復雜的程序功能則通過子程序而不是使用復雜指令來實現。 b)指令長度相同:每條指令的長度都是相同的,可以在一個單獨操作里完成。 c) 單機器周期指令:大多數的指令都可以在一個機器周期里完成,并且允許處理器在同一時間內執行一系列的指令。 使用RISC指令具有以下優勢: a) 精簡指令系統的設計適合超大規模集成電路的實現。由于指令條數相對較少,尋址方式簡單,指令格式規整,與CISC結構相比,控制器的譯碼和執行硬件相對簡單,因此芯片中用于實現控制器的晶體面積明顯減小。 b)在使用相同的晶片技術和相同運行時鐘下,RISC系統具有更快的運行速度。精簡的指令系統可以加快指令的譯碼,控制器的簡化可以縮短指令的執行延時等,這些都可以提高程序的執行速度。 c)可以提供直接支持高級語言的能力,簡化編譯程序的設計。指令總數的減少,縮小了編譯過程中對功能類似的機器指令的選擇范圍,減輕了對各種尋址方式進行選擇、分析和變換的負擔,易于更換或取消指令、調整指令順序,提高程序運行速度。 d)RISC處理器比相對應的CISC處理器設計更簡單,所需要的時間將變得更短,并可以比CISC處理器應用更多先進的技術,開發更快的下一代處理器。 相應的,RISC也存在一些缺點,主要有: a) 由于指令少,因此加重了匯編程序員的負擔,增加了機器語言程序的長度,從而占用了較大的存儲空間。 b) 相對來說,RISC對編譯器的要求更高,因為指令簡單,RISC結構的性能就依賴于編譯器的效率。編譯器的優劣直接影響處理器的性能發揮。 綜合上面所述,若要再進一步比較CISC與RISC之差異,可以由以下幾點來進行分析: 1、指令的形成:CISC因指令復雜,故采微指令碼控制單元的設計,而RISC的指令90%是由硬體直接完成,只有10%的指令是由軟體以組合的方式完成,因此指令執行時間上RISC較短,但RISC所須ROM空間相對的比較大,至于RAM使用大小應該與程序的應用比較有關系。 2、定址模式:CISC的需要較多的定址模式,而RISC只有少數的定址模式,因此CPU在計算記憶體有效位址時,CISC占用的周期較多。 3、指令周期:CISC指令的格式長短不一,執行時的周期次數也不統一,而RISC結構剛好相反,故適合采用管線處理架構的設計,進而可以達到平均一周期完成一指令的方向努力。顯然的,在設計上RISC較CISC簡單,同時因為CISC的執行步驟過多,閑置的單元電路等待時間增長,不利于平行處理的設計,所以就效能而言RISC較CISC還是站了上風,但RISC因指令精簡化后造成應用程式碼變大,需要較大的程式記憶體空間,且存在指令種類較多等等的缺點。 4、大量使用寄存器 二、ARM處理器的模式與異常 ARM體系結構主要支持7種處理器模式,分別為 : 用戶模式、快中斷模式、中斷模式、管理模式、中止模式,未定義模式和系統模式 (1)系統(sys),快中斷(fiq)、中斷(irq)、管理(svc)、中止(abt)、未定義(und)這六種模式成為特權模式 (2)快中斷(fiq)、中斷(irq)、管理(svc)、中止(abt)、未定義(und) 這五種成為異常模式 思考:為什么處理會被設計成這么多模式呢? 處理器之所以被設計出這么多模式的目的是為了能夠更好地處理各種異常。 那什么是異常呢?所謂的異常,指的就是中止了程序正常執行的過程而不得不去完成的一些特殊工作,如芯片復位,取指失敗,指令未定義,等等。 有些同學在大學的時候,學過51單片機,知道中斷的概念。在這里中斷其實也是一種異常,這里的中斷包括外部硬件產生的外部中斷和由芯片內部硬件產生的內部中斷。由中斷產生的異常和其他異常,從處理方法的角度來看沒有任何區別,所以我們可以把這些異常統一起來研究。 注意:在正常情況下,一個普通程序可能會運行在用戶模式和系統模式下,當異常發生時,ARM就會自動切換到異常模式去處理異常,處理完后,又回到用戶模式或系統模式下繼續之前的工作。因為每一種模式都包含相應的私有資源,因此可以保證在處理異常的時候,原理的程序環境不會被新的環境破壞,從而保證了系統的正常工作。注意:在正常情況下,一個普通程序可能會運行在用戶模式和系統模式下,當異常發生時,ARM就會自動切換到異常模式去處理異常,處理完后,又回到用戶模式或系統模式下繼續之前的工作。因為每一種模式都包含相應的私有資源,因此可以保證在處理異常的時候,原理的程序環境不會被新的環境破壞,從而保證了系統的正常工作。 好了,關于ARM的異常和工作模式就介紹在這里,接下來我們來看看ARM每種模式下所擁有的寄存器。 三、ARM每種模式擁有的寄存器 前面我們講到,ARM使用的是RSIC架構,而RSIC架構特點之一就是使用大量寄存器。ARM處理器支持多模式,每種模式都有一些寄存器是公用的,有一些是私有的。 在這里可以簡單總結一下: (1)ARM總共有37個寄存器,其中R0-R7,CPSR,R15(pc)是任何模式下都公用的的寄存器 (2)用戶模式和系統模式使用相同的寄存器R0-R15,CPSR (3)每種異常模式都有自己的 SPSR,R13,R14 (4)FIQ模式除了公共R0-R7寄存器外,還有自己私有的R8-R12,其他模式沒有自己私有的R8-R12寄存器 注意:Cortex體系結構下有40個32-Bits長的寄存器Cortex-A多出3個寄存器,Monitor 模式 r13_mon , r14_mon, spsr_mon 接下來我們一起來看看這些寄存器都有什么作用吧。 四、ARM中每個寄存器的用途 (1)R0-R12 這些寄存器我們可以隨便使用,就像我們寫C語言一樣,都需要定義變量,在ARM的世界里,這些就是已經定義好的變量,可以直接拿來使用,每個都可以用來存放一個32bit的數哦。 (2)R13,R14這兩個寄存器就要注意了,前面我們分析過,在所有的異常模式下都有自己的私有的R13,R14,即每種異常模式在操作R13和R14,不會對其他模式下R13和R14的值產生影響。 R13我們又叫做sp,也就是我們常說的棧指針。大家C語言的局部變量時需要入棧的,也就是說不管在那一種模式下,如果我們想調用C語言程序,那在之前先設置好對應模式的sp指針。 R14為鏈接寄存器(LR),在結構上有兩個特殊功能: (1)在每種模式下,模式自身的R14用于保存子程序返回地址; (2)當發生異常時,將R14對應的異常模式設置為異常返回地址(有些異常有一個小的固定偏移量)。 (3)寄存器R15為程序計數器(PC),它指向正在取指的地址。也就說R15保存的是那一條指令的地址,CPU就會預取那一條指令。 (4)寄存器CPSR為程序狀態寄存器,它時刻記錄CPU的狀態 通過上圖我們可以知道,CPSR記錄了處理器當前工作的模式,FIQ、IRQ中斷是否使能,指令帶條件執行結果等信息。 下面我們詳細來看看每一位分別代表什么意思: A.條件代碼標志 (N ) 運算結果的高位反映在該標志位。對于有符號二進制補碼,結果為負數時N=1,結果為正數或零時N=0; (Z ) 指令結果為0時Z=1(通常表示比較結果“相等”),否則Z=0; (C ) 當進行加法運算(包括CMN指令),并且高位產生進位時C=1,否則C=0。當進行減法運算(包括CMP 指令),并且高位產生借位時 C=0,否則C=1。對于結合移位操作的非加法/減法指令,C為從高位后移出的值,其它指令C通常不變; (V)進行加法/減法運算,并且發生有符號溢出時V=1,否則V=0,其它指令V通常不變。 B. 中斷禁止位包括I和F位 當I位置位時,IRQ中斷被禁止; 當F位置位時,FIQ中斷被禁止。 C.T位反映了正在操作的狀態 當T位置位時,處理器正在Thumb狀態下運行; 當T位清零時,處理器正在ARM狀態下運行。 D.模式位 模式位包括M4、M3、M2、M1和M0,這些位決定處理器的操作模式。 10000 User mode ; 10001 FIQ mode; 10011 SVC mode ; 10111 Abort mode ; 11011 Undfined mode; 11111 System mode; 10110 Monitor mode; 10010 IRQ 注意:不是所有模式位的組合都定義了有效的處理器模式,如果使用了錯誤的設置,將引起一個無法恢復的錯誤 (5)SPSR 程序狀態保存寄存器 每種異常都有自己的SPSR,在因為異常事件而進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。 五、Thumb狀態下的寄存器 ARM狀態和Thumb狀態之間寄存器的關系 Thumb狀態寄存器與ARM狀態寄存器有如下的關系: Thumb狀態R0~R7與ARM狀態R0~R7相同; Thumb狀態CPSR和SPSR與ARM狀態CPSR和SPSR相同; Thumb狀態SP映射到ARM狀態R13; Thumb狀態LR映射到ARM狀態R14; Thumb狀態PC映射到ARM狀態PC(R15)。 注意: 在Thumb狀態中,高寄存器(R8~R15)不是標準寄存器集的一部分 六、ARM異常處理 前面我們已經說過異常了,所謂的異常可以理解為CPU的正常執行被打斷,而不得不去完成一些特殊的工作。有些同學可能感覺還是有點抽象,舉個例子說明一下吧:假如你正在努力的寫代碼,這個時候你肚子餓了,必須得解決呀,你就停止寫代碼,去吃飯了,吃完飯你又繼續寫代碼了,過了一會,你的瞌睡蟲來找你了,必須得睡覺呀,都三天三夜沒睡了。睡完之后,你又開始寫代碼。這里的肚子餓,瞌睡蟲就可以理解成異常情況,必須得處理,處理完后還得恢復以前的狀態。 那異常產生的時候,硬件上會自動做那些事情呢?注意是硬件自動做的哦,不需要我們介入的。 當一種異常發生時,硬件就會自動執行如下動作: (1)將CPSR保存到相應異常模式下的SPSR中 (2)把PC寄存器保存到相應異常模式下的LR中 (3)將CPSR設置成相應的異常模式 (4)設置PC寄存器的值為相應處理程序的入口地址 可以總結如下圖: 細心的同學就會發現,這里的PC寄存器的值不是應該指向正在執行的指令嗎?為什么圖中卻指向了正在提起的指令,這里的"正在提取"又有什么含義呢?呵呵,這就涉及到流水線的問題了,關于流水線我們后面會介紹的。 這里我們還是先搞明白,異常產生的時候,硬件應該將PC值設為多少呢?要想明白這個問題,還必須先知道一個概念"異常向量表"。 ARM一共有5種異常模式,按道理,每一種異常模式都應該有一個唯一的入口地址。這些入口地址彼此相鄰,我們一般稱之為異常向量表。 當異常產生的時候,硬件會自動將PC的值設置為對應異常量的入口地址。具體異常向量表存放在什么位置,我們可以通過相關的協處理指令進行設置就可以了。這個我們在后期的課程中會講到。 好了到這里,我們已經知道了,異常發生時,硬件都自動做了哪些事情。那異常返回的時候,硬件也會自動做一些事情嗎?呵呵,答案是沒有。異常返回的時候,程序員必須做如下事情: 異常返回 (1)從 SPSR_<mode>恢復CPSR (2)從LR_<mode>恢復PC 這些事情產生的效果就是恢復現場哦。
相關資訊
發表評論
|