當前位置:首頁 » 編程軟體 » arm編譯器輸出段

arm編譯器輸出段

發布時間: 2023-05-20 15:22:44

① arm編程c語言的編程區別和方法

匯編主要是要了解CPU指令及用法,常說的是PC機的x86匯編,指令是x86的復雜指令集。
arm匯編是arm的精簡指令集,比x86容易學,程序格式倒是和x86匯編差不多。
C語言ARM的和x86的差不多,除了對硬體寄存器操作不同,其它語法和流程都一樣。
arm匯編程序每一行是指定arm core執行一條指令,每條指令都是硬體相關。
如:LDR R3, #1 ;用LDR指令將數值1放入R3寄存器准備參與運算
C語言與arm指令無關,只與邏輯運算有關,指定硬體地址的操作才與硬體相關;
如果用arm編譯器來編譯,每行可能編譯出1到多條arm指令。
如:i++; //變數 i 遞增1等效於LDR R3,#1 ;
用LDR指令將數值1放入R3寄存器准備參與運算ADD R2, R2, R3 ;
用ADD指令將R2、R3寄存器里的數值相加後放回R2寄存器以上等效匯編的R2、R3寄存器只是為了舉例,C語言不像匯編,不需要由程序員指定用哪個寄存器參與運算,編譯器編譯時會根據程序結構自動判斷選擇。
無論是c語言還是匯編語言,編譯器編譯後的結果是機器執行碼,很多人因為匯編語言比較難懂及指令相關,所以以為它就是機器語言,其實它仍是人類設計的編寫程序的語言,仍需要編譯器編譯成機器碼才能執行,它只是比C語言更接近硬體而已。

② MDK-arm的ARM編譯工具

ARM編譯工具鏈(之前被稱為ARM RealView編譯工具)包含:
ARM C/C++ 編譯器(armcc)
Microlib
ARM Macro匯編器(armasm)
ARM鏈接器(armLink)
ARM工具(Librarian and FromELF)
基於以上專門針對ARM架構的微控制器編譯器,工程師可以使用C或者C++編寫應用程序。通過以上編譯器的編譯,可以獲得ARM匯編語言的高效率和高速度。
ARM編譯器將C/C++元文件編譯成可重定位(Relocatable)的目標模塊,並且在其中嵌入供uVision調試器或在線調試器調試的符號信息。同時,ARM編譯器能幫助生成listing file,它可以包含symbol table(符號表)和交叉引用信息。
ARM RVCT編譯器被廣泛視為行業最佳的基於ARM架構的編譯器。它定位於最佳代碼密度的編譯器,可以幫助生成代碼量最小的編譯器,幫助節省代碼量對內存的要求從而降低硬體成本。同時,編譯器支持ISO標準的C/C++語言,可以將32-bit ARM, the 16-bit Thumb, 及混合的32/16-bit Thumb2 指令集生成經過高度優化的代碼。
ARM公司一直致力於持續改善ARM編譯器在代碼密度和代碼性能兩方面的性能,同時增添了很多新的特點,如Microlib等。

③ ARM架構簡介及詳細資料

歷史

一顆主要用於路由器的Conexant ARM處理器是Acorn電腦公司(Acorn Computers Ltd)於1983年開始的開發計畫。

這個團隊由Roger Wilson和Steve Furber帶領,著手開發一種新架構,類似進階的MOS Technology 6502處理器。Acorn有一大堆建構在6502架構上的電腦,因此能設計出一顆類似的晶片即意味著對公司有很大的優勢。

團隊在1985年時開發出ARM1 Sample版,而首顆"真正"的產能型ARM2於次年量產。ARM2具有32位的數據匯流排、26位的定址空間,並提供64 Mbyte的定址范圍與16個32-bit的暫存器。這些暫存器其中有一顆做為(word大小)程式計數器,其前面6 bits和後面2 bits用來保存處理器狀態標記(Processor Status Flags)。ARM2可能是全世界最簡單實用的32位微處理器,其僅容納了30,000個電晶體(相較於Motorola六年後的68000其包含了70,000顆)。之所以精簡的原因在於它不含微碼(請參閱microcode)(這表示大概只有68000的1/3至1/4),而與現今大多數的 CPU 不同,它沒有包含任何的高速快取。這個精簡的特色使它只需消耗很少的電能,卻能發揮比 Intel 80286 更好的效能。後繼的處理器ARM3更備有4KB的高速快取,使它能發揮更佳的效能。

在1980年代晚期,蘋果電腦開始與Acorn合作開發新版的ARM核心,由於這專案非常重要,Acorn甚至於1990年將設計團隊另組成一間名為安謀國際科技(Advanced RISC Machines Ltd.)的新公司。也基於這原因,使得差正ARM有時候反而稱作Advanced RISC Machine而不是Acorn RISC Machine。由扒森於其母公司ARM Holdings plc於1998年的倫敦交易市場和NASDAQ掛牌上市[1],使得Advanced RISC Machines成了ARM Ltd旗下擁有的產品。

這個專案到後來進入了ARM6,首版的式樣在1991年釋出,然後蘋果電腦使用ARM6架構的ARM 610來當作他們Apple Newton PDA的基礎。在1994年,Acorn使用ARM 610做為他們Risc PC電腦內的CPU。

在這些變革之後,核心部份卻大多維持一樣的大小。ARM2有30,000顆電晶體,但ARM6卻也只增長到35,000顆。主要概念是以ODM的方式,使ARM核心能搭配一些選配的零件而製成一顆完整的CPU,而且可在現有的晶圓廠里製作並以低成本的方式達到很大的效能。

ARM的經營模式在於出售其智慧財產權核(IP core),授權廠家依照設計製作出建構於此核的微控制器和中央處理器。最成功的實作案例屬 ARM7TDMI,幾乎賣出了數億套內建微控制器的裝置。

DEC 購買這個架構虛此悔的產權(此處會造成混淆在於其本身也製造 DEC Alpha 並研發出StrongARM。在 233 MHz 的頻率下,這顆 CPU 只消耗一瓦特的電能(後來的晶片消耗得更少)。這項設計後來為了和 Intel 的控訴和解而技術移轉,Intel 因而趁機以 StrongARM 架構補強他們老舊的 i960 產線。Intel 後來開發出他們自有的高效能實作,稱作XScale,之後也賣給了 Marvell。

支援智慧型型手機、PDA和其他手持裝置最常見的架構是ARMv4。XScale 和 ARM926 處理器是ARMv5TE,而且比起建構在 ARMv4 的 StrongARM、ARM925T 和 ARM7TDMI 等處理器還更常見於許多高階裝置上。架構版本如下欄所示。

設計檔案

講求精簡又快速的設計方式,整體電路化卻又不採用微碼,就像早期使用在Acorn微電腦的8位6502處理器。

ARM架構包含了下述RISC特性:

讀取/儲存 架構

不支援地址不對齊記憶體存取(ARMv6核心現已支持)

正交指令集(任意存取指令可以任意的定址方式存取數據Orthogonal instruction set)

大量的16 × 32-bit 暫存器陣列(register file)

固定的32 bits 操作碼(opcode)長度,降低編碼數量所產生的耗費,減輕解碼和流水線化的負擔。

大多均為一個CPU周期執行。

為了補強這種簡單的設計方式,相較於同時期的處理器如Intel 80286和Motorola 68020,還多加了一些特殊設計:

大部分指令可以條件式地執行,降低在分支時產生的負重,彌補分支預測器(branch predictor)的不足。

算數指令只會在要求時更改條件編碼(condition code)

32-bit筒型位移器(barrel shifter)可用來執行大部分的算數指令和定址計算而不會損失效能

強大的索引定址模式(addressing mode)

精簡但快速的雙優先權中斷子系統,具有可切換的暫存器組

有個附加在ARM設計中好玩的東西,就是使用一個4-bit 條件編碼 在每個指令前頭,表示每支指令的執行是否為有條件式的

這大大的減低了在記憶體存取指令時用到的編碼位,換句話說,它避免在對小型敘述如if做分支指令。有個標準的範例引用歐幾里得的最大公因子演算法:

在C程式語言中,循環為:

int gcd (int i, int j)

{

while (i != j)

if (i > j)

i -= j;

else

j -= i;

return i;

}

在ARM 匯編語言中,循環為:

loop CMP Ri, Rj ; 設定條件為 "NE"(不等於) if (i != j)

; "GT"(大於) if (i > j),

; or "LT"(小於) if (i < j)

SUBGT Ri, Ri, Rj ; 若 "GT"(大於), i = i-j;

SUBLT Rj, Rj, Ri ; 若 "LT"(小於), j = j-i;

BNE loop ; 若 "NE"(不等於),則繼續迴圈

這避開了then和else子句之間的分支。

另一項指令集的特色是,能將位移(shift)和回轉(rotate)等功能並成"資料處理"型的指令(算數、邏輯、和暫存器之間的搬移),因此舉例來說,一個C語言的敘述

a += (j << 2);

在ARM之下,可簡化成只需一個word和一個cycle即可完成的指令

ADD Ra, Ra, Rj, LSL #2

這結果可讓一般的ARM程式變得更加緊密,而不需經常使用記憶體存取,流水線也可以更有效地使用。即使在ARM以一般認定為慢速的速度下執行,與更復雜的CPU設計相比它仍能執行得不錯。

ARM處理器還有一些在其他RISC的架構所不常見到的特色,例如PC-相對定址(的確在ARM上PC為16個暫存器的其中一個)以及 前遞加或後遞加的定址模式。

另外一些注意事項是 ARM 處理器會隨著時間,不斷地增加它的指令集。某些早期的 ARM 處理器(比ARM7TDMI更早),譬如可能並未具備指令可以讀取兩 Bytes 的數量,因此,嚴格來講,對這些處理器產生程式碼時,就不可能處理如 C 語言物件中使用 "volatile short" 的資料型態。

ARM7 和大多數較早的設計具備三階段的流水線化(Pipeline):提取指令、解碼,並執行。較高效能的設計,如 ARM9,則有五階段的流水線化。提高效能的額外方式,包含一顆較快的加法器,和更廣的分支預測邏輯線路。

這個架構使用"協處理器"提供一種非侵入式的方法來延伸指令集,可透過軟體下 MCR、MRC、MRRC和MCRR 等指令來對協處理器定址。協處理器空間邏輯上通常分成16個協處理器,編號分別從 0 至 15 ,而第15號協處理器(CP15)是保留用作某些常用的控制功能,像是使用高速快取和記憶管理單元運算(若包含於處理器時)。

在 ARM 架構的機器中,周邊裝置連線處理器的方式,通常透過將裝置的實體暫存器對應到 ARM 的記憶體空間、協處理器空間,或是連線到另外依序接上處理器的裝置(如匯流排)。協處理器的存取延遲較低,所以有些周邊裝置(例如 XScale 中斷控制器)會設計成可透過不同方式存取(透過記憶體和協處理器)。

Thumb

較新的ARM處理器有一種16-bit指令模式,叫做Thumb,也許跟每個條件式執行指令均耗用4位的情形有關。在Thumb模式下,較小的opcode有更少的功能性。例如,只有分支可以是條件式的,且許多opcode無法存取所有CPU的暫存器。然而,較短的opcode提供整體更佳的編碼密度(注:意指程式碼在記憶體中占的空間),即使有些運算需要更多的指令。特別在記憶體埠或匯流排寬度限制在32 以下的情形時,更短的Thumb opcode能更有效地使用有限的記憶體頻寬,因而提供比32位程式碼更佳的效能。典型的嵌入式硬體僅具有較小的32-bit datapath定址范圍以及其他更窄的16 bits定址(例如Game Boy Advance)。在這種情形下,通常可行的方案是編譯成 Thumb 程式碼,並自行最佳化一些使用(非Thumb)32位指令集的CPU相關程式區,因而能將它們置入受限的32-bit匯流排寬度的記憶體中。

首顆具備 Thumb 技術的處理器是 ARM7TDMI。所有 ARM9 和後來的家族,包括 XScale 都納入了 Thumb 技術。

Jazelle

ARM 還開發出一項技術,Jazelle DBX (Direct Bytecode eXecution),允許它們在某些架構的硬體上加速執行Java bytecode,就如其他執行模式般,當呼叫一些無法支援bytecodes的特殊軟體時,能提供某些bytecodes的加速執行。它能在現存的ARM與Thumb模式之間互相執行。

首顆具備Jazelle技術的處理器是ARM926EJ-S:Jazelle以一個英文字母'J'標示於CPU名稱中。它用來讓手機製造商能夠加速執行Java ME的游戲和套用程式,也因此促使了這項技術不斷地開發。

Thumb-2

Thumb-2 技術首見於 ARM1156 核心 ,並於2003年發表。Thumb-2 擴充了受限的 16-bit Thumb 指令集,以額外的 32-bit 指令讓指令集的使用更廣泛。因此 Thumb-2 的預期目標是要達到近乎 Thumb 的編碼密度,但能表現出近乎 ARM 指令集在 32-bit 記憶體下的效能。

Thumb-2 至今也從 ARM 和 Thumb 指令集中派生出多種指令,包含位欄(bit-field)操作、分支建表(table branches),和條件執行等功能。

ThumbEE

ThumbEE,也就是所謂的Thumb-2EE,業界稱為Jazelle RCT技術,於2005年發表,首見於 Cortex-A8 處理器。ThumbEE 提供從 Thumb-2 而來的一些擴充性,在所處的執行環境(Execution Environment)下,使得指令集能特別適用於執行階段(Runtime)的編碼產生(例如即時編譯)。Thumb-2EE 是專為一些語言如 Limbo、Java、C#、Perl 和 Python,並能讓 即時編譯器 能夠輸出更小的編解碼卻不會影響到效能。

ThumbEE 所提供的新功能,包括在每次存取指令時自動檢查是否有無效指標,以及一種可以執行陣列范圍檢查的指令,並能夠分支到分類器(handlers),其包含一小部份經常呼叫的編碼,通常用於高階語言功能的實作,例如對一個新物件做記憶體配置。

NEON

進階 SIMD 延伸集,業界稱為NEON技術,它是一個結合 64 和 128 bit 的 SIMD(Single Instruction Multiple Data 單指令多重數據)指令集,其針對多媒體和訊號處理程式具備標准化加速的能力。NEON 可以在 10 MHz 的 CPU 上執行 MP3 音效解碼,且可以執行 13 MHz 頻率以下的 GSM AMR (Adaptive Multi-Rate) 語音編碼。NEON具有一組廣泛的指令集、各自的暫存器陣列,以及獨立執行的硬體。NEON 支援 8-, 16-, 32- 和 64-bit 的整數及單精度浮點數據,並以 SIMD 的方式運算,執行圖形和游戲處理中關於語音/視訊的部分。SIMD 在 向量超級處理機 中是個決定性的要素,它具備同時多項處理功能。在 NEON 技術中,SIMD 最高可支援到同時 16 個運算。

VFP

VFP 是在協同處理器針對ARM架構的衍生技術。它提供低成本的單精度和倍精度浮點運算能力,並完全相容於ANSI/IEEE Std 754-1985 二進制浮點算數標准。VFP 提供大多數適用於浮點運算的套用,例如PDA、智慧手機、語音壓縮解壓、3D圖像以及數位音效、印表機、機上盒,和汽車套用等。VFP 架構也支援 SIMD(單指令多重數據)平行化的短向量指令執行。這在圖像和訊號處理等套用上,非常有助於降低編碼大小並增加輸出效率。

在ARM-based處理器中,其他可見的浮點、或 SIMD 的協同處理器還包括了 FPA, FPE, iwMMXt。他們提供類似 VFP 的功能但在opcode層面上來說並不具有相容性。

安全性擴充

TrustZone(TM) 技術出現在 ARMv6KZ 以及較晚期的套用核心架構中。它提供了一種低成本的方案,針對系統單晶片(SoC)內加入專屬的安全核心,由硬體建構的存取控制方式支援兩顆虛擬的處理器。這個方式可使得套用程式核心能夠在兩個狀態之間切換(通常改稱為領域(worlds)以避免和其他功能領域的名稱混淆),在此架構下可以避免資訊從較可信的核心領域泄漏至較不安全的領域。這種核心領域之間的切換通常是與處理器其他功能完全無關聯性(orthogonal),因此各個領域可以各自獨立運作但卻仍能使用同一顆核心。記憶體和周邊裝置也可因此得知目前核心運作的領域為何,並能針對這個方式來提供對裝置的機密和編碼進行存取控制。典型的 TrustZone 技術套用是要能在一個缺乏安全性的環境下完整地執行作業系統,並在可信的環境下能有更少的安全性的編碼。

授權方

ARM 公司本身並不靠自有的設計來製造或出售 CPU ,而是將處理器架構授權給有興趣的廠家。ARM 提供了多樣的授權條款,包括售價與散播性等項目。對於授權方來說,ARM 提供了 ARM 核心的整合硬體敘述,包含完整的軟體開發工具(編譯器、debugger、SDK),以及針對內含 ARM CPU 矽晶片的銷售權。對於無晶圓廠的授權方來說,其希望能將 ARM 核心整合到他們自行研發的晶片設計中,通常就僅針對取得一份生產就緒的智慧財產權核心(IP Core)認證。對這些客戶來說,ARM 會釋出所選的 ARM 核心的版圖,連同抽象模擬模型和測試程式,以協助設計整合和驗證。需求更多的客戶,包括整合元件製造商(IDM)和晶圓廠家,就選擇可合成的RTL(暫存器傳輸級,如 Verilog)形式來取得處理器的智慧財產權(IP)。藉著可整合的 RTL,客戶就有能力能進行架構上的最佳化與加強。這個方式能讓設計者完成額外的設計目標(如高震盪頻率、低能量耗損、指令集延伸等)而不會受限於無法更動的電路圖。雖然 ARM 並不授予授權方再次出售 ARM 架構本身,但授權方可以任意地出售製品(如晶片元件、評估板、完整系統等)。商用晶圓廠是特殊例子,因為他們不僅授予能出售包含 ARM 核心的矽晶成品,對其它客戶來講,他們通常也保留重製 ARM 核心的權利。

就像大多數 IP 出售方,ARM 依照使用價值來決定 IP 的售價。在架構上而言,更低效能的 ARM 核心比更高效能的核心擁有較低的授權費。以矽晶片實作而言,一顆可整合的核心要比一顆硬體宏(黑箱)核心要來得貴。更復雜的價位問題來講,持有 ARM 授權的商用晶圓廠(例如韓國三星和日本富士通)可以提供更低的授權價格給他們的晶圓廠客戶。透過晶圓廠自有的設計技術,客戶可以更低或是免費的ARM預付授權費來取得 ARM 核心。相較於不具備自有設計技術的專門半導體晶圓廠(如台積電和聯電),富士通/三星對每片晶圓多收取了兩至三倍的費用。對中少量的套用而言,具備設計部門的晶圓廠提供較低的整體價格(透過授權費用的補助)。對於量產而言,由於長期的成本縮減可藉由更低的晶圓價格,減少ARM的NRE成本,使得專門的晶圓廠也成了一個更好的選擇。

許多半導體公司持有 ARM 授權:Atmel、Broad、Cirrus Logic、Freescale(於2004從摩托羅拉公司獨立出來)、富士通、英特爾(藉由和Digital的控訴調停)、IBM,英飛凌科技,任天堂,恩智浦半導體(於2006年從飛利浦獨立出來)、OKI電氣工業,三星電子,Sharp,STMicroelectronics,德州儀器 和 VLSI等許多這些公司均擁有各個不同形式的ARM授權。雖然ARM的授權項目由保密契約所涵蓋,在智慧財產權工業,ARM是廣為人知最昂貴的CPU核心之一。單一的客戶產品包含一個基本的 ARM 核心可能就需索取一次高達美金20萬的授權費用。而若是牽涉到大量架構上修改,則費用就可能超過千萬美元

④ ARM體系結構與編程的作品目錄

第1章 ARM概述及其基本編程模型
1. 1 ARM技術的應用領域及其特點
1. 2 ARM體系結構的版本及命名方法
1. 2. 1 ARM體系結構的版本
1. 2. 2 ARM體系的變種
1. 2. 3 ARM/Thumb體系版本的命名格式
l. 3 ARM處理器系列
1. 3. 1 ARM7系列
1. 3. 2 ARM9系列
1. 3. 3 ARM9E系列
1. 3. 4 ARM1OE系列
1. 3. 5 SecurCore系列
l. 4 ARM處理器模式
1. 5 ARM寄存器介紹
1. 5. l 通用寄存器
1. 5. 3 程序狀態寄存器
1. 6 ARM體系的異常中斷
1. 6. 1 ARM中異常中斷種類
1. 6. 2 ARM處理器對異常中斷的響應過程
1. 6. 3 從異常中斷處理程序中返回
1. 7 ARM體系中存儲系統
1. 7. 1 ARM體系中的存儲空間
1. 7. 2 ARM存儲器格式
1. 7. 3 非對齊的存儲訪問操作
1. 7. 4 指令預取和自修改代碼
第2章 ARM指令分類及其定址方式
2. 1 ARM指令集概要介紹
2. 1. 1 ARM指令的分類
2. 1. 2 ARM指令的一般編碼格式
2. 1. 3 ARM指令的條件碼域
2. 2 ARM指令定址方式
2. 2. l 數據處理指令的操作數的定址方式
2. 2. 2 字及無符號位元組的Load/Store指令的定址方式
2. 2. 3 雜類Load/Store指令的定址方式
2. 2. 4 批量Load/Store指令的定址方式
2. 2. 5 協處理器Load/Store指令的定址方式
第3章 ARM指令集介紹
3. 1 ARM指令集
3. 1. l 跳轉指令
3. l. 2 數據處理指令
3. 1. 3 乘法指令
3. 1. 4 雜類的算術指令
3. 1. 5 狀態寄存器訪問指令
3. l. 6 Load/Store內存訪問指令
3. 1. 7 批量Load/Store內存訪問指令
3. 1. 8 信號量操作指令
3. 1. 9 異常中斷產生指令
3. 1. 10 ARM協處理器指令
3. 2 一些基本的ARM指令功能段
3. 2. l 算術邏輯運算指令的應用
3. 2. 2 跳轉指令的應用
3. 2. 3 Loacl/Store指令的應用
3. 2. 4 批量Load/Store指令的應用
3. 2. 5 信號量指令的應用
3. 2. 6 與系統相關的一些指令代碼段
3. 3 Thumb指令介紹
第4章 ARM匯編語言程序設計
4. 1 偽操作
4. 1. l 符號定義偽操作
4. 1. 2 數據定義偽操作
4. 1. 3 匯編控制偽操作
4. 1. 4 棧中數據幀描述偽操作
4. 1. 5 信息報告偽操作
4. 1. 6 其他的偽操作
4. 2 ARM匯編語言偽指令
4. 3 ARM匯編語言語句格式
4. 3. 1 ARM匯編語言中的符號
4. 3. 2 ARM匯編語言中的表達式
4. 4 ARM匯編語言程序格式.
4. 4. l 匯編語言程序格式
4. 4. 2 匯編語言子程序調用
4. 5 ARM匯編編譯器的使用
4. 6 匯編程序設計舉例
4. 6. 1 ARM中偽操作使用實例
4. 6. 2 ARM中匯編程序實例
第5章 ARM存儲系統
5. 1 ARM存儲系統概述
5. 2 ARM中用於存儲管理的系統控制協處理器CP15
5. 2. 1 訪問CP15寄存器的指令
5. 2. 2 CP15中的寄存器
5. 3 存儲器管理單元MMU
5. 3. l 存儲器管理單元MMU概述
5. 3. 2 禁止/使能MMU
5. 3. 3 MMU中地址變換過程
5. 3. 4 MMU中存儲訪問許可權控制
5. 3. 5 MMU中的域
5. 3. 6 關於快表的操作
5. 3. 7 ARM中的存儲訪問失效
5. 4 高速緩沖存儲器和寫緩沖區
5. 4. 1 基本概念
5. 4. 2 cache的工作原理和地址映像方法
5. 4. 3 cache的分類
5. 4. 4 cache的替換演算法
5. 4. 5 緩沖技術的使用注意事項
5. 4. 6 存儲系統的一致性問題
5. 4. 7 cache內容鎖定
5. 4. 8 與cache和寫緩沖區相關的編程介面
5. 5 快速上下文切換技術
5. 5. l 快速上下文切換技術原理
5. 5. 2 快速上下文切換技術編程介面
5. 6 與存儲系統相關的程序設計指南
5. 6. l 地址空間
5. 6. 2 存儲器格式
5. 6. 3 非對齊的存儲訪問操作
5. 6. 4 指令預取和自修改代碼
5. 6. 5 IMB
5. 6. 6 存儲器映射的I/O空間
5. 7 AIOA存儲系統的實例
5. 7. 1 L7205的存儲系統概述
5. 7. 2 L7205中的SDRAM
5. 7. 3 L7205中的 MMU
第6章 ATPCS介紹
6. 1 ATPCS概述
6. 2 基本ATPCS
6. 2. l 寄存器的使用規則
6. 2. 2 數據棧使用規則
6. 2. 3 參數傳遞規則
6. 3 幾種特定的ATPCS
6. 3. l 支持數據棧限制檢查的ATPCS
6. 3. 2 支持只讀段位置無關(ROPI)的ATPCS
6. 3. 3 支持可讀寫段位置無關(RWPI)的ATPCS
6. 3. 4 支持ARM程序和Thumb程序混合使用的ATPCS
6. 3. 5 處理浮點運算的ATPCS
第7章 ARM程序和Thumb程序混合使用
7. 1 概述
7. 2 在匯編語言程序中通過用戶代碼支持interwork
7. 2. l 可以實現程序狀態切換的指令
7. 2. 2 與程序狀態切換相關的偽操作
7. 2. 3 進行狀態切換的匯編程序實例
7. 3 在C/C++程序中實現interwork
7. 4 在匯編語言程序中通過連接器支持interwork
7. 4. l 利用veneers實現匯編程序間的程序狀態切換
7. 4. 2 利用veneers實現匯編程序與C/C++程序間的程序狀態切換
第8章 CC++以及匯編語言的混合編程
8. l 內嵌匯編器的使用
8. 1. l 內嵌的匯編指令用法
8. 1. 2 內嵌的匯編器和armasm的區別
8. l. 3 在CC++程序中使用內嵌的匯編指令
8. 1. 4 內嵌匯編指令的應用舉例
8. 2 從匯編程序中訪問C程序變數
8. 3 匯編程序.C程序以及C++程序的相互調用
8. 3. l 在C++程序中使用C程序頭文件
8. 3. 2 匯編程序.C程序以及C++程序的相互調用舉例
第9章 異常中斷處理
9. 1 ARM中異常中斷處理概述
9. 1. 1 ARM體系中異常中斷種類
9. 1. 2 異常中斷向量表及異常中斷優先順序
9. 1. 3 異常中斷使用的寄存器
9. 2 進入和退出異常中斷的過程
9. 2. 1 ARM處理器對異常中斷的響應過程
9. 2. 2 從異常中斷處理程序中返回
9. 3 在應用程序中安裝異常中斷處理程序
9. 3. 1 在系統復位時安裝異常中斷處理程序
9. 3. 2 在C程序中安裝異常中斷處理程序
9. 4 SWI異常中斷處理程序
9. 4. 1 SWI異常中斷處理程序的實現
9. 4. 2 SWI異常中斷調用
9. 5 FIQ和IRQ異常中斷處理程序
9. 5. 1 IRQ/FIQ異常中斷處理程序
9. 5. 2 IRQ異常中斷處理程序舉例
9. 6 復位異常中斷處理程序
9. 7 未定義指令異常中斷
9. 8 指令預取中止異常中斷處理程序
9. 9 數據訪問中止異常中斷處理程序
第10章 ARM C/0++編譯器
10. 1 ARM C/C++編譯器概述
10. 1. 1 ARM C/C++編譯器及語言庫介紹
10. l. 2 ARM編譯器中與搜索路徑相關的一些基本概念
10. 2 ARM編譯器命令行格式
10. 2. l 過程調用標准
10. 2. 2 設置源程序語言類型
10. 2. 3 指定搜索路徑
10. 2. 4 設置預處理選項
10. 2. 5 設置輸出文件類型
10. 2. 6 指定目標處理器和ARM體系版本
10. 2. 7 生成調試信息
10. 2. 8 代碼生成的控制
10. 2. 9 控制警告信息的產生
10. 2. 10 編譯時進行的一些額外的檢查
10. 2. 11 控制錯誤信息
10. 3 ARM編譯器中的pragmas
10. 4 ARM編譯器特定的關鍵詞
10. 4. 1 用於聲明函數的關鍵詞
10. 4. 2 用於聲明交量的關鍵詞
10. 4. 3 用於限定數據類型的關鍵詞
10. 5 ARM編譯器支持的基本數據類型
10. 6 ARM編譯器中預定義宏
10. 7 ARM中C/C++庫
10. 7. 1 ARM中C/C++運行時庫概述
10. 7. 2 建立一個包含C/C++運行時庫的C/C++應用程序
10. 7. 3 建立不包含C運行時庫的應用程序
10. 7. 4 裁減C/C++運行時庫以適應特定的目標運行環境
第11章 ARM連接器
11. 1 ARM映像文件
11. 1. 1 ARM映像文件的組成
11. 1. 2 ARM映像文件的入口點
11. 1. 3 輸入段的排序規則
11. 2 ARM連接器介紹
11. 3 ARM連接器生成的符號
11. 3. 1 連接器生成的與域相關的符號
11. 3. 2 連接器生成的與輸出段相關的符號
11. 3. 3 連接器生成的與輸入段相關的符號
11. 4 連接器的優化功能
11. 5 運行時庫的使用
11. 5. 1 C/C++運行時庫與目標文件
11. 5. 2 查找需要的C/C++運行時庫
11. 5. 3 選擇合適種類的C/C++運行時庫
11. 5. 4 掃描C/C++運行時庫
11. 6 從一個映像文件中使用另一個映像文件中的符號
11. 6. 1 symdefs文件
11. 6. 2 建立symdefs文件
11. 6. 3 symdefs文件的使用
11. 7 隱藏或者重命名全局符號
11. 7. l steering文件的格式
11. 7. 2 steering文件中的命令
11. 8 ARM連接器命令行選項
11. 9 使用scatter文件定義映像文件的地址映射
11. 9. l scatter文件概述
11. 9. 2 satter文件中各部分介紹
11. 9. 3 scatter文件使用舉例
第12章 嵌入式應用程序示例
12. l 嵌入式應用程序設計的基本知識
12. 1. 1 嵌入式應用系統中的存儲映射
12. 1. 2 系統初始化
12. 2 使用semihosting的 C語言程序示例
12. 2. 1 源程序分析
12. 2. 2 生成映像文件
12. 3 一個嵌入式應用系統示例
12. 3. l 源程序分析
12. 3. 2 生成映像文件
12. 3. 3 本例中地址映射模式
12. 4 進行ROM/RAM地址重映射的嵌入式應用系統
12. 4. l 地址映射模式
12. 4. 2 源程序分析
12. 4. 3 生成映像文件
12. 5 一個嵌入式操作系統示例
第13章 使用CodeWarrior
13. 1 CodeWarrior for ADS概述
13. 2 簡單工程項目的使用
13. 2. 1 工程項目窗口
13. 2. 2 簡單工程項目的使用
13. 3 配置生成目標
13. 3. 1 Debug Settings對話框介紹
13. 3. 2 設置牛成目標的基本選項
13. 3. 3 匯編器選項設置
13. 3. 4 編譯器的選項設置
13. 3. 5 連接器的選項設置
13. 3. 6 fromELF工具的選項設置
13. 4 復雜工程項目的使用
13. 4. l 建立一個新的生成目標
13. 4. 2 將一個生成目標更名
13. 4. 3 建立生成目標之間的依賴關系
13. 4. 4 子工程項目的使用
13. 5 工程項目模板
13. 5. 1 ADS中工程項目模板的使用
13. 5. 2 建立用戶工程項目模板
13. 6 編譯和連接工程項目
13. 6. 1 編譯文件
13. 6. 2 生成工程項目
第14章 ARM體系中的調試方法
14. 1 ARM體系中調試系統概述
14. 2 基於Angel的調試系統
14. 2. l 基於Angel的調試系統的概述
14. 2. 2 使用Angel開發應用程序
14. 2. 3 Angel執行的操作
14. 2. 4 將Angel移植到特定的目標系統
14. 3 基於JTAG的調試系統
14. 3. l 基於JTAG的調試系統的特點
14. 3. 2 基於JTAG的調試系統結構
14. 3. 3 目標系統中的調試功能擴展部件
14. 3. 4 基於JTAG的調試過程
14. 4 ADW使用介紹
14. 4. 1 ADW概述
14. 4. 2 ADW中的窗口
14. 4. 3 ADW使用介紹

⑤ 在ARM上運行交叉編譯後的opencv文件,沒有輸出

一、交叉編譯opencv
構造:

下載:各個庫的下載可以直接搜名字到官網下載
幾個關鍵解釋:
「--prefix=」 後邊跟make install時的位置,本例中,libz在make install時將安裝到/usr/arm-linux-gnueabihf中
「--host=」 後邊跟arm-linux表明使用的是ARM環境
有configure的才能進行configure配置
4)所有的makefile修改類似
Libz的交叉編譯
第一步:# ./configure --prefix=/usr/arm-linux-gnueabihf --shared
第二步:修改makefile,主要有下邊幾個,修改的時候通篇參照即可
CC=arm-linux-gnueabihf-gcc
AR=arm-linux-gnueabihf-ar rc
RANLIB=arm-linux-gnueabihf-ranlib
STRIP = arm-linux-gnueabihf-strip
如果有ARCH的話,ARCH=ARM
第三步:#sudo make
#sudo make install
Libjpeg的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc
第二步:參考1)中方法修改makefile
第三步:#sudo make
#sudo make install
Libpng的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static CC=arm-linux-gnueabihf-gcc
第二步:參考1)中方法修改makefile
第三步:#sudo make
#sudo make install
Yasm的交叉編譯
第一步:#./configure --host=arm-linux --prefix=/usr/arm-linux-gnueabihf --enable-shared --enable-static
第二步:修改makefile
第三步:#sudo make
#sudo make install
Libx264的交叉編譯
第一步:#CC=arm-linux-gnueabihf-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=/usr/arm-linux-gnueabihf
第二步:修改config.mak里的參數,因為makefile要調用config.mak,所以修改方法同makefile
第三步:#sudo make
#sudo make install
Libxvid的交叉編譯
第一步:首先切換目錄 #cd build/generic
第二步:#./configure --prefix=/usr/arm-linux-gnueabihf --host=arm-linux --disable-assembly
第三步:#sudo make
#sudo make install
ffmpeg的交叉編譯
第一步:
./configure --enable-cross-compile --target-os=linux --cc=arm-linux-gnueabihf-gcc --arch=arm --enable-shared --disable-static --enable-gpl --enable-nonfree --enable-ffmpeg --disable-ffplay --enable-ffserver --enable-swscale --enable-pthreads --disable-yasm --disable-stripping --enable-libx264 --enable-libxvid --extra-cflags=-I/usr/arm-linux-gnueabihf/include --extra-ldflags=-L/usr/arm-linux-gnueabihf/lib --prefix=/usr/arm-linux-gnueabihf
第二步:修改makefile文件
第三步:#sudo make
#sudo make install
第四步:將ffmpeg加入pkg-config
執行#sudo gedit /etc/bash.bashrc,在末尾加入
export LD_LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/arm-linux-gnueabihf /lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/usr/arm-linux-gnueabihf /lib/
完畢後使用命令:#source /etc/bash.bashrc
或者單獨使用三個export,不過壽命只在一個終端中,終端關閉時就失效。
幾個關鍵解釋:--extra-flags指向xvid的安裝路徑,--extra-ldflags指向x264的路徑
安裝cmake-gui
執行:#sudo apt-get install cmake-qt-gui
Opencv的交叉編譯
第一步:修改opencv/platflrms/linux/目錄下的arm-gnueabi.toolchain.cmake,將其所有刪掉,寫入:
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gnueabihf-gcc )
set( CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ )
第二步:在opencv目錄下新建build目錄,進入build目錄,執行命令:
#cmake -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake ../
這時,要保證出現:

第三步:使用cmake-gui打開CMakeCache.txt,去掉所有的無關項,修改CMAKE_INSTALL_PREFIX,來確定make install的目錄
第四步:#sudo make
#sudo make install
可能出現的錯誤:
opencv編譯不通過,出現skip之類的,說明ffmpeg沒編譯好,或者其編譯好了,但是pkg-config沒有設置好,一定要設置好其環境
前邊幾步不通過的話,看看命令有沒有少,或者有沒有修改好makefile
在arm上使用時,一種方法時直接將編譯好的opencv目錄下的lib文件拷貝到開發板對應的/lib目錄下,其他或者拷貝到自己指定的目錄,並設置好環境變數即可使用

⑥ ARM中C語言調用匯編程序,如何用ARM編譯器調試啊,急!!!求大家幫助

編程的時候用ADS1.2就可以了,新建一個工程,把匯編的.s和C程序的.c都加進去,注意好程序的入口位置,然後編譯,用AXD進行調試,查看內存,寄存器等值很方面

熱點內容
交易貓買腳本靠譜嗎 發布:2025-07-17 11:32:27 瀏覽:520
伺服器系統盤一般做什麼陣列 發布:2025-07-17 11:16:05 瀏覽:362
如何用c語音實現放射密碼 發布:2025-07-17 11:13:03 瀏覽:734
lol腳本2017 發布:2025-07-17 10:52:18 瀏覽:827
編譯條件有哪些 發布:2025-07-17 10:42:51 瀏覽:334
apache設置靜態內容緩存時間 發布:2025-07-17 10:32:32 瀏覽:294
蘋果6不能緩存的視頻 發布:2025-07-17 10:31:44 瀏覽:404
如何把文件夾共享 發布:2025-07-17 10:23:49 瀏覽:298
linux查看命令大全 發布:2025-07-17 10:21:24 瀏覽:976
安卓應用程序和蘋果手機哪個好 發布:2025-07-17 10:20:43 瀏覽:411