arm编译器输出段
汇编主要是要了解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进行调试,查看内存,寄存器等值很方面