ARM嵌入式體系結構與接口技術(Cortex-A53版)PPT全套完整教學課件_第1頁
ARM嵌入式體系結構與接口技術(Cortex-A53版)PPT全套完整教學課件_第2頁
ARM嵌入式體系結構與接口技術(Cortex-A53版)PPT全套完整教學課件_第3頁
ARM嵌入式體系結構與接口技術(Cortex-A53版)PPT全套完整教學課件_第4頁
ARM嵌入式體系結構與接口技術(Cortex-A53版)PPT全套完整教學課件_第5頁
已閱讀5頁,還剩449頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

ARM嵌入式體系結構與接口技術(Cortex_A53版)第1章嵌入式系統基礎知識.pptx第2章ARM技術概述.pptx 第3章Cortex-A53編程模型.pptx 第4章ARM開發環境搭建.pptx 第5章ARM微處理器的指令系統.pptx 第6章ARM匯編語言程序設計.pptx 第7章ARMv8異常處理及編程.pptx 第8章通用IO接口.pptx 第9章ARM外部中斷.pptx 第10章UART串行通信接口.pptx 第11章PWM定時器與”看門狗“定時器.pptx 第12章AD轉換器.pptx 第13章SPI總線接口.pptx第14章I2C總線接口.pptx 第15章溫度監控系統綜合案例.pptx 第1章嵌入式系統基礎知識華清遠見嵌入式系統的組成嵌入式系統開發概述嵌入式系統概述1嵌入式系統概述嵌入式系統簡介從20世紀70年代單片機的出現,到各式各樣的嵌入式微處理器、微控制器的大規模應用,嵌入式系統已經有了近50年的發展歷史。20世紀80年代初,Intel公司又進一步完善了8048,并在它的基礎上成功研制了8051,這在單片機的歷史上是值得紀念的一頁。迄今為止,51系列的單片機仍然是最成功的微處理器之一,在各種產品中有著非常廣泛的應用。20世紀90年代以后,隨著實時性要求的提高,軟件規模不斷上升,實時核逐漸發展為實時多任務操作系統(RealTimemulti-taskingOperationSystem,RTOS),并作為一種軟件平臺逐步成為目前國際嵌入式系統的主流。這時候更多的公司看到了嵌入式系統的廣闊發展前景,開始大力發展自己的嵌入式操作系統。嵌入式系統雖然誕生于微型計算機時代,但與通用計算機的發展道路完全不同,嵌入式系統形成了獨立的單芯片的技術發展道路。嵌入式系統的誕生,使現代計算機領域發展為通用計算機與嵌入式計算機兩大分支。通用計算機系統的技術要求是高速、海量的數值計算,技術發展方向是總線速度的無限提升和存儲容量的無限擴大。嵌入式計算機系統的技術要求具有對象的智能化控制能力,技術發展方向是與對象系統密切相關的嵌入性能、控制能力及控制的可靠性。嵌入式系統定義國內一個普遍被認同的定義是“以應用為中心,以計算機技術為基礎,軟/硬件可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統”。嵌入式系統特點軟/硬件可裁剪對功能、可靠性、成本、體積、功耗要求嚴格代碼“短小精悍”,可固化實時性弱交互性需要專門的開發環境和開發工具嵌入式系統發展趨勢定制化節能化人性化安全化網絡化標準化2嵌入式系統的組成嵌入式系統組成嵌入式系統由硬件子系統和軟件子系統組成。硬件是基礎,軟件是“靈魂”與核心。“軟硬兼施”才能綜合提高嵌入式系統的性能。嵌入式系統硬件子系統硬件是嵌入式系統軟件環境運行的基礎,它提供了嵌入式系統軟件運行的物理平臺和通信接口。嵌入式系統硬件子系統包括嵌入式處理器和外圍設備。其中,嵌入式處理器是嵌入式系統的核心部分,它與通用處理器最大的區別在于,嵌入式處理器大多工作于為特定用戶群所專門設計的系統中,它將通用處理器中許多由板卡完成的任務集成到芯片內部,從而有利于嵌入式系統在設計時趨于小型化,同時還具有很高的效率和可靠性。如今,流行的體系架構有30多個系列,其中ARM、PowerPC、MIPS等使用最為廣泛。外圍設備是嵌入式系統中用于完成存儲、通信、調試、顯示等輔助功能的其他部件。目前常用的嵌入式外圍設備按功能可以分為存儲設備(如RAM、SRAM、Flash等)、通信設備(如RS-232接口、IIC接口、SPI接口、以太網接口)和顯示設備(如LCD等)3類。嵌入式系統軟件子系統嵌入式操作系統和應用軟件是整個系統的控制核心,它們控制整個系統的運行,提供人機交互的信息等。在嵌入式系統不同的應用領域和不同的發展階段,嵌入式系統軟件組成也不完全相同,但基本上可以分為應用層、操作系統(OS)層和硬件設備驅動層。3嵌入式系統開發概述嵌入式系統基本設計流程嵌入式系統的開發流程第2章ARM技術概述華清遠見ARM微處理器簡介ARM微處理器架構ARM微處理器應用選型ARM體系結構的發展及技術特征1ARM體系結構的發展及技術特征

ARM公司簡介里程碑1——ARM成立ARM前身為艾康電腦(Acorn),于1978年,英國劍橋成立,大學的孵化物。1980年代晚期,蘋果開始與艾康合作,開發新版ARM核心。1985年,艾康開發出全球第一款商用RISC處理器,即ARM1,針對于PC市場,還沒有嵌入式呢!!!1990年,艾康財務危機,受蘋果和VLSI(最早做超大規模集成電路的公司)的投資,成立獨立子公司:AdvancedRISCMachines(ARM),ARM公司正式成立面世。ARM公司簡介里程碑2——嵌入式RSIC處理器1991年,ARM推出第一款嵌入式RISC處理器,即ARM6。1993年,發布ARM7。1997年,發布ARM9TDMI,三星2440基于此內核。1999年,發布ARM9E,增強型ARM9。2001年,ARMv6架構。2002年,發布ARM11微架構。ARM公司簡介里程碑3——微控制器2004年,發布ARMv7架構的Cortex系列處理器,同時推出Cortex-M3。2005年,發布Cortex-A8處理器。2007年,發布Cortex-M1和Cortex-A92009年,實現Cortex-A9、發布Cortex-M02010年,推出Cortex-M4(F)、成立Linaro(ARM公司牽頭成立的公共組織,專門做ARM處理器在Linux平臺上的一些軟件的開發和移植),推出Cortex-A15MPcore高性能處理器(性能比較高了,但是發熱量很大)。ARM公司簡介里程碑4——64位處理器時代2011年,推出32位Cortex-A7處理器,ARMv8發布2012年,開始推出64位處理器。推出Cortex-M0+、ARM首款64位處理器架構Cortex-A53、Cortex-A57架構。全球第一款64位ARM手機iPhone5s。2013年,推出32位Cortex-A12處理器架構2014年,推出Cortex-M7(F)微控制器架構;32位Cortex-A17處理器架構。2015年,推出64位Cortex-A35、Cortex-A72處理器架構。2016年,推出Cortex-M23、Cortex-M33(F)微控制器架構;32位Cortex-A32處理器架構;64位Cortex-A73處理器架構。2017年,推出64位Cortex-A55、Cortex-A75處理器架構。2018年,推出微控制器Cortex-M35P;64位Cortex-A76處理器架構。ARM的商業模式:設計與生產分離ARM的商業模式:設計與生產分離ARM只負責設計IC,并且出賣自己的設計IP(只是產權)ARM自己不生產芯片,而是把設計IP授權給其他半導體廠商來生產芯片。另外也提供基于ARM架構的開發設計技術軟件工具,評估板,調試工具,應用軟件,總線架構,外圍設備單元,等等ARM合作伙伴國外知名企業:SAMSUNG:Exynos(獵戶座)ST:STM32NXP:以前飛利浦的一個部門Qualcomm:智能手機芯片"驍龍"國內知名企業:華為海思:海思麒麟全志:位于廣東珠海,主打芯片是“山寨平板”的,價格便宜。瑞芯微:位于福建福州,也是做“山寨平板”的,價格便宜。MTK:位于中國臺灣,聯發科,山寨之王。ARM技術特征ARM的成功,一方面得益于它獨特的公司運作模式,另一方面,當然來自于ARM微處理器自身的優良性能。作為一種先進的RISC處理器,ARM微處理器有如下特點。小體積、低功耗、低成本、高性能。支持Thumb(16位)、ARM(32位)雙指令集,能很好地兼容8位/16位器件。最新ARMv8架構支持AArch32位和AArch64位指令集,能很好地兼容32位處理器。大量使用寄存器,指令執行速度更快。大多數數據操作都在寄存器中完成。尋址方式靈活簡單,執行效率高。指令長度固定。用。表2-1描述了RISC和CISC之間的主要區別。RISC和CISC對比CISC:ComplexInstructionSetComputer側重于硬件執行指令的功能性,CISC指令及處理器的硬件結構復雜。CISC指令復雜,指令長度與周期不固定,在處理能力上有優勢RISC:ReducedInstructionSetComputerRISC結構簡單,選取了使用頻率高的簡單指令,指令長度固定,多為單周期指令。在功耗、體積、價格等方面有很大優勢,多用于嵌入式領域用。表2-1描述了RISC和CISC之間的主要區別。RISC和CISC對比區別RISCCISC指令集一個周期執行一條指令,通過簡單指令的組合實現復雜操作;指令長度固定指令長度不固定,執行需要多個周期流水線流水線每周期前進一步指令的執行需要調用微代碼的一個微程序寄存器更多通用寄存器用于特定目的的專用寄存器Load/Store結構獨立的Load和Store指令完成數據在寄存器和外部存儲器之間的傳輸處理器能夠直接處理存儲器中的數據ARM體系結構的發展ARMv1架構:采用地址空間是26位,尋址空間是64MB。ARMv2架構:指令結構更加完善,增加乘法指令和協處理器指令。ARMv3架構:實現32位尋址空間。ARMv4架構:增加了半字指令的讀取和寫入操作,還增加了處理器系統模式,支持Thumb指令集。ARMv5架構:提升了ARM和Thumb兩種指令集的交互工作能力。ARMv6架構:v6架構包含ARM體系結構中所有的4種特殊指令集:Thumb指令集(T)、DSP指令集(E)、Java指令集(J)和Media指令集。ARMv7架構:ARMv7架構是在ARMv6架構的基礎上誕生的。ARMv8架構:ARMv8架構是在32位ARM架構上進行開發的,ARMv8是第一款64位的架構。2ARM微處理器簡介

ARM微處理器簡介ARM微處理器的產品系列非常廣,包括ARM7、ARM9、ARM9E、ARM10E、ARM11,ARM公司從ARM11之后將處理器的命名調整為Cortex,分別為Cortex-A、Cortex-R、Cortex-M、SecurCore等。每個系列提供一套特定的性能來滿足設計者對功耗、性能、體積的要求。SecurCore是一個單獨的產品系列,是專門為安全設備設計的。Cortex-A系列處理器ARMCortex-A系列應用型處理器可向托管豐富OS平臺和用戶應用程序的設備提供全方位的解決方案,從超低成本手機、智能手機、移動計算平臺、數字電視和機頂盒,到企業網絡、打印機和服務器解決方案。Cortex-R系列處理器

ARMCortex-R系列實時處理器為要求可靠性、高可用性、容錯功能、可維護性和實時響應的嵌入式系統提供高性能計算解決方案。Cortex-M系列處理器ARMCortex-M系列處理器是一系列可向上兼容的高能效、易于使用的處理器,這些處理器旨在幫助開發人員滿足將來的嵌入式應用的需要。這些需要包括以更低的成本提供更多功能、不斷增加連接、改善代碼重用和提高能效。SecurCore系列處理器ARMSecurCore系列處理器為基于行業領先的ARM架構提供功能強大的32位安全解決方案。通過用各種安全功能來加強已十分成熟的ARM微處理器,SecurCore推出了智能卡,使安全類的IC開發人員可以方便地利用ARM32位技術的優點(例如晶片尺寸小、能效高、成本低、代碼密度優異且性能十分突出)。SecurCore處理器可在廣泛的安全應用中使用,其性能超越了舊的8位或16位安全處理器。3ARM微處理器架構

ARM微處理器架構ARM內核采用RISC體系結構。ARM體系結構的主要特征如下。采用大量的寄存器,它們都有多種用途。采用Load/Store體系結構。每條指令都是條件執行。采用多寄存器的Load/Store指令。能夠在單時鐘周期執行的單條指令內完成一項普通的移位操作和一項普通的ALU操作。通過協處理器指令集來擴展ARM指令集,包括在編程模式中增加了新的寄存器和數據類型。如果把ARMv8架構中的Thumb指令集也作為ARM體系結構的一部分,那么在Thumb體系結構中還可以用高密度16/32位壓縮形式表示指令集。4ARM微處理器應用選型

ARM微處理器應用選型ARM芯片選型的一般原則如下。1.功能考慮處理器本身能夠支持的功能,如USB、網絡、串口、液晶顯示等。2.性能從處理器的功耗、速度、穩定可靠性等方面考慮。3.價格產品在完成功能要求的基礎上,成本越低越好。在選擇處理器時需要考慮處理器的價格,以及由處理器衍生出的開發價格,如開發板、外圍芯片、開發工具、制版等的價格。4.熟悉程度及開發資源通常公司對產品的開發周期都有嚴格的要求,選擇一款熟悉的處理器可以大大降低開發風險。在熟悉的處理器都無法滿足功能的情況下,可以盡量選擇開發資源豐富的處理器。5.操作系統支持在選擇嵌入式處理器時,如果最終的程序需要運行在操作系統上,那么還應該考慮處理器對操作系統的支持。6.升級很多產品在開發完成后都會面臨升級的問題,正所謂“人無遠慮,必有近憂”,因此在選擇處理器時必須要考慮升級的問題。如盡量選擇具有相同封裝的不同性能等級的處理器,考慮產品未來可能增加的功能等。7.供貨穩定供貨穩定也是選擇處理器時的一個重要參考因素,應盡量選擇大廠家生產的比較通用的芯片。華清遠見課程簡介華清遠見Cortex-A53數據類型Cortex-A53內核工作模式Cortex-A53存儲系統流水線寄存器組織Cortex-A53內部功能及特點基于Cortex-A53的S5P6818處理器介紹FS6818開發平臺介紹1Cortex-A53內部功能及特點Cortex-A53內部功能及特點Cortex-A53處理器,屬于A50系列處理器的產品,這一系列產品標志著進一步擴大ARM在高性能與低功耗領域的領先地位,Cortex-A53處理器就是由此誕生的。ARMCortex-A53是實現ARMHoldings設計的ARMv8-A64位指令集的前兩個微體系結構之一。Cortex-A53是一款功耗效率很高的ARM應用處理器。可獨立運作或整合為ARMbig.LITTLE處理器架構。該處理器系列的可擴展性使ARM的合作伙伴能夠針對智能手機、高性能服務器等各類不同市場需求開發系統級芯片(SoC)。Cortex-A53將持續推動移動計算體驗的發展,提供最多可達現有超級手機(superphone)三倍的性能,還可將現有超級手機體驗延伸至入門級智能手機。配合ARM及ARM合作伙伴所提供的完整工具套件與仿真模型以加快并簡化軟件開發,全面兼容現有的ARM32位軟件生態系統,并能與ARM快速發展中的64位軟件生態系統相整合。IP內核硬化加速技術以及先進互補型場效應晶體管(ComplementaryMetalOxideSemiconductor,CMOS)與鰭式場效應晶體管(FinField-EffectTransistor,FinFET)制程技術的支持下,Cortex-A53處理器可提供數GHz級別的性能。Cortex-A53內部功能及特點Cortex-A53內核的內部構造Cortex-A53內部功能及特點Cortex-A53內核特點概述:具有雙向超標量,有序執行的8級流水線處理器。每個核心都必須使用DSP和NEONSIMD擴展。板載VFPv4浮點單元(每個核心)。硬件虛擬化支持。TrustZone安全擴展。10項L1TLB和512項L2TLB。4Kbit件分支預測器,256項間接分支預測器。2Cortex-A53數據類型

ARM的基本數據類型ARMv8架構支持的基本數據類型有以下5種。Byte:字節,8bit。Halfword:半字,16bit(半字必須與2字節邊界對齊)。Word:字,32bit(字必須與4字節邊界對齊)。DoubleWord:雙字,64bit。QueaWord:四字,128bit。存儲器可以看作是序號為0~232-1的線性字節陣列。表3-1所示為ARM存儲器的組織結構。其中每一個字節都有唯一的地址。字節可以占用任意位置。半字占有兩個字節的位置,該位置開始于偶數字節地址(地址最末一位為0)。長度為1個字的數據項占用一組4字節的位置,該位置開始于4的倍數的字節地址(地址最末兩位為00)。浮點數據類型

浮點運算使用在ARM硬件指令集中未定義的數據類型。盡管如此,ARM公司仍然在協處理器指令空間定義了一系列浮點指令。通常這些指令全部可以通過未定義指令異常(此異常收集所有硬件協處理器不接受的協處理器指令)在軟件中實現,但是其中的一小部分也可以由浮點運算協處理器FPA10以硬件方式實現。另外,ARM公司還提供了用C語言編寫的浮點庫作為ARM浮點指令集的替代方法(Thumb代碼只能使用浮點指令集)。該庫支持IEEE標準的單精度和雙精度格式。C編譯器有一個關鍵字標志來選擇這個歷程。它產生的代碼與軟件仿真(通過避免中斷、譯碼和浮點指令仿真)相比既快又緊湊。存儲器大/小端從軟件角度看,內存相對于一個大的字節數組,其中每個數組元素(字節)都是可尋址的。ARM支持大端模式(big-endian)和小端模式(little-endian)兩種內存模式。大端模式和小端模式數據存放的特點3Cortex-A53內核工作模式

Cortex-A53內核工作模式ARM架構中處理器有不同的運行模式,因此同一個功能的寄存器在不同的運行模式下可能對應不同的物理寄存器,這些寄存器被稱為備份寄存器。如SPSR_svc表示svc模式下使用的SPSR寄存器。

ARM架構中常用的運行模式。ARMv8-A架構還有安全監控模式(MonitorMode,mon)工作模式,用于處理器安全狀態與非安全狀態的切換。捕獲異常模式(HypervisorMode,hyp)模式則用于對虛擬化有關功能的支持。處理器模式描述用戶模式(UserMode,USR)正常程序執行的模式快速中斷模式(FIQMode,FIQ)用于高速數據傳輸和通道處理外部中斷模式(IRQMode,IRQ)用于通常的中斷處理特權模式(SupervisorMode,SVC)供操作系統使用的一種保護模式數據訪問中止模式(AbortMode,ABT)當數據或指令預取中止時進入該模式,用于虛擬存儲及存儲保護未定義指令中止模式(UndefinedMode,UND)當執行未定義指令時進入該模式,用于支持通過軟件仿真硬件的協處理器系統模式(SystemMode,SYS)用于運行特權級的操作系統任務4Cortex-A53存儲系統

Cortex-A53存儲系統ARM的存儲器系統是由多級構成的,可以分為內核級、芯片級、板卡級和外設級。存儲器的層次結構如圖:存儲管理單元(MMU)在創建多任務嵌入式系統時,最好用一個簡單的方式來編寫、裝載及運行各自獨立的任務。目前大多數的嵌入式系統不再使用自己定制的控制系統,而使用操作系統來簡化這個過程。較高級的操作系統采用基于硬件的存儲管理單元(MMU)來實現上述操作。MMU提供的一個關鍵服務是使各個任務作為各自獨立的程序在自己的私有存儲空間中運行。在帶MMU的操作系統控制下,運行的任務無須知道其他與之無關的任務的存儲需求情況,這就簡化了各個任務的設計。MMU提供了一些資源以允許使用虛擬存儲器(將系統物理存儲器重新編址,可將其看成一個獨立于系統物理存儲器的存儲空間)。MMU作為轉換器,將程序和數據的虛擬地址(編譯時的連接地址)轉換成實際的物理地址,即在物理主存中的地址。這個轉換過程允許運行的多個程序使用相同的虛擬地址,而數據存儲在物理存儲器的不同位置。這樣存儲器就有兩種類型的地址:虛擬地址和物理地址。虛擬地址由編譯器和連接器在定位程序時分配;物理地址用來訪問實際的主存硬件模塊(物理上程序存在的區域)。高速緩沖存儲器(Cache)Cache是一個容量小但存取速度非常快的存儲器,它保存最近用到的存儲器數據副本。對于程序員來說,Cache是透明的。它自動決定保存哪些數據、覆蓋哪些數據。現在Cache通常與處理器在同一芯片上實現。Cache能夠發揮作用是因為程序具有局部性。所謂局部性就是指在任何特定的時間,處理器趨于對相同區域的數據(如堆棧)多次執行相同的指令(如循環)。Cache經常與寫緩存器(writebuffer)一起使用。寫緩存器是一個非常小的先進先出(FIFO)存儲器,位于處理器核與主存之間。使用寫緩存的目的是,將處理器核和Cache從較慢的主存寫操作中解脫出來。當CPU向主存儲器做寫入操作時,它先將數據寫入到寫緩存區中,由于寫緩存器的速度很高,這種寫入操作的速度也將很高。寫緩存區在CPU空閑時,以較低的速度將數據寫入到主存儲器中相應的位置。通過引入Cache和寫緩存區,存儲系統的性能得到了很大的提高,但同時也帶來了一些問題。例如,由于數據將存在于系統中不同的物理位置,可能造成數據的不一致性;由于寫緩存區的優化作用,可能有些寫操作的執行順序不是用戶期望的順序,從而造成操作錯誤。5流水線流水線的概念與原理處理器按照一系列步驟來執行每一條指令,典型的步驟如下:從存儲器讀取指令(fetch)。譯碼以鑒別它屬于哪一條指令(decode)。從指令中提取指令的操作數(這些操作數往往存在于寄存器reg中)。將操作數進行組合以得到結果或存儲器地址(ArithmeticandLogicUnit,ALU)。如果需要,則訪問存儲器以存儲數據(mem)。將結果寫回到寄存器堆(res)。3級流水線到ARM7為止的ARM處理器使用簡單的3級流水線,它包括下列流水線級。取指令(fetch):從寄存器裝載一條指令。譯碼(decode):識別被執行的指令,并為下一個周期準備數據通路的控制信號。在這一級,指令占有譯碼邏輯,不占用數據通路。執行(excute):處理指令并將結果寫回寄存器。3級流水線指令的執行過程,如下圖:當處理器執行簡單的數據處理指令時,流水線使得平均每個時鐘周期能完成1條指令。但1條指令需要3個時鐘周期來完成,因此,有3個時鐘周期的延時(latency),但吞吐率(throughput)是每個周期1條指令。5級流水線所有的處理器都要滿足對高性能的要求,在ARM核中使用的3級流水線的性價比是很高的。但是,為了得到更高的性能,需要重新考慮處理器的組織結構。有兩種方法來提高性能。提高時鐘頻率。時鐘頻率的提高,必然引起指令執行周期的縮短,所以要求簡化流水線每一級的邏輯,流水線的級數就要增加。減少每條指令的平均指令周期數CPI。這就要求重新考慮3級流水線ARM中多于1個流水線周期的實現方法,以便使其占有較少的周期,或者減少因指令執行造成的流水線停頓,也可以將兩者結合起來。在ARM9TDMI中使用了典型的5級流水線,5級流水線包括下面的流水線級。取指令(fetch):從存儲器中取出指令,并將其放入指令流水線。譯碼(decode):指令被譯碼,從寄存器堆中讀取寄存器操作數。在寄存器堆中有3個操作數讀端口,因此,大多數ARM指令能在1個周期內讀取其操作數。執行(execute):將其中1個操作數移位,并在ALU中產生結果。如果指令是Load或Store指令,則在ALU中計算存儲器的地址。緩沖/數據(buffer/data):如果需要則訪問數據存儲器,否則ALU只是簡單地緩沖1個時鐘周期。⑤回寫(write-back):將指令的結果回寫到寄存器堆,包括任何從寄存器讀出的數據。5級流水線指令的執行過程8級流水線在Cortex-A53中有一條8級的流水線,但是由于ARM公司沒有對其中的技術公開任何相關的細節,這里只能簡單介紹一下,從經典ARM系列到現在的Cortex系列,ARM處理器的結構在向復雜的階段發展,但沒改變的是CPU的取指指令和地址關系,不管是幾級流水線,都可以按照最初的3級流水線的操作特性來判斷其當前的PC位置。這樣做主要還是為了軟件兼容性上的考慮,由此可以判斷的是,后面ARM所推出的處理核心都想滿足這一特點,感興趣的讀者可以自行查閱相關資料。影響流水線性能的因素1.互鎖在典型的程序處理過程中,經常會遇到這樣的情形,即一條指令的結果被用做下一條指令的操作數。例如,有如下指令序列:

LDRX0,[X0,#0]

ADDX0,X0,X1//在5級流水線上產生互鎖

從例子可以看出,流水線的操作產生中斷,因為第1條指令的結果在第2條指令取數時還沒有產生。第2條指令必須停止,直到結果產生為止。2.跳轉指令跳轉指令也會破壞流水線的行為,因為后續指令的取指步驟受到跳轉目標計算的影響,因而必須推遲。但是,當跳轉指令被譯碼時,在它被確認是跳轉指令之前,后續的取指操作已經發生。這樣一來,已經被預取進入流水線的指令不得不被丟棄。如果跳轉目標的計算是在ALU階段完成的,那么在得到跳轉目標之前已經有兩條指令按原有指令流讀取。6寄存器組織

通用寄存器ARMv8架構的處理器為了更好向下兼容ARMv7架構,因此ARMv8架構支持AArch32和AArch64兩種狀態,在不同的狀態下使用不同的寄存器的組織。AArch32重要寄存器簡介寄存器類型Bit描述R0-R1432bit通用寄存器,但是ARM不建議使用有特殊功能的R13、R14、R15作為通用寄存器使用SP_x32bit通常稱R13為堆棧指針,除了User和Sys模式外,其他各種模式下都有對應的SP_x寄存器:x={und/svc/abt/irq/fiq/hyp/mon}LR_x32bit稱R14為鏈接寄存器,除了User和Sys模式外,其他各種模式下都有對應的SP_x寄存器:x={und/svc/abt/svc/irq/fiq/mon},用于保存程序返回鏈接信息地址,AArch32環境下,也用于保存異常返回地址,也就說LR和ELR是公用一個,AArch64下是獨立的ELR_hyp32bitHypmode下特有的異常鏈接寄存器,保存異常進入Hypmode時的異常地址PC32bit通常稱R15為程序計算器PC指針,AArch32中PC指向取指地址,是執行指令地址+8,AArch64中PC讀取時指向當前指令地址CPSR32bit記錄當前PE的運行狀態數據,CPSR.M[4:0]記錄運行模式,AArch64下使用PSTATE代替APSR32bit應用程序狀態寄存器,EL0下可以使用APSR訪問部分PSTATE值SPSR_x32bit是CPSR的備份,除了User和Sys模式外,其他各種模式下都有對應的SPSR_x寄存器:x={und/svc/abt/irq/fiq/hpy/mon},注意:這些模式只適用于32bit運行環境HCR32bitEL2特有,HCR.{TEG,AMO,IMO,FMO,RW},控制EL0/EL1的異常路由SCR32bitEL3特有,SCR.{EA,IRQ,FIQ,RW},控制EL0/EL1/EL2的異常路由,注意EL3始終不會路由VBAR32bit保存任意異常進入非Hypmode&非Monitormode的跳轉向量基地址HVBAR32bit保存任意異常進入Hypmode的跳轉向量基地址MVBAR32bit保存任意異常進入Monitormode的跳轉向量基地址ESR_ELx32bit保存異常進入ELx時的異常綜合信息,包含異常類型EC等,可以通過EC值判斷異常classPSTATE

不是一個寄存器,是保存當前PE狀態的一組寄存器統稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬于ARMv8新增內容,主要用于64bit環境下A32狀態下寄存器組織T32狀態下寄存器組織A32T32R0R0R1R1R2R2R3R3R4R4R5R5R6R6R7R7R8并不是說T32狀態下沒有R8~R12,而是有限的指令才能訪問到R9R10R11R12SP(R13)SP(R13)LR(R14)LR(R14)PC(R15)PC(R15)CPSRCPSRSPSRSPSRAArch64重要寄存器簡介寄存器類型Bit描述X0-X3064bit通用寄存器,如果有需要可以作為32bit使用:WO-W30LR(X30)64bit通常稱X30為程序鏈接寄存器,保存跳轉返回信息地址SP_ELx64bit若PSTATE.M[0]==1,則每個ELx選擇SP_ELx,否則選擇同一個SP_EL0ELR_ELx64bit異常鏈接寄存器,保存異常進入ELx的異常地址(x={0,1,2,3})PC64bit程序計數器,俗稱PC指針,總是指向即將要執行的下一條指令SPSR_ELx32bit寄存器,保存進入ELx的PSTATE狀態信息NZCV32bit允許訪問的符號標志位DIAF32bit中斷使能位:D-Debug,I-IRQ,A-SError,F-FIQ,邏輯0允許CurrentEL32bit記錄當前處于哪個ExceptionlevelSPSel32bit記錄當前使用SP_EL0還是SP_ELx,x={1,2,3}HCR_EL232bitHCR_EL2.{TEG,AMO,IMO,FMO,RW}控制EL0/EL1的異常路由邏輯1允許SCR_EL332bitSCR_EL3.{EA,IRQ,FIQ,RW}控制EL0/EL1/EL2的異常路由邏輯1允許ESR_ELx32bit保存異常進入ELx時的異常綜合信息,包含異常類型EC等VBAR_ELx64bit保存任意異常進入ELx的跳轉向量基地址x={0,1,2,3}PSTATE

不是一個寄存器,是保存當前PE狀態的一組寄存器統稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬于ARMv8新增內容,64bit下代替CPSR64、32位寄存器映射關系64-bit32-bit64-bitOSRuningAArch32App64-bit32-bitX0R0X20LR_adtX1R1X21SP_abtX2R2X22LR_undX3R3X23SP_undX4R4X24R8_fiqX5R5X25R9_fiqX6R6X26R10_fiqX7R7X27R11_fiqX8R8_usrX28R12_fiqX9R9_usrX29SP_fiqX10R10_usrX30(LR)LR_fiqX11R11_usrSCR_EL3SCRX12R12_usrHCR_EL2HCRX13SP_usrVBAR_EL1VBARX14LR_usrVBAR_EL2HVBARX15SP_hypVBAR_EL3MVBARX16LR_irqESR_EL1DFSRX17SP_irqESR_EL2HSRX18LR_svc

X19SP_svc

程序狀態寄存器在AArch32狀態下使用當前程序狀態寄存器(CurrentProgramStatusRegister,CPSR)記錄程序的執行狀態,可以在任何處理器模式下被訪問,它包含下列內容:ALU(ArithmeticLogicUnit,算術邏輯單元)狀態標志的備份。當前的處理器模式。中斷使能標志。設置處理器的狀態。每一種處理器模式下都有一個專用的物理寄存器做備份程序狀態寄存器(SavedProgramStatusRegister,SPSR)。當特定的異常中斷發生時,這個物理寄存器負責存放當前程序狀態寄存器的內容。當異常處理程序返回時,再將其內容恢復到當前程序狀態寄存器。程序狀態寄存器標志位

N(Negative)、Z(Zero)、C(Carry)和V(Overflow)通稱為條件標志位。這些條件標志位會根據程序中的算術指令或邏輯指令的執行結果進行修改,而且這些條件標志位可由大多數指令檢測以決定指令是否執行。在ARMv4T架構中,所有的ARM指令都可以條件執行,而Thumb指令卻不能。各條件標志位的具體含義如下。(1)N本位設置成當前指令運行結果的bit[31]的值。當兩個由補碼表示的有符號整數運算時,N=1表示運算的結果為負數,N=0表示結果為正數或零。(2)ZZ=1表示運算的結果為零,Z=0表示運算的結果不為零。(3)C下面分4種情況討論C的設置方法。在加法指令中(包括比較指令CMN),當結果產生了進位,則C=1,表示無符號數運算發生上溢出;其他情況下C=0。在減法指令中(包括比較指令CMP),當運算中發生錯位(即無符號數運算發生下溢出),則C=0;其他情況下C=1。對于在操作數中包含移位操作的運算指令(非加/減法指令),C被設置成被移位寄存器最后移出去的位。對于其他非加/減法運算指令,C的值通常不受影響。(4)V下面分兩種情況討論V的設置方法。對于加/減運算指令,當操作數和運算結果都是以二進制的補碼表示的帶符號的數時,且運算結果超出了有符號運算的范圍是溢出。V=1表示符號位溢出。對于非加/減法指令,通常不改變標志位V的值(具體可參照ARM指令手冊)。盡管以上C和V的定義看起來頗為復雜,但使用時在大多數情況下用一個簡單的條件測試指令即可,不需要程序員計算出條件碼的精確值即可得到需要的結果。控制位CPSR的低8位(I、F、T、M[4]及M[3:0])統稱為控制位。當異常發生時,這些位的值將發生相應的變化。另外,如果在特權模式下,也可以通過軟件編程來修改這些位的值。(1)中斷禁止位I=1,IRQ被禁止。F=1,FIQ被禁止。(2)狀態控制位T位是處理器的狀態控制位。T=0,處理器處于ARM狀態(即正在執行32位的ARM指令)。T=1,處理器處于Thumb狀態(即正在執行16位的Thumb指令)。當然,T位只有在T系列的ARM處理器上才有效,在非T系列的ARM版本中,T位將始終為0。模式控制位M[3:0]作為位模式控制位,這些位的組合確定了處理器處于哪種狀態。如表所示列出了其具體含義。M[3∶0]處理器模式0b0000User0b0001FIQ0b0010IRQ0b0011Supervisor0b0111Abort0b1010Hyp0b1011Undefined0b1111System7基于Cortex-A53的S5P6818處理器介紹Cortex-A53的S5P6818處理器介紹S5P6818是一款基于RISC64位處理器,適用于平板電腦和手機。采用28nm低功耗工藝,S5P6818的功能包括:SOC內部集成了8個Cortex-A53核。高內存帶寬。全高清顯示。硬件支持1080p60幀視頻解碼和1080p30幀編碼。硬件支持3D圖形顯示。高速接口,如eMMC4.5和USB2.0。S5P6818特征采用28nm,HKMG(High-KMetalGate)工藝技術。537針FCBGA封裝,0.65mm球間距,17*17mm主體尺寸。Cortex-A538核CPU主頻>1.4GHz。高性能3D圖形加速器。全高清多格式視頻編解碼器。支持各種內存,LVDDR3(低電壓版DDR3),DDR3高達800MHz。支持采用硬連線ECC算法的MLC/SLCNAND閃存(4/8/12/16/24/40/60位)。支持高達1920×1080的雙顯示屏,TFT-LCD,LVDS,HDMI,MIPI-DSI和CVBS輸出。支持3-chITUR.BT656并行視頻接口和MIPI-CSI。支持10/100/1000M位以太網MAC(RGMIII/F)。支持3通道SD/MMC,6通道UART,32通道DMA,4通道定時器,中斷控制器,RTC。支持3路I2S,SPDIFRx/Tx,3路I2C,3路SPI,3路PWM,1路PPM和GPIO。支持用于CVBS的8通道12位ADC,1通道10位DAC。支持MPEG-TS串行/并行接口和MPEG-TSHW分析器。支持1路USB2.0主機,1路USB2.0OTG,1路USBHSIC主機。支持安全功能(AES,DES/TDES,SHA-1,MD5和PRNG)和安全JTAG。支持ARMTrustZone技術。支持各種功耗模式(正常,睡眠,停止)。支持各種啟動模式,包括SPIFlash/EEPROM,NOR,SD(eMMC),USB和UART。S5P6818芯片內部構成框圖8FS6818開發平臺介紹FS6818開發平臺介紹FS6818開發板是由華清遠見研發中心研發的一款基于三星的S5P6818SOC研發的一款硬件平臺。S5P6818硬件平臺的主要資源功能部件型號參數FS6818硬件平臺核心配置CPU-Samsungs5p6818(八核處理器)-28nmHKMG-1.4GHz+GPU-Mali-400MP4屏幕-RGB40Pin顯示接口-7寸1024x600IPS高分辨率顯示屏-多點電容觸摸屏RAM容量-2GBDDR3ROM容量-8GBeMMC多啟動方式-eMMC啟動、MicroSD(TF)/SD卡啟動-通過控制撥碼開關切換啟動方式-可以實現雙系統啟動FS6818硬件平臺板載接口存儲卡接口-1個MicroSD(TF)卡接口-1個SD卡接口-最高可擴展至64GB攝像頭接口-20Pin接口,支持OV5460500萬像素自動對焦攝像頭HDMI接口-HDMIA型接口-HDMIv1.4a-最高1080p@60fps高清數字輸出JTAG接口-20Pin標準JTAG接口-獨家支持詳盡的ARM裸機程序USB接口-1路USBOTG-3路USBHOST2.0(可擴展USB-HUB)音頻接口-1路Mic接口-1路Speaker耳機輸出-1路Speaker立體聲功放輸出(外置揚聲器)網卡接口-DM900010M/100M/1000M網卡總線接口-1路RS485總線接口-1路CAN總線接口串口接口-3路5線RS232串口擴展接口-2路擴展10PinGPIO接口FS6818硬件平臺外設按鍵-1個Reset按鍵-1個Power按鍵-2個Volume(+/-)按鍵LED-1個電源LED-1個可編程RGB彩燈紅外接收器-1個IRM3638紅外接收器-可配合紅外遙控器在Android下使用ADC-1路電位器輸入RTC-1個外部RTC實時時鐘,斷電可保存時間蜂鳴器-1個有源PWM蜂鳴器WiFi模塊-1個板載WiFi藍牙模塊,RTL8723BU方案第4章ARM開發及環境搭建華清遠見開發環境安裝新建工程添加已有工程編譯工程調試工程FS-JTAG(B)仿真器介紹1FS-JTAG(B)仿真器介紹

FS-JTAG(B)仿真器介紹FS_JTAG(B)ARM仿真器是繼華清遠見研發中心自主研發的Cortex-A系列開發平臺,及配套案例資料和技術支持獲得業內合作企業及參訓學員的一致好評之后,經過幾個月的潛心研究和專注努力,由華清遠見研發中心自主研發的第二代Cortex-A系列ARM仿真器,第二代新加入了Cortex-A53系列。2開發環境安裝開發環境簡介本開發環境在Ubuntu14.0464-bit基礎上,安裝配置了如下工具:將默認GCC、G++編譯器版本從4.6降至4.4(用戶可以自行還原、修改)。安裝了Android編譯所需要的工具和庫。安裝SUNJavaJDK6。安裝內核編譯所依賴的工具包。解決了libncurses32位和64位不能同時安裝導致編譯Android和配置內核軟件沖突的問題。添加了常用的arm-none-eabi交叉工具鏈,版本號覆蓋了4.3、4.4、4.5、4.6,方便用戶選擇合適的交叉工具鏈。安裝Vim、Ctags和Vim最常用的插件集,方便開發。安裝配置TFTP。安裝配置NFS網絡文件系統服務。安裝SSH工具網絡服務程序。安裝Kermit串口調試工具。安裝Sogou輸入法。關閉Ubuntu更新提示。注:Ubuntu系統用戶名為“linux”,主機名為“ubuntu64”,默認密碼為“1”安裝VMwarePlayer打開“FSJTAG開發環境\虛擬機開發環境\VMwarePlayer”目錄下的VMwarePlayer安裝程序(VMware-player-16.1.0-17198959.exe),如下圖所示。安裝VMwarePlayer右鍵單擊,以管理員身份運行VMware-player-16.1.0-17198959.exe程序,進入“VMwareWorkstation16Player安裝”窗口,單擊“下一步”按鈕,如下圖所示。安裝VMwarePlayer

進入VMwareWorkstation16Player安裝“最終用戶許可協議”界面,選擇“我接受許可協議中的條款(A)”單選按鈕,單擊“下一步”按鈕,如下圖所示。安裝VMwarePlayer

(4)進入“自定義安裝”界面,此處根據需要進行更改安裝路徑,本書保持默認,單擊“下一步”按鈕,如下圖所示。安裝VMwarePlayer進入“用戶體驗設置”界面,此處根據用戶需要進行選擇配置,本書保持默認,單擊“下一步”按鈕,如下圖所示。安裝VMwarePlayer進入“快捷方式”界面,此處根據需要進行選擇,本書保持默認,單擊“下一步”按鈕,如下圖所示。安裝VMwarePlayer進入正式的安裝界面,單擊“安裝”按鈕,進行VMwareWorkstation16Player軟件的安裝,等待軟件安裝結束,如下圖所示。安裝VMwarePlayer(8)進入安裝完成界面,單擊“完成”按鈕,此時VMwareWorkstation16Player軟件安裝成功,如下圖所示。解壓縮虛擬機鏡像打開“FSJTAG開發環境\虛擬機開發環境\FSJTAG仿真器集成環境”目錄,使用壓縮工具對Ubuntu_14.04_64-bit_fsjtag.7z壓縮包進行解壓縮,獲取Ubuntu_14.04_64-bit系統,如下圖所示。此系統已經安裝配置好,不需要再次進行安裝,直接使用VMwareWorkstation16Player虛擬機軟件打開即可。打開虛擬機打開VMwareWorkstation16Player軟件,使用VMwareWorkstation16Player打開已經安裝好的Ubuntu_14.04-64-bit系統,單擊“打開虛擬機”按鈕進入Ubuntu系統安裝目錄,選擇“FSJTAG集成環境.vmx”,單擊“打開”按鈕,如下圖所示。打開虛擬機啟動虛擬機,單擊“播放虛擬機”按鈕,完成Ubuntu系統的啟動,如下圖所示。打開虛擬機

首次打開Ubuntu虛擬機,會彈出下圖所示的對話框,單擊“我已復制該虛擬機”按鈕即可。連接硬件平臺FS6818的硬件連接,需連接仿真器、USB轉串口線、電源,如下圖所示。USB轉串口驅動安裝如果用的是華清遠見標配的CH340,運行“FSJTAG開發環境\工具軟件\USB轉串口驅動\CH340\CH341SER.EXE”,單擊“安裝”按鈕可以進入安裝對話框,如下圖所示。USB轉串口驅動安裝等待20秒左右,系統會提示安裝完成。可以在設備管理器中查看到串口的信息,從而確定串口號,如下圖所示。Putty串口終端配置Putty串口工具是一款免安裝的串口工具,可以直接運行“FSJTAG開發環境\工具軟件\串口調試工具\PUTTY.EXE“軟件,打開后,如下圖所示。Putty串口終端配置單擊左側“Serial”選項,進入配置界面,按如下圖所示進行配置。COM5是串口號,不同機器、不同接口都有差異,請查看設備管理器中的信息。115200是串口的波特率,必須為115200。最后單擊“Open”按鈕打開串口。給開發板上電,此時串口終端會顯示。關閉開發板電源,將撥碼開關SW1調至SD卡啟動模式,如下圖所示。然后打開電源,給開發板上電,此時串口終端會顯示一些信息,出現倒計時提示信息,在減到0之前按鍵盤上任意鍵進入“fsjtag#”界面,如下圖所示。3新建工程

新建工程啟動虛擬機,打開集成開發環境后,雙擊桌面上的“EclipsePlatform”圖標,打開Eclipse軟件,如下圖所示。新建工程EclipseforARM是一個標準的窗口應用程序,可以單擊程序按鈕開始運行。打開后單擊“Browse”按鈕指定一個工程存放路徑,如下圖所示。新建工程單擊“OK”按鈕進入工程工作界面,如下圖所示。新建工程進入主界面后,選擇“File→New→CProject”命令,Eclipse\將打開一個標準對話框,輸入希望新建工程的名字并單擊“Finish”按鈕即可創建一個新的工程,如下圖所示。新建工程工程創建完成,如下圖所示。注意:創建的EmptyProject工程會出現“×”號,如“”,編譯工程時可能出現找不到Makefile文件,無法編譯的問題。在接下來步驟中會在工程中手動添加Makefile文件,添加完所有必要文件后編譯工程,“×”號消失。新建工程新建一個Makefile文件。在創建一個新的工程后,選擇“File→New→Other”命令,在彈出的對話框“New”中單擊“General→File”選項,然后單擊“Next”按鈕,如圖4-29所示;選擇所要指定的工程后,輸入文件名“Makefile”,單擊“Finish”按鈕,如下圖所示。新建一個s5p6818.init仿真初始化文件。新建一個map.lds鏈接腳本文件新建一個led_asm.S匯編源文件。新建工程

.text.global_start_start: blLED_R_INITloop: blLED_R_ON bldelay1s blLED_R_OFF bldelay1s bloopLED_R_INIT: /*初始化GPIOA28引腳位為GPIO功能*/ ldrx0,=0xC001A024 /*RGB->R*/ ldrw1,[x0] bicw1,w1,#(0x3<<24) strw1,[x0] /*初始化GPIOA28引腳位為輸出功能*/ ldrx0,=0xC001A004 ldrw1,[x0] orrw1,w1,#(0x1<<28) strw1,[x0]LED_R_ON: /*設置GPIOA28引腳輸出高電平*/ ldrx0,=0xC001A000 ldrw1,[x0] orrw1,w1,#(0x1<<28) strw1,[x0] ret/*返回指令,等價于movpc,lr*/LED_R_OFF: /*設置GPIOA28引腳輸出低電平*/ ldrx0,=0xC001A000 ldrw1,[x0] bicw1,w1,#(0x1<<28) strw1,[x0] retdelay1s: ldrw3,=0x1000000 mm: subw3,w3,#1 cmpw3,#0 bnemm ret .endled_asm.S新建工程

OUTPUT_FORMAT("elf64-littleaarch64","elf64-littleaarch64","elf64-littleaarch64")OUTPUT_ARCH(aarch64)ENTRY(_start)SECTIONS{.=0x40008000;.=ALIGN(8);.text:{led_asm.o(.text)*(.text)}.=ALIGN(8);.rodata:{*(.rodata)}.=ALIGN(8);.data:{*(.data)}.=ALIGN(8);.bss:{*(.bss)}}map.lds新建工程

##Systemenvironmentvariable.#NAME=led_asmCROSS=~/toolchain/6.4-aarch64/bin/aarch64-linux-CC=$(CROSS)gccLD=$(CROSS)ldOBJCOPY=$(CROSS)objcopyOBGJDOMP=$(CROSS)objdumpCFLAGS=-O0-g-call:$(CC)$(CFLAGS)-o$(NAME).o$(NAME).S$(LD)$(NAME).o-Tmap.lds-o$(NAME).elf$(OBJCOPY)-Obinary-S$(NAME).elf$(NAME).bin$(OBGJDOMP)-D$(NAME).elf>$(NAME).disclean:rm-rf*.o*.bin*.elf*.dis.PHONY:allcleanMakefile新建工程

targetremotelocalhost:3333monitorhalts5p6818.init新建工程對工程進行編譯,點擊編譯按鈕或者使用快捷鍵“Ctrl+B”,編譯成功如下圖所示。4添加已有工程添加已有工程(1)拷貝“FSJTAG開發環境\程序源碼\01_led_asm”到Eclipse工作目錄下。如/home/linux/workspace/目錄。注意:工程要放在英文路徑下,不能有中文路徑。在ProjectExplorer窗口中空白位置右鍵單擊鼠標,選擇“Import…”選項,如下圖所示。添加已有工程彈出下圖所示的“Import”對話框,選中“ExistingProjectsIntoWorkspace”選項,然后單擊“Next”按鈕。添加已有工程出現“NewProject”對話框,單擊“Browse…”按鈕出現“瀏覽文件夾”對話框,選中實驗“01_led_asm”文件夾后單擊“OK”按鈕,如下圖所示。添加已有工程(4)單擊“Finish”按鈕,最終工程導入成功,如下圖所示。5編譯工程

編譯工程在編譯工程的時候,在“ProjectExplorer”工程欄中,要求只有一個工程處于打開狀態,其他的工程都應該處于關閉狀態。打開工程操作,在“ProjectExplorer”工程欄中,右鍵單擊要打開的工程,選擇“OpenProject”選項,如下圖所示。編譯工程關閉工程操作,在“ProjectExplorer”工程欄中,右鍵單擊要關閉的工程,選擇“CloseProject”,如下圖所示。編譯工程單擊編譯按鈕或者使用快捷鍵“Ctrl+B”對工程進行編譯,編譯成功,如下圖所示。6調試工程

調試工程配置FS-JTAG調試工具首先將仿真器的USB端接到電腦的USB接口,讓我們的Ubuntu系統連接上FS-JTAG仿真器,單擊“虛擬機可移動設備FirstUSB<=>JTAT&RS232連接”,如圖4-40所示。調試工程雙擊桌面上的“FS_JTAG”圖標之后,會出現下圖所示對話框,獲取管理員權限,密碼為“1”,單擊“OK”按鈕,FS_JTAG軟件打開成功。調試工程FS_JTAG打開成功后,在“Target”下拉列表中選擇“S5P6818”選項,如下圖所示。調試工程單擊“Connect”按鈕后,該按鈕會變為“DisConnect”,如下圖所示,即表示已經連接目標板。如果開發板和仿真器沒有進行連接或者開發板沒有上電,仿真器無法獲取相關信息,所以顯示錯誤信息,是正常現象。調試工程仿真器正確連接開發板并且開發板上電,單擊“Connect”按鈕后,該按鈕會變為“DisConnect”。如下圖所示。調試工程配置調試工具在菜單欄中選擇“RunDebugConfigurations…”,彈出“DebugConfigurations”窗口,在“ZylinEmbeddeddebug(Native)”選項上右鍵單擊鼠標,選擇“New”選項,如下圖所示。調試工程

然后單擊“Main”選項卡中的“Browse”按鈕選項選擇要執行的程序,調試的程序為.elf后綴的文件。找到01_led_asm目錄下的led_asm.elf文件,如下圖所示。調試工程

(3)在“Debugger”選項卡中的“Main”子選項卡中的“GDBdebugger”的框中單擊“Browse”按鈕選擇aarch64-linux-gdb交叉編譯工具鏈“/home/linux/toolchain/6.4-aarch64/bin/”,在“GDBCommandfile”框中選擇自己工程目錄下的“s5p6818.init”文件,如下圖所示。注:在“Debugger”選項卡中有一個“Stoponstartupat”復選項,如調試工程為c工程,有main函數則勾選該選項,否則不勾選。調試工程

在“Command”選項卡中,在“‘Initialize’commands”框中添加“load”命令,如圖4-48所示。注:在“Command”選項卡中,如我們配置的工程為C工程,添加的命令應作如下修改:

load

breakmain調試工程

添加完后單擊“Apply”按鈕,調試選項配置完成。再單擊“Debug”按鈕就可以進行調試了,如下圖所示。調試工程

如果出現“ConfirmPerspectiveSwitch”對話框,單擊“Yes”按鈕,如下圖所示。調試工程進入代碼仿真調試界面,如下圖所示。調試工程進入調試界面后,如下圖所示,單擊“”全速運行的調試按鈕,如果開發板上RGB三色燈中的紅燈開始閃爍,則表示整個開發環境搭建成功。調試工程仿真調試結束,關閉正在調試的工程,單擊Eclipse右上角的“DebugClose”選項,一個正在仿真調試的工程即可關閉,如下圖所示。調試工程查看變量和寄存器的方法可以在程序暫停狀態下查看變量或寄存器的值。下圖所示窗口是用來查看ARM寄存器的,通用寄存器的值可以被很清楚地觀察到。默認寄存器的值是按十進制顯示的,對于查看寄存器的值不方便,Eclipse支持設置為十六進制顯示,操作步驟單擊選中需要十六進制顯示的寄存器,右鍵單擊“FormatHexadecimal”選項,此時這個寄存器中的值就按十六進制顯示,如下圖所示。調試工程斷點設置方法可以通過添加斷點或者取消斷點的方式,控制代碼停在某一行代碼位置,如下圖所示。調試工程查看內存數據信息方法如下圖所示,可以通過“Window”菜單選項來選擇顯示內存窗口。在該窗口中輸入想要查詢的起始地址然后按“Enter”鍵,所輸入的地址中的數據就可以在該窗口查看了。調試工程調試結果后的處理一次調試結束后,需要停止調試,如果沒有停止上次的程序,在下次Debug時會出現調試不了的情況。此時在Debug窗口會出現多個待調試的任務。需要把所有任務都停止掉,如下圖所示。調試工程重新啟動開發板后,需要使用FS_TJAG軟件重新連接FS-JTAG(B)仿真器,如下圖所示。如果需要修改程序,需要停止正在仿真調試的程序,并切換到工程編輯界面,如下圖所示。第5章ARM處理器的指令系統華清遠見ARM指令的尋址方式ARM指令集ARM匯編語言偽指令ARM指令系統簡介1ARM指令系統簡介ARM指令分類ARMv8指令體系包括AArch32和AArch64兩種類型指令集合,AArch32指令主要目的是向下兼容ARMv7指令系統的。而每種指令集合中又包括ARM和Thumb兩種不同的指令集。當處理器工作在ARM狀態時,執行ARM指令集(以下簡稱ARM指令)。不管是AArch32指令還是AArch64指令,所有的ARM指令均為32位寬度,指令以字對齊的方式保存在存儲器中,而所有的Thumb指令都是16位寬度,指令均以半字對應的方式保存在存儲器中。ARM指令編碼格式典型的ARM指令語法格式如下,指令中各部分的含義,如表5-1所示。{label:*}{opcode{s}{dest{,source1{,source2{,source3}}}}}注意:花括號是可選的標識符NoteLabel標簽Opcode操作碼,也叫助記符,說明指令需要執行的操作類型S條件碼設置項,決定本次指令執行是否影響PSTATE寄存器響應狀態位值Dest目標寄存器,用于存放指令的執行結果。Source1第一個源操作數Source2第二個源操作數Source3第三個源操作數ARM指令條件碼域ARM指令中支持的所有的條件碼操作碼條件助記符標志位含義0000EQZ==1相等0001NEZ==0不相等0010CSC==1無符號的大于或等于0011CCC==0無符號小于0100MIN==1負數0101PLN==0正數或零0110VSV==1溢出0111VCV==0沒有溢出1000HIV==1&&Z==0無符號數大于1001LS!(C==0&&Z==1)無符號數小于或等于1010GEN==V有符號數大于或等于1011LTN!=V有符號數小于1100GTZ==0&&N==V有符號數大于1101LE!(Z==1&&N!=V)有符號數小于或等于1110無(AL)任意無條件執行1111無(NV)任意無條件執行2ARM指令的尋址方式數據處理指令尋址方式數據處理指令的基本語法格式:<opcode>{S}<Xd>,<Xn>,<shifter_operand>其中,<shifter_operand>有11種形式,如表所示。語法尋址方式1#<immediate>立即數尋址2<Xm>寄存器尋址3<Xm>,LSL#<shift_imm>立即數邏輯左移4<Xm>,LSL<Rs>寄存器邏輯左移5<Xm>,LSR#<shift_imm>立即數邏輯右移6<Xm>,LSR<Rs>寄存器邏輯右移7<Xm>,ASR#<shift_imm>立即數算術右移8<Xm>,ASR<Rs>寄存器算術右移9<Xm>,ROR#<shift_imm>立即數循環右移10<Xm>,ROR<Rs>寄存器循環右移11<Xm>,RRX寄存器擴展循環右移立即數尋址方式AArch64匯編語言不要求使用“#”符號引入立即數,但匯編程序必須允許這樣做。在AArch64匯編語言中在立即數前邊可以加“#”符號,也可以不加“#”符號。為了提高代碼的可讀性,AArch64反匯編程序都會在立即數前邊添加一個“#”號。下面是一些應用立即數的指令:MOVX0,#0xFF //將0xFF賦值給X0ADDX1,X1,#1 //X1=X1+1CMPX7,#2000 //將X7寄存器中的值和2000比較ORRX9,X1,#0xFF//將X1中的[7:0]位置1,結果寫到X9中或者MOVX0,0xFF //將0xFF賦值給X0ADDX1,X1,1 //X1=X1+1CMPX7,2000 //將X7寄存器中的值和2000比較ORRX9,X1,0xFF //將X1中的[7:0]位置1,結果寫到X9中寄存器尋址方式寄存器的值可以被直接用于數據操作指令,這種尋址方式是各類處理器經常采用的一種方式,也是一種執行效率較高的尋址方式,舉例如下。MOVX2,X0 //X0的值賦值X2ADDX4,X3,X2 //X2加X3,結果賦值X4CMPX7,X8 //比較X7和X8的值寄存器移位尋址方式寄存器的值在被送到ALU之前,可以事先經過桶形移位寄存器的處理。預處理和移位發生在同一周期內,所以有效地使用移位寄存器,可以增加代碼的執行效率。下面是一些在指令中使用了移位操作的例子。ADDX2,X0,X1,LSR#5//X1中的值右移5位,X0加X1,結果賦值給X2MOVX1,X0,LSL#2//X0中的值左移2位,結果賦值給X1SUBX1,X2,X0,LSR#4//X0中的值右移4位,X2減X0,結果賦值給X1內存訪問指令尋址方式在AArch64指令集中的加載/存儲尋址模式大致遵循T32,使用通用寄存器Xn(n=0-30)或當前堆棧指針SP的64位基址,具有立即數或寄存器偏移量方式。完整的尋址模式如表5-4所示。某些類型的加載/存儲指令可能僅支持其中的一部分。尋址方式偏移立即數寄存器擴展寄存器基址寄存器(無偏移)[base{,#0}]--基址寄存器(加偏移)[base{,#imm}][base,Xm{,LSL#imm}][base,Wm,(S|U)XTW{#imm}]事先更新尋址[base,#imm]!--事后更新尋址[base],#imm[base],Xm-PC相對尋址label--3ARM指令集數據處理指令數據處理指令是指對存放在寄存器中的數據進行操作的指令。主要包括:數據傳送指令算術運算指令邏輯運算指令移位運算指令比較與測試指令乘法指令數據傳送指令數據傳送指令多用于設置初始值或者在寄存器間傳送數據。常見的數據傳送指令,如表所示。指令格式指令含義MOVZWt,#uimm16{,LSL#pos}將16位立即數搬移到32位寄存器中,其他位為0:Wt=LSL(uimm16,pos)MOVZXt,#uimm16{,LSL#pos}將16位立即數搬移到64位寄存器中,其他位為0:Xt=LSL(uimm16,pos)MOVNWt,#uimm16{,LSL#pos}將16位立即數取反搬移到32寄存器中,其他位為0:Wt=NOT(LSL(uimm16,pos))MOVNXt,#uimm16{,LSL#pos}將16位立即數取反搬移到64位寄存器中,其他位為0:Xt=NOT(LSL(uimm16,pos))MOVKWt,

溫馨提示

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

評論

0/150

提交評論