配套課件-ARM原理與C程序設計_第1頁
配套課件-ARM原理與C程序設計_第2頁
配套課件-ARM原理與C程序設計_第3頁
配套課件-ARM原理與C程序設計_第4頁
配套課件-ARM原理與C程序設計_第5頁
已閱讀5頁,還剩1128頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一章ARM概述與開發(fā)環(huán)境1.1嵌入式系統(tǒng)的概念1.2ARM發(fā)展歷程及應用領域1.3ARM芯片級開發(fā)環(huán)境本章小結

1.1嵌入式系統(tǒng)的概念

數字技術和軟件技術是嵌入式系統(tǒng)的核心技術,其中,數字技術包括數字信號處理技術和數字化芯片技術,軟件技術包括芯片級的程序設計技術和操作系統(tǒng)級的程序設計技術。電路系統(tǒng)由傳統(tǒng)的模擬電子系統(tǒng)演化為以可編程數字化芯片為核心,添加必要的外設接口實現(xiàn)相應功能的嵌入式系統(tǒng),在三個相互關聯(lián)又相對獨立的技術領域表現(xiàn)突出,即以單片機為核心的嵌入式控制領域、以DSP(數字信號處理器)或FPGA(現(xiàn)場可編程門陣列)為核心的嵌入式數字信號處理領域和以ARM或SOC(片內系統(tǒng)芯片)為核心的嵌入式操作系統(tǒng)及其應用領域。1.1.1嵌入式系統(tǒng)與ARM的關系

廣義上講,凡是嵌入到應用系統(tǒng)中的電子系統(tǒng)可以統(tǒng)稱為嵌入式系統(tǒng),即使通用的計算機系統(tǒng),如果是嵌入在特定的應用系統(tǒng)中時,也可被稱為嵌入式系統(tǒng)。例如,在虛擬儀表系統(tǒng)中用于數據采集、分析和顯示的嵌入式計算機系統(tǒng)。狹義上講,嵌入式系統(tǒng)除具有硬件和軟件之外,還要求硬件系統(tǒng)具有體積小、重量輕、功耗低、成本低、可靠性高、可升級等特點,要求軟件系統(tǒng)具有體積小、可裁剪性、健壯性、專用性、實時性等特點。因此,從狹義上講,嵌入式系統(tǒng)硬件往往是以ARM芯片為核心的硬件平臺,嵌入式系統(tǒng)軟件為基于芯片級開發(fā)的無操作系統(tǒng)匯編或C語言實時性軟件,或者是基于嵌入式操作系統(tǒng)開發(fā)的圖形界面應用程序。而ARM是指ARM公司設計的基于RISC架構的32位高性能微處理器,一般采用哈佛總線結構,具有高速指令緩存和數據緩存,指令長度固定且多級流水執(zhí)行,具有MMU(存儲器管理單元)和AMBA(高級微處理器總線結構)總線接口等。ARM芯片除具有ARM核心外,通常還具有豐富的外設接口,例如,外擴RAM(隨機訪問存儲器)和FLASH控制器、LCD控制器、串行接口、SD接口、USB接口、I2C和I2S總線接口等,此外,ARM芯片還具有低功耗、體積小等特性。ARM芯片的高性能、多接口特點決定了其比單片機和DSP更適合作為嵌入式系統(tǒng)的核心微處理器,從而,ARM系統(tǒng)幾乎成了嵌入式系統(tǒng)的代名詞。1.1.2嵌入式系統(tǒng)與嵌入式操作系統(tǒng)的關系

一般地,嵌入式系統(tǒng)是面向特定的應用和環(huán)境,集成了硬件和軟件的單板機。嵌入式系統(tǒng)的硬件資源有限,突出地表現(xiàn)在其具有較小容量的RAM和ROM空間,通過外擴SD卡等存儲介質擴展存儲空間;嵌入式系統(tǒng)的軟件,包括嵌入式操作系統(tǒng)軟件,都固化在FLASH芯片中。因此,嵌入式操作系統(tǒng)軟件體積較小,一般在32?MB以下。嵌入式系統(tǒng)的軟件分為兩種:其一為直接基于ARM芯片開發(fā)的匯編或C語言實時性程序,這時的程序代碼負責管理ARM片上所有的資源,包括存儲空間和片上外設,程序除根據需要設計特定的功能之外,還要編寫ARM芯片初始化代碼和中斷向量表,更重要的是,程序在訪問嵌入式系統(tǒng)的硬件時,必須充分考慮硬件接口的時序特點;其二是為嵌入式系統(tǒng)定制多任務、實時的嵌入式操作系統(tǒng),嵌入式操作系統(tǒng)抽象了嵌入式系統(tǒng)的硬件訪問方式,通過提供API(應用程序接口)函數的方式,在嵌入式操作系統(tǒng)基礎上設計用戶應用程序,只需調用相應的API函數即可,使得嵌入式系統(tǒng)的應用程序設計工作更加簡單方便。嵌入式操作系統(tǒng)也具有桌面操作系統(tǒng)的特點,即管理硬件資源、調度軟件進程、處理軟件中斷等。嵌入式操作系統(tǒng)通常包括硬件驅動軟件、系統(tǒng)內核、設備驅動接口、文件系統(tǒng)、圖形界面等。嵌入式操作系統(tǒng)要求具有實時性、多任務、模塊化、可移植性、可定制等特點,流行的嵌入式操作系統(tǒng)有WindowsCE、嵌入式Linux、mC/OS-Ⅱ、VxWorks等。

因此,嵌入式系統(tǒng)可以表示為:

嵌入式系統(tǒng)=ARM硬件系統(tǒng)+嵌入式操作系統(tǒng)

+操作系統(tǒng)級應用軟件系統(tǒng)

或者

嵌入式系統(tǒng)=ARM硬件系統(tǒng)+芯片級應用軟件系統(tǒng)1.1.3嵌入式系統(tǒng)的研發(fā)特點

嵌入式系統(tǒng)研發(fā)可分為四類,即:首先,嵌入式系統(tǒng)的硬件平臺設計,需要根據應用環(huán)境選擇合適的ARM芯片,滿足處理速度和存儲深度的要求,同時,需要兼顧性價比和芯片特點與生存周期等因素。ARM芯片選型后,根據需要實現(xiàn)的功能添加相應的外設接口處理芯片和電源與時鐘芯片等,借助ProtelDXP等EDA軟件完成硬件平臺的原理性設計和PCB設計。目前,嵌入式系統(tǒng)硬件平臺的設計基本上實現(xiàn)了模型化設計,即ARM芯片與外設芯片的接口電路都形成了規(guī)范,只需要按“模型”將ARM芯片與所需外設芯片連接起來就可以得到特定的嵌入式系統(tǒng)硬件平臺。盡管如此,讀懂和分析這個“模型”仍然需要一定的電路基礎。其次,基于ARM芯片的芯片級匯編或C語言程序設計,這類程序包括系統(tǒng)初始化程序和特定功能的算法程序,要求設計者對ARM芯片工作原理和內部結構有較好的認識和理解,需要對匯編語言和指令以及C語言編程有一定的基礎。目前,芯片級軟件設計達到了框架化的水平,即在現(xiàn)有的框架程序的基礎上,添加特定的軟件功能達到程序設計的目的。因此,程序員需對框架程序有全面深入的了解,程序員的主要工作集中在使用C語言開發(fā)算法上。然后,嵌入式操作系統(tǒng)的定制和驅動程序的開發(fā),這類研發(fā)已經完全商業(yè)化。設計者可以根據自己選用的ARM芯片,直接購買到特定的相兼容的嵌入式操作系統(tǒng)軟件,只需要點幾下鼠標就可以定制出功能強大的專用嵌入式操作系統(tǒng),并且,嵌入式操作系統(tǒng)供應商也會提供幾乎所有常見外設的驅動程序,例如,觸摸屏、LCD屏、網口、串口、USB口等。如果設計者想自行研發(fā)具有獨立知識產權的嵌入式操作系統(tǒng),那么認真學好開源的μC/OS-II嵌入式操作系統(tǒng)是一個建設性的忠告。最后,基于嵌入式操作系統(tǒng)開發(fā)用戶應用程序,特別是開發(fā)具有良好圖形界面的用戶應用程序。這是對設計者的一個挑戰(zhàn)。基于不同的嵌入式操作系統(tǒng),開發(fā)應用程序的方式有很大的不同。嵌入式Linux和WindowsCE都提供了良好的界面設計支持,分別可以借助QT和VisualStudio進行應用軟件開發(fā)。用戶可能需要對基于事件消息驅動的編程有進一步的了解,同時,如果是基于WindowsCE,掌握?.NetFramework編程是一條簡捷的路徑。2008年西安電子科技大學出版社出版的《WindowsCE應用程序設計》一書在嵌入式應用程序開發(fā)方面能起到較好的引導作用。1.2ARM發(fā)展歷程及應用領域

自1985年第一個ARM1原型誕生至今(ARM公司成立于1990年),ARM公司設計的成熟ARM體系結構(或稱指令集體系結構ISA)有ARMv4、ARMv4T、ARMv5TE、ARMv5TEJ、ARMv6和ARMv7等,并且版本號還在不斷升級,對應的處理器家族有ARM7、ARM9、ARM9E、ARM10E、ARM11、Cortex、SecurCore和XScale等處理器系列。應用領域涉及商業(yè)、軍事、航天航空、網絡與無線通信、消費電子、醫(yī)療電子、儀器儀表和汽車電子等各行各業(yè)。1.2.1ARM發(fā)展歷程及命名規(guī)則

每個ARM處理器都對應于一個特定的ARM指令集體系結構版本,例如,ARM920T微處理器支持指令集體系結構ARMv4T。ARM體系結構的發(fā)展歷程如表1-1所示。

表1-1中列出了一些典型的ARM微處理器名稱,ARM微處理器是根據其具有的功能在“ARM”后添加字母來命名的,目前,這些字母有T、D、M、I、E、J、F、S,依次表示支持Thumb指令集、支持在線JTAG調試、內嵌乘法器、支持嵌入式ICE(在線斷點和調試)技術、增強DSP指令、支持Java技術、支持向量浮點處理、可綜合。ARM微處理器名稱中的數字用于反映處理器系列、存儲管理單元以及高速緩存等信息。1.2.2ARM微處理器系列

目前ARM微處理器主要有八個系列,即ARM7系列、ARM9系列、ARM9E系列、ARM10E系列、ARM11系列、Cortex系列、SecurCore系列、XScale系列等。各種系列微處理器均有其特點和應用場合。

1.ARM7微處理器系列

ARM7微處理器系列內核基于馮·諾依曼體系結構,數據和指令共用相同的總線,內核指令三級流水,支持ARMv4T指令集,包括ARM7TDMI、ARM7TDMI-S、ARM7EJ-S和ARM720T等微處理器核(其中,ARM7EJ-S執(zhí)行ARMv5TEJ指令集,五級流水,帶Java加速,可綜合;而ARM720T已被ARM926EJ-S替代)。

ARM7TDMI是目前非常流行的32位微處理器內核,例如,Samsung公司的S3C4510B芯片采用了該內核,它支持16位的Thumb指令集、快速乘法指令和嵌入式ICE調試技術。其S變種ARM7TDMI-S是可綜合的。

ARM720T處理器核集成了一個MMU(存儲器管理單元)和一個8?KB的高速緩存,支持WindowsCE、Linux、Symbian等實時嵌入式操作系統(tǒng)。

ARM7系列微處理器主要應用于無線接入手持設備、打印機、數碼相機和隨身聽等。

ARM7系列微處理器采用0.13mm、0.18?mm或0.25?mm工藝,主頻最高達130?MIPS,功耗很低,代碼與ARM9、ARM9E和ARM10以及XScale處理器兼容。

ARM7TDMI內核的結構框圖如圖1-1所示。圖1-1ARM7TDMI內核結構

2.ARM9微處理器系列

ARM9及其后更高系列的微處理器核均采用哈佛體系結構,數據總線與指令總線相互獨立,數據空間與程序空間相互獨立。ARM9系列微處理器核包括ARM920T和ARM922T兩種,具有五級指令流水線(處理速率可達1.1?MIPS/MHz),ARM922T是ARM920T的變種,其數據和指令高速緩存均為8?KB,而ARM920T的數據和指令高速緩存均為16KB。

32位的ARM9系列微處理器執(zhí)行ARMv4T指令集,具有兩種工作狀態(tài),即Thumb狀態(tài)和ARM狀態(tài),支持16位的Thumb指令集和32位的ARM指令集。主頻可達300?MIPS以上,具有一個32位的AMBA總線接口,具有MMU單元,支持WindowsCE、Linux和SymbianOS等嵌入式操作系統(tǒng)。ARM9核具有8出口的寫緩沖器,用于提高對外部存儲空間的寫速度。ARM9系列的生產工藝為0.13mm、0.15mm或0.18mm。

ARM9系列微處理器可用于PDA等高檔手持設備、MP5播放器等數字終端、數碼相機等圖像處理設備以及汽車電子方面。

ARM920T核的結構框圖如圖1-2所示。圖中,AMBA(AdvancedMicroprocessorBusArchitecture)為高級微處理器總線結構,AHB(AdvancedHigh-performanceBus)為先進高性能總線,該總線與APB(AdvancedPeripheralBus)總線協(xié)議隸屬于AMBAv2.0版本。圖1-2ARM920T內核結構

ARM920T核是本書的重點。

3.ARM9E微處理器系列

ARM9E微處理器系列目前包括ARM926EJ-S、ARM946E-S、ARM966E-S和ARM996HS等四個種類,都是可綜合的,采用五級指令流水技術(速率可達1.1?MIPS/MHz),在0.13?mm工藝下主頻可達300?MIPS,支持ARM、Thumb和DSP指令集,提供了浮點運算協(xié)處理器,可用于圖像和視頻處理。其中,ARM926EJ-S微處理器包含了Jazelle技術(硬件運行Java代碼,提高速度近8倍),集成了MMU,支持WindowsCE、Linux等嵌入式操作系統(tǒng)。

ARM9E核具有16出口的寫緩沖器,用于提高處理器向外部存儲空間寫數據的速度,支持ETM9,即具有實時跟蹤能力的嵌入式跟蹤宏單元,采用軟核技術,工藝為0.13?mm、0.15?mm或0.18?mm。

ARM9E微處理器可應用于網絡通信設備、移動通信設備、圖像終端、海量數據存儲設備、汽車智能化設備等。

其中,ARM926EJ-S微處理器執(zhí)行ARMv5TEJ指令集,其內核結構框圖如圖1-3所示,圖中,TCM(TightlyCoupledMemory)為緊耦合存儲器。圖1-3ARM926EJ-S內核結構這里解釋一下MMU、TCM和Cache的含義。

MMU(MemoryManagementUnit)存儲器管理單元是MPU(MemoryProtectionUnit)存儲器保護單元的升級。MPU將物理存儲空間映射到不同的區(qū)域,通過設置區(qū)域的屬性對區(qū)域進行訪問限制和保護,例如,ARM946E-S核包含MPU。此時,ARM的資源,即存儲器系統(tǒng)和外設都映射到某個或某些區(qū)域中。MPU中映射的區(qū)域地址與物理地址是一一映射關

系,即地址重疊的兩個程序將會競爭資源;而MMU則是通過頁表轉換器技術,將實際的物理存儲空間映射為虛擬存儲器,虛存是獨立于物理存儲空間的存儲空間,允許不同的程序使用相同的虛擬地址(MMU映射它們到不同的物理地址上),使得各個程序在各自獨立的存儲空間中運行而互不影響。

Cache即高速緩存,位于內核與存儲器之間,對于馮·諾依曼體系結構來說,指令和數據共用一個Cache;對于哈佛體系結構來說,指令Cache和數據Cache是分開的。由于內核的處理速率一般遠遠高于總線訪問存儲器的速率,為了保證內核全速運行,參與處理的數據或指令集一方面先由存儲器讀到Cache備用,另一方面,需要寫到存儲器的運算結果數據集可由高速Cache暫存,因此,Cache提高了內核的處理速率(高檔的處理器又分出一級Cache、二級Cache等)。

Cache的確提高了內核的性能,但是,程序代碼執(zhí)行的時間變得不可預測,因為,Cache裝載和存儲指令和數據的時間不可預測。而TCM緊耦合存儲器是緊貼內核的高速SRAM,用于保證取指令或數據操作的準確時鐘數,對于要求確定行為的實時算法研究很有幫助。

4.?ARM10E微處理器系列

ARM10E微處理器系列中主推ARM1026EJ-S核,該高性能微處理器核是完全可綜合的軟核,執(zhí)行ARMv5TEJ指令集,六級指令流水(速度可達1.35?MIPS/MHz,經Dhrystonev2.1測試),支持ARM、Thumb、DSP和Java指令,支持高性能硬件Java字節(jié)代碼執(zhí)行,同時具有MPU和MMU,支持實時操作系統(tǒng)和WindowsCE、Linux、JavaOS等嵌入式操作系統(tǒng)。Dhrystone是1984年ReinholdP.Weicker開發(fā)的用于測量微處理器運算能力的基準程序,常用于處理器整形運算性能的測量,用C、Pascal或Java編寫,其計量單位為多少次Dhrystone,后來把在VAX-11/780機器上的測試結果1757?Dhrystones/s定義為1?DhrystoneMIPS,即1?DMIPS。)

ARM1026EJ-S具有獨立的指令高速緩存和數據高速緩存,緩存大小從4?KB至128?KB可配置;具有獨立的數據TCM和指令TCM,TCM支持插入等待狀態(tài),并且大小從0至1?MB可配置;具有雙64位/32位AMBAAHB總線接口。ARM1026EJ-S主要應用于高級手持通信終端、數字消費電子、汽車自動駕駛和復雜工業(yè)控制系統(tǒng)等。

ARM1026EJ-S的內部結構框圖如圖1-4所示,圖中的VIC(VectoredInterruptController)為向量中斷控制器。圖1-4ARM1026EJ-S內核結構

5.ARM11微處理器系列

ARM11執(zhí)行ARMv6指令集,指令八級流水執(zhí)行,于2003年發(fā)布,包括ARM1136J(F)-S、ARM1156T2(F)-S、ARM1176JZ(F)-S單核微處理器和ARM11MPCore多核微處理器(最多四核)等四個系列。ARM11系列微處理器具有低功耗(0.6?mW/MHz,0.13?mm,1.2?V)、處理高性能(例如具有獨立的裝入/存儲和算術運算流水線)、存儲高效能(例如具有優(yōu)化的TCM等)等特點,主要應用于數字TV、機頂盒、游戲終端、汽車娛樂電子、網絡設備等。

ARM1136JF-S的結構框圖如圖1-5所示。圖1-5ARM1136JF-S內核結構

6.Cortex微處理器系列

Cortex微處理器系列包括三個系列,即Cortex-A、Cortex-R和Cortex-M,均支持Thumb-2指令集。其中,Cortex-A支持復雜操作系統(tǒng)和用戶應用,有Cortex-A8和Cortex-A9(單核/多核)等;Cortex-R面向實時應用,有Cortex-R4(F)和Cortex-R4X等;Cortex-M進行了內存和功耗優(yōu)化,僅支持Thumb-2指令集,包括Cortex-M3和Cortex-M1等。

7.SecurCore微處理器系列

SecurCore系列微處理器面向智能卡、電子商務、銀行、身份識別、電子購物等信息安全設備等方面的應用,包括SC100、SC200和SC300微處理器,具有高性能和極低功耗等特點。其中,SC100是基于ARM7TDMI內核帶有MPU的安全內核,而SC200還支持JavaCard2.x加速和其他增強性能。

8.XScale微處理器系列

XScale微處理器是StrongARM的優(yōu)化改良,獨家許可給Intel公司(現(xiàn)在XScale代工完全轉讓給Marvell公司),基于哈佛結構,具有獨立的32?KB數據Cache和32?KB指令Cache,五級流水,指行ARMv5TE架構指令,包括MMU,具有動態(tài)電源管理特性,工作頻率可達1?GHz,0.18?mm生產工藝,多媒體處理能力得到增強。XScale微處理器代表芯片為PXA270和PXA320等,主要應用于GPS定位系統(tǒng)、無線網絡設備、娛樂和消費電子等。1.2.3ARM微處理器應用領域

ARM微處理器在數據密集型應用(例如視頻、圖像和數字信號處理等)以及控制密集型應用(例如流程控制、工業(yè)控制等)方面均得到了廣泛的應用,且具有加載嵌入式操作系統(tǒng)和實時操作系統(tǒng)的能力,因此,ARM系統(tǒng)在完成特定功能的同時,往往具有友好的人機交互界面,有取代傳統(tǒng)的單片機和DSP的趨勢。

總體而言,ARM在以下幾個方面具有優(yōu)勢:其一,ARM芯片的生產與設計是分離的。ARM公司僅設計ARM核,通過出售ARM核知識產權給OEM公司而與OEM公司建立合作關系,OEM公司可以在ARM核的基礎上(不能改變ARM核)添加特定的外設,生產出具有各自特色的芯片,OEM公司出售芯片給第三方用戶。這種經營運作方式帶有全球性、共享性和非壟斷性,在ARM生產與銷售上達到了共享和私有的統(tǒng)一。其二,ARM公司推廣軟核設計。這是一種可定制內核的構架內核技術,面向特定的應用,使得構架后的ARM核更具有專用性,而ARM內核的構架設計具有通用性,在ARM內核設計上達到了專用性與通用性的統(tǒng)一。

其三,ARM公司推廣定制設計。ARM公司根據第三方用戶的需要進行內核定制,要求第二方OEM公司進行代工,這種針對第三方用戶的定制設計使得ARM芯片的應用不但具有專一性,而且能高效地節(jié)省成本,即直接針對應用對內核進行了優(yōu)化和裁剪,同時片上外設進行了相應的去冗留精。在這方面,ARM芯片達到了應用與設計的統(tǒng)一。其四,ARM公司推廣SOC芯片,即集成了一片或多片ARM、DSP、FPGA等數字化芯片的統(tǒng)一內核,用以彌補單核應用的不足。多核處理器主要是面向高端應用,這樣,ARM公司形成了自低端至高端的完整研發(fā)策略,且低端至高端的應用具有共同性,每個設計人員從第一次接觸ARM芯片后,都能在較短的時間內借助“慣性”充分地掌握如何利用ARM系列芯片進行特定項目的設計開發(fā)。

ARM的這些特點,使得數字化電子設計的硬件設計和軟件開發(fā)逐漸走向規(guī)范化、標準化和系列化,這對于時間有限的研發(fā)人員來說,是期待已久的。研發(fā)人員只需要具有一套仿真設備、一套EDA軟件、一系列ARM平臺,就可以應對整個數字化領域的研發(fā)設計。高等院校是推廣ARM應用的主要場所,目前幾乎所有高校的電子、通信、計算機、軟件、應用數學等相關專業(yè)都開設了ARM類課程。而ARM在數字圖像處理、數字信號處理、人工智能、機器人、生物醫(yī)學、特征識別、網絡通信、視頻處理與壓縮、語音處理、雷達技術、編碼技術等技術領域都深深涉足。

1.3ARM芯片級開發(fā)環(huán)境

ARM芯片級的開發(fā)環(huán)境由ARM開發(fā)板(或實驗箱)、仿真器、計算機以及ARM開發(fā)軟件等組成。借助于ARM仿真器在線調試程序的過程稱為仿真階段,而將程序下載到ARM開發(fā)板的FLASH上脫離仿真器工作的過程稱為自舉運行階段。仿真階段是自舉運行階段的仿真測試運行準備時期,對項目的整個研發(fā)過程起著重要的試金石作用。1.3.1仿真環(huán)境建設

ARM開發(fā)環(huán)境包括硬件和軟件兩部分,其中,硬件主要包括ARM仿真器和集成了ARM芯片(例如S3C2440A等)的開發(fā)板或實驗箱,提供了JTAG在線仿真接口;軟件主要有RealViewDeveloperSuite(簡稱RVDS)和H-JTAG等。前者是ARM公司研發(fā)的使用匯編或C/C++語言開發(fā)ARM程序的集成開發(fā)環(huán)境,而后者是ARM芯片的仿真服務器程序(),用于連接ARM芯片和計算機上的RVDS仿真軟件。我們使用過大多數公司研發(fā)的ARM實驗箱后,最終選取了北京博創(chuàng)科技()和深圳技創(chuàng)科技()的ARM9實驗平臺作為硬件工作平臺(其中,博創(chuàng)為S3C2410,技創(chuàng)為S3C2440),并將在第二章中綜合這兩個平臺的特點,公開一個相對完整的ARM系統(tǒng)原理圖。本書的所有程序均以這兩個平臺和這個原理圖為基礎,由于ARM核心的兼容性,這些程序也可以運行在其他公司的ARM實驗箱上(包括ARM7、ARM10、ARM11等)。除了ARM公司的ARM開發(fā)軟件RVDS之外,一些專業(yè)軟件開發(fā)商也提供了ARM開發(fā)軟件,每種ARM開發(fā)軟件都有其優(yōu)缺點,目前這些軟件均為商業(yè)化軟件。本書寫作之時,RVDS的版本號已升至v4.0以上。本書第一至三章采用RVDS軟件,其版本號為2.2,針對ARM9來說,該版本能完全發(fā)掘ARM9的功能。在ARM仿真服務器軟件上,我們選用了H-JTAG軟件(不但這個軟件,而且這個軟件的作者也提供了實質性的幫助)。從第四章開始,將使用RealViewMDK軟件(Keil公司開發(fā)的被ARM公司收購的軟件)。第一至三章的程序都將工作在仿真環(huán)境下。完成對ARM匯編語言指令的測試,使用RVDS軟件十分方便,本節(jié)重點介紹RVDS仿真環(huán)境建設。第四章時將具體介紹RealViewMDK和ULINK2的使用方法。當然,本質上這兩個軟件是統(tǒng)一的。

1.硬件平臺介紹

這里重點介紹博創(chuàng)經典UP-NETARM2410教學科研系統(tǒng),如圖1-6所示。圖1-6UP-NETARM2410實驗箱

UP-NETARM2410實驗箱由核心模塊和主機板構成。其中,核心模塊包括基于ARM920T(編號:0x0032409D)內核的SAMSUNGS3C2410處理器芯片、64?MB的SDRAM、64?MB的NandFLASH和一個IO口控制的LED燈;主機板提供了核心模塊的外設擴展資源,如8英寸的640×480TFT真彩LCD屏、觸摸屏、8×8矩陣LED顯示模塊、1個中斷按鍵、17鍵數字鍵盤、2位LED數碼管、直流電機模塊、主從USB口、SD/MMC接口、網卡接口等,同時,還提供了一個168針的擴展槽,用于擴展GPS/GPRS等模塊。

UP-NETARM2410實驗箱采用單+12?V電源供電。打開實驗箱后,將配套的12?V電源適配器與實驗箱連接好(電源插口在實驗箱的左上角),然后,使用并口線把計算機的并口與實驗箱的JTAG并口相連接(JTAG并口在實驗箱的左上方)。檢查連接正確后,撥動實驗箱左上角的開關,實驗箱進入上電工作狀態(tài)(出廠配置為嵌入式Linux)。

總之,硬件平臺需要一臺帶并口的計算機(如果使用USB口ARM仿真器,則只需要USB口即可,例如第四章的ULINK2)、并口線、ARM實驗箱等。

2.H-JTAG使用方法

截止本書定稿之時,H-JTAG軟件的最高版本為v0.8.0,下載并安裝完軟件后,點擊菜單“Settings|LPTJTAGSetting”,設置并口管腳連接如圖1-7所示(針對UP-NETARM2410實驗箱,實驗箱上的跳線JP1連接1-2腳,JP1位于左上方;不同的實驗箱需視原理圖而定)。

如圖1-7設置完成后,點擊“OK”按鈕,出現(xiàn)如圖1-8所示界面,表示H-JTAG服務器已經啟動且工作正常。圖1-7H-JTAG并口連接設置圖1-8H-JTAG服務器注意:計算機并口應設為EPP工作模式。

此外,H-JTAG軟件還提供了H-Flasher和H-Converter功能,即通過JTAG口訪問FLASH芯片和目標文件格式轉化功能,這兩個功能非常實用。

3.RVDS仿真環(huán)境

將H-JTAG服務器最小化到任務欄托盤,如圖1-9所示。圖1-9H-JTAG服務器后臺運行安裝RVDS軟件后從開始菜單中運行“所有程序|ARM|RealViewDeveloperSuitev2.2|RealViewDebuggerv1.8”(如果彈出“ListSelection”對話框,則選擇“ARM”,單擊“OK”按鈕,這個對話框配置匯編語言代碼配色方案),進入“RVDEBUG”窗口,點擊菜單“Target|ConnecttoTarget…Alt+0”(快捷鍵Alt+數字鍵0),進入“ConnectionControl”對話框,在對話框中點擊鼠標右鍵,選擇“Add/Remove/EditDevices…”,進入“RDITargetList”對話框,選擇“AddDLL…”,將“C:\ProgramFiles\H-JTAG\H-JTAG.dll”添加至該對話框中,并在H-JTAG.dll前勾選,點擊“Close”按鈕關閉“RDITargetList”對話框,此時,“ConnectionControl”對話框如圖1-10所示。圖1-10配置好的ConnectionControl對話框關閉圖1-10所示對話框,回到“RVDEBUG”窗口,如圖

1-11所示。圖1-11連接目標板后的程序仿真調試窗口點擊圖1-11中的菜單“File|Open…Ctrl+O”,彈出“SelectFiletoOpen”對話框,在“文件類型(T)”中選擇“Executable[*.axf;*.out;*.alf…”,然后,找到需要仿真的可執(zhí)行文件(一般擴展名為?.axf),點擊“打開”按鈕即進入到仿真環(huán)境。仿真界面將出現(xiàn)一個紅色的長條框,其框住的語句為當前的PC指針。點擊圖1-11中的圖標“LowLevelStepInto”可單步調試程序。

在圖1-11中,點擊菜單“View|Registers”可查看寄存器情況,寄存器值可以十六進制數或十進制數等格式顯示;點擊菜單“View|Memory”可查看程序存儲器結果,可設置存儲器單元地址的值。一般地,進入代碼編輯器“CodeWarriorforRVDS”后,進行源文件的編輯、編譯和連接,連接成合法的目標文件后,在“MetrowerksCodeWarrior”窗口中點擊菜單“Project|DebugF5”或直接按下F5鍵,或點擊窗口工具欄中的“Debug”圖標,可進入圖1-11,并自動裝載目標文件(RVDEBUG在首次使用時配置好后將保持配置不變)。1.3.2程序仿真實例與解釋

如上一節(jié)所述,首先準備硬件平臺;然后,使用并口線連接計算機與ARM實驗箱,打開計算機和ARM實驗箱電源;接著,在計算機上打開H-JTAG軟件,并出現(xiàn)如圖1-8所示界面,表示仿真環(huán)境已經建立好。最后,點擊開始菜單“所有程序|ARM|RealViewDeveloperSuitev2.2|CodeWarriorforRVDS”,進入代碼編輯窗口,如圖1-12所示,在其中編寫匯編語言或C/C++語言源程序,其中,匯編語言源程序擴展名為?.s。圖1-12CodeWarrior代碼編輯器窗口

1.程序代碼編寫

在圖1-12中點擊菜單“File|New…Ctrl+Shift+N”,如圖1-13所示,新建一個工程文件,文件名為ex1_1(擴展名自動添加為?.mcp),路徑為D:\ARM9BOOK\ex1_1,工程文件類型為“ARMExecutableImage”,即ARM可執(zhí)行映像文件。點擊“確定”按鈕將創(chuàng)建工程文件。圖1-13新建工程文件創(chuàng)建工程文件ex1_1.mcp后,再次點擊菜單“File|New…Ctrl+Shift+N”,在彈出的“New”對話框中選擇“File”選項卡,如圖1-14所示,選中“TextFile”,在“Filename:”文件名欄中輸入“init.s”,即匯編語言源程序文件名為init.s,“Location”中輸入文件存儲位置為“D:\ARM9BOOK\ex1_1”,勾選“AddtoProject”,將init.s加入到工程ex1_1.mcp中,并勾選“Debug”項(Debug表示編譯連接時將向目標文件中添加調試信息和符號,Release表示編譯連接成無調試信息的可執(zhí)行目標文件,一般稱為發(fā)行版本,比調試版本字節(jié)少一些)。圖1-14新建源程序文件點擊圖1-14中的“確定”按鈕,然后,輸入代碼并存盤,如圖1-15所示。圖1-15輸入源程序后的工程至圖1-15,具有一個源文件init.s的工程文件ex1_1.mcp已創(chuàng)建完成(這些指令的理解將在1.3.2節(jié)的3.?和第三章中闡述)。點擊菜單“Edit|DebugSettings…Alt+F7”或者點擊工具欄中的“DebugSettings…”按鈕,彈出“DebugSettings”對話框,如圖1-16所示。按圖1-16設置“ROBase”(可執(zhí)行映像文件的只讀段碼起始地址)為0x30000000,點擊“OK”按鈕完成設置。圖1-16DebugSettings設置在此,闡述一下圖1-16的配置含義:RVDS生成的目標文件被稱為映像文件,擴展名為?.axf,這種類型用于調試,如果要下載到FLASH中,需要轉化為?.bin文件。借助于RVDS進行ARM程序設計的過程包括兩個階段:其一為在計算機上編寫程序代碼,并編譯連接成可執(zhí)行文件;其二為將可執(zhí)行文件下載到ARM核心板上調試運行。所以,這個過程被稱為交叉調試??蓤?zhí)行的映像文件本身包含兩部分:即包含了ARM指令代碼和只讀數據的只讀碼段以及包含可讀寫數據和未初始化數據的讀寫碼段。映射文件在下載到目標板上時,需要指定其各個段的下載地址,圖1-16中“ROBase”指定只讀段碼的起始位置,“RWBase”指定可讀寫段碼的起始位置,如果不指定,則只讀段碼放置完后,緊接著存放可讀寫段碼。此外,還可以為未初始化的數據段單獨分配空間,這需要在圖1-16中的“Linktype”組合框中點選“Scattered”,然后,添加Scatter存儲配置文件。我們建議讀者使用圖1-16給出的“Simple”方法。圖1-16中的“ROBase”指定為0x30000000,僅當UP-NETARM2410實驗箱為出廠配置時才能使用;如果讀者更改了存儲器配置,則此處應填寫0x40000000,且仿真程序代碼段長度不能大于4?KB(將在第四章介紹)。

關閉圖1-16后,點擊菜單“Project|MakeF7”或直接按下F7鍵,或者點擊工具欄中的“Make”按鈕,均可編譯連接工程形成可執(zhí)行目標文件ex1_1.axf,該文件位于目錄“D:\ARM9BOOK\ex1_1\Debug”下。如果程序編譯連接出錯,需要改正出錯的語句,直到編譯連接成功。

2.程序調試

編譯連接成功后,在圖1-15中,點擊菜單“Project|DebugF5”或點擊工具欄中的“Debug”按鈕,進入圖1-17。如果裝入不成功,則勾選圖1-17右側的“Load”即可。在圖1-17中,點擊工具欄上的“LowLevelStepInto”按鈕,可單步執(zhí)行程序,此時可觀察到左側寄存器中的R0和R1值會發(fā)生相應的變化,執(zhí)行完成后,如圖1-18所示,R0為十六進制數D,即十進制數13,R1的值為3。圖1-17調試窗口圖1-18程序調試完成

3.程序代碼解釋

工程ex1_1.mcp

中文件init.s的內容如下:

1 AREA INIT,CODE,READONLY

2 ENTRY

3start

4 MOV R0,#10

5 MOV R1,#3

6 ADD R0,R0,R1

7stop

8 BL stop

9 END其中,start和stop必須頂格寫。上面程序代碼的含義如下:

第一行:創(chuàng)建具有只讀特性命名為INIT的代碼段;

第二行:ENTRY為匯編語言程序入口點;

第三行:start為程序標號;

第四行:R0賦值為10;

第五行:R1賦值為3;

第六行:R0(10)+R1(3)后的值賦于R0(13);

第七行:stop為程序標號;

第八行:跳轉到標號stop處;

第九行:END表示匯編語言程序段結束。

將在第三章和第五章中進一步講述相關內容。本章小結

本章首先討論了嵌入式系統(tǒng)和嵌入式操作系統(tǒng)的概念;接著論述了ARM的發(fā)展歷程及其應用領域,特別是對ARM家族每個處理器系列進行了對比闡述;最后,基于博創(chuàng)UP-NETARM2410實驗箱(以后簡稱ARM9實驗箱),詳細介紹了ARM芯片級的交叉開發(fā)環(huán)境。第二章ARM體系結構與接口電路2.1ARM微處理器工作模式2.2ARM寄存器2.3ARM異常2.4S3C2410存儲器配置及接口電路設計2.5S3C2410外設接口電路設計本章小結2.1ARM微處理器工作模式

ARM微處理器支持三種數據類型,即32位的字、16位的半字和8位的字節(jié)。對于無符號數,取值范圍為0~2N-1,為普通二進制碼存儲格式;對于有符號數,取值范圍為-2N-1~+2N-1-1,為二進制補碼存儲格式,其中,N取8、16或32,為數據字長。ARM指令嚴格占一個字或四個連續(xù)字節(jié)(且首字節(jié)地址最后兩位為00比特)的存儲空間。

目前,ARM體系結構支持七種處理器模式,如表2-1所示。表2-1中的模式碼是指寄存器CPSR(當前程序狀態(tài)寄存器)中的低5位,即CPSR[4:0]。需要說明的是,對于ARM920T核心的S3C2410A處理器,上電復位后工作于管理模式。工作模式之間可以通過MSR指令、軟中斷、外部中斷或異常等切換。上電復位后,可執(zhí)行指令“MSRCPSR_c,#0x10”由管理模式切換到用戶模式,大多數應用程序工作在用戶模式下。進入用戶模式后,只能通過異常才能切換到其他工作模式,應用程序不能訪問一些受保護的系統(tǒng)資源。用戶模式和系統(tǒng)模式之外的五種工作模式統(tǒng)稱為特權模式,特權模式下,可以訪問所有系統(tǒng)資源,工作模式可以借助MSR指令隨意切換,每種特權模式都有一些專用寄存器,用于保存其工作狀態(tài)。系統(tǒng)模式與用戶模式共用相同的寄存器,但是,系統(tǒng)模式屬于特權模式,它能訪問所有系統(tǒng)資源,可隨意切換工作模式,主要供需要訪問所有系統(tǒng)資源的操作系統(tǒng)任務使用。

2.2ARM寄存器

ARM寄存器都是32位的,其組織如圖2-1所示。

從圖2-1中可以看出,每種模式下最多可訪問的寄存器個數為18個,其中,用戶模式和系統(tǒng)模式下只能訪問17個寄存器。圖2-1中同名的寄存器具有相同的物理寄存器,而帶有沙粒三角形的寄存器則具有獨立的物理寄存器,例如,R0在七種工作模式下都映射到同一個物理寄存器,而R13、R13_svc、R13_abt等表示在不同工作模式下映射到不同的物理寄存器。圖2-1ARM寄存器組織這樣,ARM共有37個物理寄存器,即未分組的寄存器R0~R7映射的8個物理寄存器+分組的寄存器R8~R14映射的22個物理寄存器+程序計數器PC和當前程序狀態(tài)寄存器CPSR映射的2個物理寄存器+異常模式下備份程序狀態(tài)的寄存器SPSR映射的5個物理寄存器=37(圖2-1上名稱完全相同的寄存器只能計數一次,則數遍圖上所有的寄存器,剛好得到37)。

一般地,如果某條指令可以使用R0,則它也可以使用R1~R13的其他寄存器。在所有工作模式下,R0~R7都對應于相同的物理寄存器,因此,在工作模式切換時,這些寄存器的數據可以直接使用,同時,原來的數據就有可能被破壞。因此,R0~R7稱為未分組的寄存器,用于存放數據。

R8~R12在快速中斷模式時映射到獨立的物理寄存器,這些寄存器均加了后綴_fiq,而在其他工作模式下均映射到相同的物理寄存器,這樣R8~R12共占有了10個物理寄存器,一般用于存放數據。R13通常用于堆棧指針(SP),保存當前工作模式下的堆棧棧頂;R14被稱為鏈接寄存器(LR),保存子程序調用或跳轉時的返回地址。R13和R14在五種異常模式下都有其獨立的物理寄存器,因此,R13和R14共占有12個物理寄存器。PC即R15,為程序計數器,存放的是處理器要取的下一條指令的地址(具體地址與流水線個數有關),在七種工作模式下占有同一個物理寄存器。R8~R14被稱為分組寄存器,這些寄存器在工作模式切換時,原有工作模式下的寄存器不能被訪問,而使用新工作模式下的同名寄存器替代,這樣,原來的寄存器的數據得到了保護。上述R0~R15通稱為通用寄存器,即這些寄存器可以保存數據(或指令數據),也可以用于保存指令地址。此外,還有兩個專用寄存器,用于保存當前程序的工作狀態(tài),即CPSR和異常模式下保存CPSR值的寄存器SPSR,這兩個寄存器占有6個物理寄存器。

需要重點指出的是,ARM微處理器工作模式雖然可以切換,但是,其工作模式確定后,ARM微處理器僅能訪問圖2-1上該模式下的寄存器。2.2.1通用寄存器

通用寄存器包括未分組寄存器R0~R7、分組寄存器R8~R14和R15(即PC)。如圖2-1所示,分組寄存器在某些異常模式下映射為獨立的物理地址,此時的寄存器名稱被描述為

<寄存器名>_<mode>,例如,圖2-1中的R8_fiq和R13_und等,其中,mode分別取為svc、abt、und、irq或fiq等,用戶模式和系統(tǒng)模式的寄存器名可以添加后綴_usr和_sys。需要指出的是,在RVDS程序設計時,只需使用寄存器名。

以寄存器R13為例,仿照第1.3.2小節(jié)的1.?和2.?的內容調試如下的程序(注意圖1-16的設置),可以看到不同工作模式下R13的值是不同的。

1AREA INIT,CODE,READONLY

2ENTRY ;EnterSVCMode

3MOV R13,#0xAA

4MSR CPSR_c,#0x11 ;EnterFIQMode

5MOV R13,#0xBB

6MSR CPSR_c,#0x12 ;Enter

IRQMode

7MOV R13,#0xCC

8MSR CPSR_c,#0x1F ;EnterSYSMode

9MOV R13,#0xDD

10MSR CPSR_c,#0x13 ;EnterSVCMode

11MOV R0,#0x5512MSR CPSR_c,#0x11 ;EnterFIQMode

13MOV R0,#0x55

14MSR CPSR_c,#0x12 ;EnterIRQMode

15MOV R0,#0x55

16MSR CPSR_c,#0x1F ;EnterSYSMode

17MOV R0,#0x55

18MSR CPSR_c,#0x13 ;EnterSVCMode

19MOV R0,#0x55

20stop

21BL stop

22END程序的解釋如下(R13在RVDEBUG中的寄存器視圖中為SP):

第1行:定義只讀代碼段INIT;

第2行:標識程序入口,程序復位后進入SVC模式;

第3行:在SVC模式下,R13置成0xAA;

第4行:進入FIQ模式;

第5行:在FIQ模式下,R13置成0xBB;

第6行:進入IRQ模式;

第7行:在IRQ模式下,R13置成0xCC;

第8行:進入SYS模式;

第9行:在SYS模式下,R13置成0xDD;

第10行:再次進入SVC模式;第11行:在SVC模式下,R0置成0x55,此時,可以看到R13的值為0xAA;

第12行:再次進入FIQ模式;

第13行:在FIQ模式下,R0置成0x55,此時,可以看到R13的值為0xBB;

第14行:再次進入IRQ模式;

第15行:在IRQ模式下,R0置成0x55,此時,可以看到R13的值為0xCC;

第16行:再次進入SYS模式;

第17行:在SYS模式下,R0置成0x55,此時,可以看到R13的值為0xDD;

第18行:再次進入SVC模式;第19行:在SVC模式下,R0置成0x55,此時,可以看到R13的值為0xAA;

第20、21行:死循環(huán)跳轉;

第22行:程序段結束標志。

從程序的運行情況可以看出,R13在不同的工作模式下雖然具有相同的標識名,但對應于不同的物理寄存器,它們的賦值互不影響(注意:R13一般用作SP指針,上面的賦值意義不大,僅用于說明分組寄存器在不同的工作模式下對應不同的物理寄存器這一特點)。2.2.2程序狀態(tài)寄存器

32位的當前程序狀態(tài)寄存器(CPSR)分為4個8位區(qū)域,從高位至低位依次為標志位域(CPSR_f)、狀態(tài)位域(CPSR_s)、擴展位域(CPSR_x)和控制位域(CPSR_c)。每種異常模式下都各有一個備份CPSR值用的寄存器,稱為備份的程序狀態(tài)寄存器(SPSR),用于異常發(fā)生時保存CPSR的值(用戶模式和系統(tǒng)模式下沒有SPSR)。

CPSR(或SPSR)寄存器位如圖2-2所示。圖2-2CPSR寄存器位的含義圖2-2中各位分為四類:其一,保留位,為后續(xù)ARM版本擴展功能保留的位,圖中使用Res、RESERVED標記這些位;其二,用戶模式下可寫的位,這些位為N、Z、C、V、Q、E和GE[3:0],其中,Q出現(xiàn)在ARMv5E以上版本中,E和GE[3:0]在ARMv6以上版本中,所有這些位特權模式下也均可寫;其三,特權模式下可寫的位,這些位為A、I、F和M[4:0],用戶模式下無法向這些位寫入,其中,A用于ARMv6以上版本;其四,執(zhí)行狀態(tài)位,這些位為J和T,在ARM狀態(tài)下必須為0。注意:所有CPSR的各位,在用戶模式下都是可以讀出的。

對CPSR的訪問操作一般是這樣的:如果想設置某位或某幾位,先執(zhí)行指令MRS讀出CPSR的值;然后,借助于與、或、異或等位操作僅把需要設置的位賦值,不需要設置的位的值保持不變;最后,執(zhí)行MSR指令把設置好的值寫回CPSR。

1.條件碼標識位

圖2-2的第31位至28位依次為N、Z、C和V,被定義為條件碼標識位,取自Negative、Zero、Carry和oVerflow中的大寫字母。一般地,算術、邏輯和賦值指令后添加S(目的寄存器不是R15)或比較指令(如CMN、CMP、TEQ和TST)等的執(zhí)行會影響CPSR中的條件碼標識位。此外,MSR、MRC(目的寄存器為R15)、LDM指令的某些變種、特權模式下使用REF指令從存儲器向CPSR裝入數據、目的寄存器為R15的少數算術和邏輯指令變種等的執(zhí)行也會影響條件碼標識位。對于二進制補碼表示的有符號數運算,N=1表示運算結果為負,N=0表示結果大于或等于0。Z=1表示運算結果為0,Z=0表示運算結果非0。C有兩種情況:對于加法指令(包括CMN),當C=1時表示有進位,當C=0時表示無進位;對于減法指令(包括CMP),當C=0時有借位,C=1時無借位。無論操作數是否為二進制補碼表示的有符號數,只要V=1,則表示最高位發(fā)生溢出,否則,V=0表示無溢出。

2.中斷狀態(tài)位

圖2-2中CPSR的第7位和第6位依次為I和F,用于表示中

斷狀態(tài)。如果I=1,則IRQ中斷被屏蔽;如果I=0,則IRQ中斷使能。如果F=1,則FIQ中斷被屏蔽;如果F=0,則FIQ中斷被使能。

3.工作模式位

第2.1節(jié)中指出ARM有七種工作模式,工作于哪種模式受CPSR中的工作模式位M[4:0]控制,這些位處于CPSR寄存器的低五位,即圖2-2中的第4~0位。工作模式位的含義如表2-2

所示。2.2.3PC與指令流水線

流水線是RISC處理器執(zhí)行指令的方式,ARM7支持三級流水線,ARM9支持五級流水線,ARM10支持六級流水線。ARM9與ARM7相比,指令吞吐量增加了約13%。ARM7和ARM9的流水線如圖2-3所示。圖2-3ARM7和ARM9的流水線對于五級流水線來說,每個機器周期內可以有五個指令的不同階段同時處理,但只有一條指令處于執(zhí)行階段,其他四條指令處于取指、譯碼、存儲和寫階段。當某條指令正處于執(zhí)行階段時,PC寄存器指向此時要取指的指令,對于ARM7和ARM9來說,如圖2-3所示,PC指向該正在執(zhí)行的指令的地址加上2條指令的地址。對于所有流水線來說,執(zhí)行階段與取指階段間的管道數乘以每條指令所占的字節(jié)數,再加上當前正處于執(zhí)行階段的指令地址,即為PC指向的下一條指令的地址。對于ARM7和ARM9來說,雖然流水線級數不同,但是執(zhí)行階段與取指階段間的管道數均為2,所以,PC指向的下一條指令的地址均為當前處于執(zhí)行階段的指令地址+8字節(jié)(每條32位的ARM指令占有4個字節(jié))。對于ARM10和ARM11等,按相同的方法推理PC的值。

2.3ARM異常

異常是由內部或外部的觸發(fā)源引起的,異常發(fā)生后,ARM處理器將中斷當前的操作,而跳轉到異常向量地址處執(zhí)行異常服務程序(或稱中斷服務程序)。除了上電復位異常之外,其他的異常服務程序跳轉執(zhí)行前,處理器將自動保存當前的程序狀態(tài),異常服務程序執(zhí)行完畢后,將返回到被中斷的程序處繼續(xù)執(zhí)行。

異常向量表如表2-3所示。異常發(fā)生后,R14和SPSR用于保存處理器狀態(tài),具體如下:

R14_<異常模式>=返回地址

SPSR_<異常模式>=CPSR

CPSR[4:0]=異常模式標識碼

如果<異常模式>=復位或FIQ,則

CPSR[6]=1,屏蔽快速中斷

否則,CPSR[6]不變

CPSR[7]=1,屏蔽常規(guī)中斷

PC=異常向量地址對于上述偽語言表示,當某種異常發(fā)生后,程序的返回地址保存在該異常模式下的R14(即LR)中,程序狀態(tài)CPSR保存在該異常模式的SPSR中;然后,CPSR的M[4:0]被置位成該異常模式位,如果發(fā)生的異常為復位或FIQ異常,則要屏蔽快速中斷;最后,屏蔽常規(guī)中斷,PC指向異常向量表中該異常向量的地址處。異常服務程序處理完后,SPSR復制到CPSR,R14(LR)復制至PC(此時的PC為程序被異常中斷前的執(zhí)行地址),程序將從PC處繼續(xù)執(zhí)行。異常返回有兩種方式:其一,借助帶S的數據處理指令,且PC為目的寄存器;其二,借助多寄存器加載指令賦值CPSR,例如:希望異常返回到特定的地址處,則進入異常前將該地址保存在堆棧內,即

SUBR14,R14,#4 ;獲得R14(即LR)

STMFDSP!,{<其他寄存器列表>,R14}

;R14壓入堆棧中

異常返回時,執(zhí)行

LDMFDSP!,{<其他寄存器列表>,PC}^

;R14出棧,賦給PC

上述三行代碼的含義依次為:R14減去4賦給R14;將其他需要保存內容的寄存器和R14壓入堆棧中,SP(即R13,為堆棧指針)指向棧頂,“!”表示SP減少后的值賦給SP;將SP指向的堆棧數據依次出棧,賦給寄存器列表中的寄存器和PC,“!”表示SP增加后的值賦給SP,“^”表示將SPSR的值傳回CPSR中。對這些語句更深入的理解請參考第三章。

下面具體介紹一下每個異常。2.3.1復位異常

外部輸入復位信號有效后,ARM微處理器將執(zhí)行以下

操作:

R14_svc=不確定值

SPSR_svc=不確定值

CPSR[4:0]=0b10011 //上電復位后進入管理模式

CPSR[5]=0 //工作在ARM狀態(tài)

CPSR[6]=1 //屏蔽快速中斷

CPSR[7]=1 //屏蔽普通中斷

如果高端異常向量地址配置了,則

PC=0xFFFF0000否則,

PC=0x00000000

由此可見,上電復位后的ARM微處理器處于管理工作模式下,且為執(zhí)行ARM指令的ARM狀態(tài),從地址0x0開始執(zhí)行指令,普通中斷和快速中斷均處于被屏蔽狀態(tài),連接寄存器LR(即R14)和備份的程序狀態(tài)寄存器SPSR的值不確定。復位異常一般發(fā)生于ARM硬件系統(tǒng)上電工作瞬時,或者由于手工復位按鍵復位以及看門狗電路引起的復位等。

復位異常服務程序需要完成系統(tǒng)初始化工作,包括配置時鐘、存儲器、高速緩存、堆棧、片上外設寄存器等。復位異常程序執(zhí)行初始化過程時應避免SWI軟件中斷、未定義指令中斷及存儲器訪問導致的中止等異常,系統(tǒng)初始化成功后ARM處理器進入工作狀態(tài)。2.3.2中斷請求異常

ARM微處理器外部IRQ中斷引腳有效,且CPSR的第I位(即CPSR[7])為0時,可產生IRQ普通中斷,ARM微處理器將繼續(xù)執(zhí)行處于流水線“執(zhí)行”階段的指令,然后跳轉到IRQ中斷服務程序。

如果IRQ中斷產生了,ARM微處理器自動執(zhí)行如下操作:

R14_irq=下一條將被執(zhí)行的指令地址+4

SPSR_irq=CPSR

CPSR[4:0]=0b10010 //進入IRQ模式

CPSR[5]=0 //工作在ARM狀態(tài)

CPSR[6]保持不變

CPSR[7]=1 //屏蔽再次產生的IRQ中斷

如果高端異常向量地址配置了,則

PC=0xFFFF0018

否則,

PC=0x00000018

IRQ中斷服務程序執(zhí)行完畢后,借助如下指令返回:

SUBSPC,R14,#4

上述SUBS指令中,由于PC為目的操作數,因此,將執(zhí)行兩個操作:即R14_irq的值賦給PC,SPSR_irq的值賦給CPSR。典型的IRQ中斷服務程序結構為:

ISR_irq: //IRQ中斷服務程序開始標號

<中斷處理代碼>

SUBSPC,R14,#4//IRQ中斷服務程序返回指令

另一種IRQ中斷服務程序結構為:

ISR_irq://IRQ中斷服務程序開始標號

SUBR14,R14,#4//IRQ中斷服務程序第一條語句

<中斷處理代碼>

MOVSPC,R14//IRQ中斷服務程序返回指令

在MOVS中,PC為目的操作數,因此,“MOVSPC,R14”將R14的值寫入PC中,同時自動實現(xiàn)從SPSR_irq中恢復CPSR的值。以上兩種IRQ中斷服務程序結構具有一個共同的特點,即在中斷處理代碼中不能更改R14的值,否則將導致中斷返回的地址錯誤。所以,常用的方法為借助堆棧實現(xiàn)中斷服務程序,其結構如下:

ISR_irq:

//IRQ中斷服務程序開始標號

SUBR14,R14,#4//R14=R14–4

STMFDR13!,{R0–R3,R14}

//R13為堆棧指針,將R0至R3和R14保存在堆棧中

<中斷處理代碼>

LDMFDR13!,{R0–R3,PC}^//IRQ中斷服務程序返回語句,從堆棧中恢復PC的值,并強制CPSR從SPSR寄存器恢復2.3.3快速中斷請求異常

當ARM微處理器外部FIQ引腳有效,且CPSR的F位為0時,可產生FIQ快速中斷請求,其優(yōu)先級高于IRQ,主要用于對實時數據流的快速傳輸和處理。ARM微處理器檢測到FIQ異常時,當前處于流水線“執(zhí)行”階段的指令執(zhí)行完成后,跳轉到FIQ快速中斷服務程序,ARM微處理器自動實現(xiàn)如下操作:

R14_fiq=下一條要執(zhí)行的指令地址+4

SPSR_fiq=CPSR

CPSR[4:0]=0b10001//進入FIQ工作模式

CPSR[5]=0 //工作在ARM狀態(tài)

CPSR[6]=1 //屏蔽再次產生的快速中斷

CPSR[7]=1 //屏蔽IRQ中斷

如果高端異常向量地址配置了,則

PC=0xFFFF001C

否則,

PC=0x0000001C

從快速中斷返回的方法與從IRQ中斷返回的方法相同,典型的語句為

SUBSPC,R14,#42.3.4軟件中斷異常

ARM微處理器通過執(zhí)行SWI(軟件中斷)指令進入管理模式,這是用戶模式轉換到特權模式的常用方法。SWI指令執(zhí)行時,ARM微處理器自動實現(xiàn)如下操作:

R14_svc=SWI指令的下一條指令地址

SPSR_svc=CPSR

CPSR[4:0]=0b10011 //進入管理模式

CPSR[5]=0 //工作在ARM狀態(tài)

CPSR[6]保持不變

CPSR[7]=1 //屏蔽IRQ中斷如果高端異常向量地址配置了,則

PC=0xFFFF0008

否則,

PC=0x00000008

從軟件中斷異常返回的典型語句為

MOVSPC,R142.3.5數據中止異常

數據中止異常是由存儲系統(tǒng)引發(fā)的。當要訪問的存儲空間數據無效時,將產生數據中止異常。ARM微處理器自動實現(xiàn)以下操作:

R14_abt=被中止的指令地址+8

SPSR_abt=CPSR

CPSR[4:0]=0b10111 //進入中止工作模式

CPSR[5]=0 //處于ARM狀態(tài)

CPSR[6]保持不變

CPSR[7]=1 //屏蔽IRQ中斷如果高端異常向量地址配置了,則

PC=0xFFFF0010

否則,

PC=0x00000010

從數據中止異常服務程序返回的典型語句為

SUBSPC,R14,#82.3.6預取指令異常

預取指令異常由存儲系統(tǒng)引發(fā),當取指的指令無效,且ARM微處理器試圖執(zhí)行該無效指令時,將產生預取指令異常,ARM微處理器將自動實現(xiàn)以下操作:

R14_abt=被中止的指令地址+4

SPSR_abt=CPSR

CPSR[4:0]=0b10111 //進入中止模式

CPSR[5]=0 //處于ARM狀態(tài)

CPSR[6]保持不變

CPSR[7]=1 //屏蔽IRQ中斷如果高端異常向量地址配置了,則

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論