ARM 體系結構

今天學習的是ARM體系結構。以前只知道ram是隨機存取存儲器的意思,還不知道有體系結構這麼一回事。雖然也認真聽講,但還是雲裏霧裏的,概念很模糊。在網上發現一篇關於ARM的文章,寫的不錯。

ARM 體系結構  

Q: ARM 是什麼?
A: ARM(Advanced RISC Machines),既可以認爲是一個公司的名字,也可以認爲是對一類微處理器的通稱,還可以認爲是一種技術的名字。
  1991年ARM公司成立於英國劍橋,主要出售芯片設計技術的授權。目前,採用ARM技術知識產權(IP)核的微處理器,即我們通常所說的ARM微處理器,已遍及工業控制、消費類電子產品、通信系統、網絡系統、無線系統等各類產品市場,基於ARM技術的微處理器應用約佔據了32位RISC微處理器75%以上的市場份額,ARM技術正在逐步滲入到我們生活的各個方面。
  ARM公司是專門從事基於RISC技術芯片設計開發的公司,作爲知識產權供應商,本身不直接從事芯片生產,靠轉讓設計許可由合作公司生產各具特色的芯片,世界各大半導體生產商從ARM公司購買其設計的ARM微處理器核,根據各自不同的應用領域,加入適當的外圍電路,從而形成自己的ARM微處理器芯片進入市場。目前,全世界有幾十家大的半導體公司都使用ARM公司的授權,因此既使得ARM技術獲得更多的第三方工具、製造、軟件的支持,又使整個系統成本降低,使產品更容易進入市場被消費者所接受,更具有競爭力。
Q:ARM微處理器的特點
A: 1、體積小、低功耗、低成本、高性能;
  2、支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件;
  3、大量使用寄存器,指令執行速度更快;
  4、大多數數據操作都在寄存器中完成;
  5、尋址方式靈活簡單,執行效率高;
  6、指令長度固定;

Q:ARM的RISC體系結構
A:傳統的CISC(Complex Instruction Set Computer,複雜指令集計算機)結構有其固有的缺點,即隨着計算機技術的發展而不斷引入新的複雜的指令集,爲支持這些新增的指令,計算機的體系結構會越來越複雜,然而,在CISC指令集的各種指令中,其使用頻率卻相差懸殊,大約有20%的指令會被反覆使用,佔整個程序代碼的80%。而餘下的80%的指令卻不經常使用,在程序設計中只佔20%,顯然,這種結構是不太合理的。
  基於以上的不合理性,1979年美國加州大學伯克利分校提出了RISC(Reduced Instruction Set Computer,精簡指令集計算機)的概念,RISC並非只是簡單地去減少指令,而是把着眼點放在瞭如何使計算機的結構更加簡單合理地提高運算速度上。RISC結構優先選取使用頻最高的簡單指令,避免複雜指令;將指令長度固定,指令格式和尋地方式種類減少;以控制邏輯爲主,不用或少用微碼控制等措施來達到上述目的。
  到目前爲止,RISC體系結構也還沒有嚴格的定義,一般認爲,RISC體系結構應具有如下特點:
  - 採用固定長度的指令格式,指令歸整、簡單、基本尋址方式有2~3種。
  - 使用單週期指令,便於流水線操作執行。
  - 大量使用寄存器,數據處理指令只對寄存器進行操作,只有加載/ 存儲指令可以訪問存儲器,以提高指令的執行效率。
  除此以外,ARM體系結構還採用了一些特別的技術,在保證高性能的前提下儘量縮小芯片的面積,並降低功耗:
  - 所有的指令都可根據前面的執行結果決定是否被執行,從而提高指令的執行效率。
  - 可用加載/存儲指令批量傳輸數據,以提高數據的傳輸效率。
  - 可在一條數據處理指令中同時完成邏輯處理和移位處理。
  - 在循環處理中使用地址的自動增減來提高運行效率。
  當然,和CISC架構相比較,儘管RISC架構有上述的優點,但決不能認爲RISC架構就可以取代CISC架構,事實上,RISC和CISC各有優勢,而且界限並不那麼明顯。現代的CPU往往採用CISC的外圍,內部加入了RISC的特性,如超長指令集CPU就是融合了RISC和CISC的優勢,成爲未來的CPU發展方向之一。

Q: ARM的寄存器結構
A:  ARM處理器共有37個寄存器,被分爲若干個組(BANK),這些寄存器包括:
  - 31個通用寄存器,包括程序計數器(PC指針),均爲32位的寄存器。
  - 6個狀態寄存器,用以標識CPU的工作狀態及程序的運行狀態,均爲32位,目前只使用了其中的一部分。
  同時,ARM處理器又有7種不同的處理器模式,在每一種處理器模式下均有一組相應的寄存器與之對應。即在任意一種處理器模式下,可訪問的寄存器包括15個通用寄存器(R0~R14)、一至二個狀態寄存器和一個程序計數器。在所有的寄存器中,有些是在7種處理器模式下共用的同一個物理寄存器,而有些寄存器則是在不同的處理器模式下有不同的物理寄存器。

Q: ARM指令集
A:ARM微處理器在較新的體系結構中支持兩種指令集:ARM指令集和Thumb指令集。其中,ARM指令爲32位的長度,Thumb指令爲16位長度。Thumb指令集爲ARM指令集的功能子集,但與等價的ARM代碼相比較,可節省30%~40%以上的存儲空間,同時具備32位代碼的所有優點。

Q: ARM微處理器系列
A:  ARM微處理器目前包括下面幾個系列,以及其它廠商基於ARM體系結構的處理器,除了具有ARM體系結構的共同特點以外,每一個系列的ARM微處理器都有各自的特點和應用領域。
  - ARM7系列
  - ARM9系列
  - ARM9E系列
  - ARM10E系列
  - ARM11E系列
  - Cortex-M系列
  - Cortex-A系列
  - SecurCore系列
  - Inter的Xscale
  - Inter的StrongARM
  其中,ARM7、ARM9、ARM9E和ARM10爲4個通用處理器系列,每一個系列提供一套相對獨特的性能來滿足不同應用領域的需求。SecurCore系列專門爲安全要求較高的應用而設計。

Q: ARM微處理器的應用領域
A:  到目前爲止,ARM微處理器及技術的應用幾乎已經深入到各個領域:
  1、工業控制領域:作爲32的RISC架構,基於ARM核的微控制器芯片不但佔據了高端微控制器市場的大部分市場份額,同時也逐漸向低端微控制器應用領域擴展,ARM微控制器的低功耗、高性價比,向傳統的8位/16位微控制器提出了挑戰。
  2、無線通訊領域:目前已有超過85%的無線通訊設備採用了ARM技術, ARM以其高性能和低成本,在該領域的地位日益鞏固。
  3、網絡應用:隨着寬帶技術的推廣,採用ARM技術的ADSL芯片正逐步獲得競爭優勢。此外,ARM在語音及視頻處理上行了優化,並獲得廣泛支持,也對DSP的應用領域提出了挑戰。
  4、消費類電子產品:ARM技術在目前流行的數字音頻播放器、數字機頂盒和遊戲機中得到廣泛採用。
  5、成像和安全產品:現在流行的數碼相機和打印機中絕大部分採用ARM技術。手機中的32位SIM智能卡也採用了ARM技術。

Q: 如何選擇合適的ARM微處理器內核?
A:從前面所介紹的內容可知,ARM微處理器包含一系列的內核結構,以適應不同的應用領域,用戶如果希望使用WinCE或標準Linux等操作系統以減少軟件開發時間,就需要選擇ARM720T以上帶有MMU(Memory Management Unit)功能的ARM芯片,ARM720T、ARM920T、ARM922T、ARM946T、Strong-ARM都帶有MMU功能。而ARM7TDMI則沒有MMU,不支持Windows CE和標準Linux,但目前有uCLinux等不需要MMU支持的操作系統可運行於ARM7TDMI硬件平臺之上。事實上,uCLinux已經成功移植到多種不帶MMU的微處理器平臺上,並在穩定性和其他方面都有上佳表現。
   * 系統的工作頻率
  系統的工作頻率在很大程度上決定了ARM微處理器的處理能力。ARM7系列微處理器的典型處理速度爲0.9MIPS/MHz,常見的ARM7芯片系統主時鐘爲20MHz-133MHz,ARM9系列微處理器的典型處理速度爲1.1MIPS/MHz,常見的ARM9的系統主時鐘頻率爲100MHz-233MHz,ARM10最高可以達到700MHz。不同芯片對時鐘的處理不同,有的芯片只需要一個主時鐘頻率,有的芯片內部時鐘控制器可以分別爲ARM核和USB、UART、DSP、音頻等功能部件提供不同頻率的時鐘。
   * 芯片內存儲器的容量
  大多數的ARM微處理器片內存儲器的容量都不太大,需要用戶在設計系統時外擴存儲器,但也有部分芯片具有相對較大的片內存儲空間,如ATMEL的AT91F40162就具有高達2MB的片內程序存儲空間,用戶在設計時可考慮選用這種類型,以簡化系統的設計。
   * 片內外圍電路的選擇
  除ARM微處理器核以外,幾乎所有的ARM芯片均根據各自不同的應用領域,擴展了相關功能模塊,並集成在芯片之中,我們稱之爲片內外圍電路,如USB接口、IIS接口、LCD控制器、鍵盤接口、RTC、ADC和DAC、DSP協處理器等,設計者應分析系統的需求,儘可能採用片內外圍電路完成所需的功能,這樣既可簡化系統的設計,同時提高系統的可靠性。

相關鏈接
ARM 官方網站
ARM Architecture Reference Manual(PDF,英文)
ARM7TDMI 介紹
現在學習ARM,最好選擇基於ARM的內置flash的微控制器入手,一來外圍電路簡單,系統成本低,而來系統複雜性降低,有利於DIY。
基於ARM的微控制器中,用得最多的就是ARM7TDMI,因此,本文以ARM7TDMI爲藍本介紹。

Q:ARM7TDMI是什麼意義?
A:  ARM7系列微處理器爲低功耗的32位RISC處理器,最適合用於對價位和功耗要求較高的消費類應用。
ARM7微處理器系列具有如下特點:
  - 具有嵌入式ICE-RT邏輯,調試開發方便。
  - 極低的功耗,適合對功耗要求較高的應用,如便攜式產品。
  - 能夠提供0.9MIPS/MHz的三級流水線結構。
  - 代碼密度高併兼容16位的Thumb指令集。
  - 對操作系統的支持廣泛,包括Windows CE、Linux、Palm OS等。
  - 指令系統與ARM9系列、ARM9E系列和ARM10E系列兼容,便於用戶的產品升級換代。
  - 主頻最高可達130MIPS,高速的運算處理能力能勝任絕大多數的複雜應用。
  ARM7系列微處理器的主要應用領域爲:工業控制、Internet設備、網絡和調制解調器設備、移動電話等多種多媒體和嵌入式應用。
  ARM7系列微處理器包括如下幾種類型的核:ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ。其中,ARM7TMDI是目前使用最廣泛的32位嵌入式RISC處理器,屬低端ARM處理器核。
TDMI的基本含義爲:
  T: 支持16位壓縮指令集Thumb;
  D: 支持片上Debug;
  M: 內嵌硬件乘法器(Multiplier)
  I: 嵌入式ICE,支持片上斷點和調試點;

學習前的準備工作
Q:學習ARM需要哪些軟硬件基礎知識?
A:軟件方面需要C語言的基礎知識,彙編語言的基礎知識,也就是一般單片機的開發要求。之所以說基礎,是因爲在開發工程中也可以學習。
PC軟件的操作,理解IDE的工程管理模式。
硬件方面需要了解一點模擬電路知識,大部分數字電路知識,各種總線,比如I2C,SPI,硬件模塊,比如PLL等等。

Q:哪些公司生產基於ARM7TDMI的微控制器?
A:這個比較多,比如ATMEL,NXP(Philips),ST,TI,AD等等。從購買的方便性和資料的豐富性上考慮,建議選擇前三者入門學習。

Q:是自己設計開發板還是買成品開發板好?
A:如果動手能力強,硬件出身,時間充足,可以選擇自己設計和焊接開發板,但是由於量的關係,在PCB製版和器件採購方面價格可能不會低。
如果沒有那麼多時間,焊接水平也一般,建議直接購買成品開發板。現在國內賣ARM開發板的很多,價格也很便宜,比如ATMEL芯片的開發板可以到www.mcuzone.com購買。

開始學習
Q: 拿到開發板後應該注意什麼?
A:如果是自己設計的開發板,應該根據電路檢查和焊接。
如果是購買的開發板,應該檢查後,先根據使用說明,將開發板上電,看看板子有沒有反應(LED是否閃爍,串口是否有輸出),因爲一般的開發板賣出的時候板子上都燒好了演示的程序。這樣做的目的有二,一是可以驗貨,二是當以後調試中出現問題時,不會貿然懷疑硬件。

Q: ARM和一般單片機有什麼不同?
A:由於體系結構上的不同,ARM的處理器有不同的工作模式,在不同的模式下有不同的寄存器組可用。
建議瀏覽下面的書籍:
《ARM體系結構與編程》杜春雷 清華大學出版社 影印版

Q: 應該如何建立ARM的概念?
A:應該牢記ARM的各種處理器模式,各處理器模式下的寄存器組。
一些特殊用途的寄存器,比如LR,SP,PC,CPSR,SPSR的用法。
ARM的各種異常處理方式。
ARM,Thumb模式及轉換。
ARM的流水線,以便理解一些代碼中對PC的操作。
瞭解ARM的彙編語言,至少應該能看懂,建議瀏覽下面的文章:
常用ARM指令集及彙編(中文PDF,宛城布衣)

Q: 爲什麼ARM的開發中總是說到啓動代碼?
A:由於ARM只是一個處理器內核,各家芯片廠商獲得授權,將其配合自家的外圍設備構成一個完整的控制器芯片,就具有不同的外部設備和內存分佈,因此對這些特定的模塊有不同的初始化要求,這些一般都是很底層的操作,只能用匯編來實現。
甚至對於ARM內核本身,由於不同的處理器模式下有不同的堆棧,這個是和實現系統的內存分佈有關,必須由用戶指定,這部分代碼也是彙編。
各種處理器異常的預處理器代碼由於要和寄存器直接打交道,也是寫作彙編。
對於不同的執行速度要求的代碼,可能其在內存中的分佈不同,這個也需要加載的代碼。
因此,在ARM的開發中總是不能避免地要爲特定地控制器寫一些彙編的啓動代碼,設置好處理器模式,初始化好環境後再跳轉到main函數運行。

Q: 如何編寫啓動代碼?
A:除非是沒有官方的參考,或者極其了結這種處理器,否則不推薦從零開始自己寫啓動代碼。
目前,廠商一般會提供不少例程,這些例程中間都會提供啓動代碼,可以將其看懂之後,根據自己的需要修改。
特別的,目前一些開發環境也會自帶啓動代碼,比如keil,也可以選用,但是也需要看懂和裁減。

Q: 如何理解啓動代碼?
A:可以參考下面的文章:
理解啓動代碼(ADS版本)

Q: 正式開工前應準備些什麼?
A:硬件上需要準備一臺PC,一塊開發板,一個仿真器,一塊萬用表,一個電源(可選)。
軟件上需要找到一個合適的IDE,一些例程,仿真器對應軟件,必要的其它工具,比如串口終端等。
準備一份芯片的數據手冊,由於是新手入門,中文的最好。
好在現在不少公司提供中文數據手冊,比如ATMEL。
AT91SAM7S64中文數據手冊

開發工具
Q: 有哪些IDE可供選擇?
A:主要有ARM自己的ADS,RealView,IAR的EWARM軟件,Keil的uVision for ARM,ARM GCC等等。
這些IDE都有人使用,都有參考資料和例程。
值得一提的是keil,這個IDE相信用過51的應該都熟悉,現在其被ARM收購,在IDE中可以直接使用ARM的工具鏈,因此可以看作是ARM公司開發工具的另一個外殼。它的界面比較熟悉,而且有強大的軟件仿真功能(並不能完全等同硬件仿真),特別適合ARM微控制器的編程,同時使用ARM的工具鏈,也使得編譯效率值得信賴。
由於keil以前有過自己的ARM編譯器,但是效率一般,由於以上的原因,現在完全不建議使用。
雖然有不少的例子使用ADS建立工程,但是代碼基本不需要修改,只需要在keil中將工程重建即可完成從ADS到keil的轉換,具體請參考:
轉化ADS工程爲keil工程

Q: 如何實現代碼調試?
A:使用keil的話可以用軟件仿真的方式調試代碼,軟件仿真通過後再下載到板子上運行。需要注意的是,並不是所有的外設都可以仿真,而且軟件仿真並不能代表真實條件下的運行情況。
由於現在不少的器件提供了ISP下載的辦法,因此也可以通過ISP將程序下載到板子上測試。需要有足夠的經驗,並且至少需要一些底層的輸出信息才能方便調試,比如LED控制,串口輸出等。
比如ATMEL爲AT91系列提供了SAM-BA下載工具,可以通過DBGU或者USB口實現ISP編程,具體可以參考下面文章:
ATMEL SAM-BA(TM) and SAM-PROG 用戶手冊REV1.2(中文版)
硬件仿真方式,由於ARM處理器片上有DEBUG的支持,因此使用很簡單的硬件即可完成硬件調試的連接,比如wiggler,但是不同的調試器硬件有不同的速度和功能。在這裏需要明白,硬件斷點與軟件斷點,ARM7本身的片上調試部件硬件斷點只支持兩個,額外的斷點支持都需要看調試器的實現方式,比如在RAM中調試的時候,斷點數量不受限制,因爲RAM的內容是可以改寫的,而在flash中調試的時候,就需要注意,象wiggler這樣的調試器由於不支持flash斷點,因此整個調試過程中只有2個斷點可用,而且單步就需要佔用一個,實際空餘的就只有一個。而jlink由於支持flash斷點,因此對於內置flash的ARM微控制器,即使在flash中調試,斷點數量也不受限制,這也是不同的調試器有不同價格的原因。

Q: ARM JTAG調試方式是如何實現的?
A:JTAG(Joint Test Action Group)是一種硬件的診斷方式,是一個標準。JTAG提供了硬件控制方法,要完成調試還需要片上調試部件的支持。
可以瀏覽下面的文章來獲得更多信息:
IEEE Std 1149.1-1990 IEEE Standard Test Access Port and Boundary-Scan Architecture
ARM JTAG 調試原理

Q: ARM JTAG仿真器有哪些可供選擇?
A:視功能的不同,ARM的仿真器的價格也不同,對於初學者而言,選擇一個合適的仿真器是很重要的,太差的會影響調試的效率,太好的價格比較貴,而且在學習過程中不一定需要。
請瀏覽下面的ARM JTAG仿真器介紹文章:
常見ARM JTAG 仿真器介紹及選型指南
對於初學者,如果成本壓力比較大,可以選擇wiggler或者ulink。前者可以在大多數IDE中使用,而後者只能在keil的IDE中使用,因此非常適合選擇keil作爲IDE的網友。其實個人也推薦使用keil來學習基於ARM的內置flash的微控制器,原因在上面已經有描述。
在實際的使用中,ulink有的時候表現得不是很穩定。

Q: ARM JTAG仿真器是否還需要別的軟件支持?
A:確實需要別的軟件。由於仿真器只是一個連接ARM片上調試部件和PC上的調試器前端的硬件,還需要一個軟件來完成信息的交互。
這樣的軟件通常叫做調試代理,比如 Multi-ICE Server, H-JTAG等等。
一些IDE已經內置了一些調試代理,因此可以”直接”與仿真器通信,比如keil, IAR裏面的wiggler驅動等等。
在安裝完調試器的硬件驅動之後,還應該安裝這些調試代理軟件(如果需要),而且應該在調試中配置這些代理(如果需要),然後在開始調試代碼之前,都應該運行調試代理,並正確配置,使得調試軟件可以與硬件正常通信。
一些常用的ARM JTAG的仿真器的設置及與各種調試器的整合方法如下:
IAR 下使用Wiggler 和Multi-ICE 進行JTAG 調試和FLASH 下載--基於S64-DEK Rev2.0
J-Link中文用戶手冊Rev2.0詳細介紹了Jlink在ADS,RealView,IAR,Keil中的整合與調試設置。
H-JTAG使用說明詳細介紹了H-JTAG在各種IDE中的整合及調試設置。

程序開發
基於上面所陳述的原因,學習過程中選擇了:
IDE: Keil uVision3
ARM JTAG 仿真器: ULINK
ARM 學習板: http://www.mcuzone.com 的 S64-DEK 2.0

Q: 如何安裝keil IDE?
A:下載keil軟件後安裝即可。
如果是評估版本的軟件,編譯和仿真均有代碼大小限制。

Q: ULINK的驅動如何安裝?
A:安裝keil的時候就會安裝ULINK的驅動,因此,接上ULINK後,PC一旦識別出設備提示安裝驅動程序時,選擇自動就可以完成安裝。

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