ARM程序分析与设计<br /><br /><br /><br /> 王宇行 编著<br /><br /><br />北京航空航天大学出版社 <br /><br /><br /><br /><br />内容简介<br /><br />以实例阐述知识点,从简到难,系统阐述ARM嵌入式开发的知识和技能。内容包括:ARM的开发工具及其开发的整个过程,ARM映像文件分析,ARM汇编语言和C语言,标准C库的用法,ARM汇编语言和C语言混合编程的技术,引导代码分析,ARM中断处理原理和实现方法,调试的基本原理和技术,分散加载技术,位置无关代码和数据的原理和开发方法。<br />本书可作为ARM嵌入式系统开发人员的参考书,也可作为学习ARM嵌入式技术的培训教材。<br /><br /><br /><br />? 2008,北京航空航天大学出版社,版权所有。<br />未经本书出版者书面许可,任何单位和个人不得以任何形式或手段复制或传播本书内容。<br />侵权必究。<br /><br /> <br />前 言<br />嵌入式技术与ARM<br /> 在现实生活中,嵌入式设备随处可见,成为生活的一部分,如人人使用的手机,数码相机,个人数字助理(PDA)等。中国作为嵌入式设备消费和制造大国,对嵌入式技术人才的需求是巨大的。ARM处理器(它的全程是Advanced RISC Machines)是目前世界上最为流行的和应用最为广泛的32位处理器,它被嵌入到日常生活中使用的各种产品中,从手机到汽车里的定位仪器。它体积小,重量轻,成本低,可靠性高,高性能,低功耗,是嵌入式设备的核心。社会对基于ARM嵌入式技术的软硬件设计人才、应用开发人才的需求越来越大,同时基于ARM系统的开发人员也越来越庞大,有初学者,也有身经百战的资深工程师。这就是本书诞生的根本缘由。本书的目的,就是为读者提供学习和开发ARM系统所需要的技能和经过消化的知识点;使读者掌握基础知识的同时,系统地掌握基于ARM的嵌入式系统的开发方法,以最快的速度和最短的时间掌握ARM系统下的开发技术。<br />本书特点<br /> 1.基础与实践的结合<br /> 本书详细地以实例阐述了开发基于ARM的嵌入式系统所需要的基础知识,而采用的实例都来源于实际的工程开发,所以可以在实际的工程项目中直接采用。对于入门者,可以用它来学习基础知识;对于资深工程师,可以强化基础知识,也可以在实际的开发中参考借鉴。<br /> 2.分散与系统的结合<br /> 本书独立地阐述了基于ARM的嵌入式系统基础知识,同时也用实例系统地阐述了嵌入式系统的开发流程,点面结合,可以帮助读者系统地掌握ARM嵌入式系统的开发技术。<br />主要内容<br /> 全书共分11章,以实例阐述知识点,从简到难,系统地阐述了嵌入式开发知识和技能。<br /> 第1章:描述ARM的开发工具及其开发的整个过程,包括编译、链接以及最终可执行映像文件的产生。并对常用的编译参数和makefile做了简单的描述。最终的目的是,给大家一个总体开**廓和概念,为理解以后的章节做准备。<br />第2章:系统的介绍ARM编译器armcc,armasm输出的目标文件,和ARM链接器输出的可执行映像文件的物理结构和逻辑结构。并详细描述与之相关的一些技术和实现实例:装载域和运行域的存储映射,分散加载技术。<br />第3章:详细的阐述ARM处理器的基本概念,ARM汇编语言编程及大量的ARM汇编实例。<br />第4章:介绍用C语言开发ARM系统常用的一些技术概念,以及C语言编程的优化技术。<br />第5章:介绍标准C库的使用方法,使用流程以及对标准C库的裁减方法以满足实际的目标系统。<br />第6章:以实例阐述ARM语言和C语言混合编程的技术,包括内联汇编、嵌入式汇编以及ARM语言和C语言函数相互调用的编程技术。<br />第7章:详细阐述系统初始化原理和流程。对系统初始化过程中相关的硬件作了详细描述。<br />第8章:详细阐述中断处理原理和实现方法。以一个外部中断为例来介绍编写中断服务程序的流程和一些基本概念<br />第9章:介绍调试的基本原理和技术。重点讨论基于JTAG的调试的基本理论和方法。<br />第10章:阐述分散加载技术所需要的配置文件和分散加载技术在实际开发中的使用技术和方法。<br />第11章:用一个实例来阐述位置无关的代码和数据的原理和开发方法。<br />主要读者<br />本书对ARM处理器从基本概念到整个系统开发做了详细的阐述。涉及到每个概念和知识点,不是对他们简单的罗列,而是以通俗易懂的语言和详细的实例来阐述他,使读者不需要咀嚼消化,就可以直接吸收。通过阅读本书,读者可以系统地掌握ARM开发的各方面知识,所以,他可以做为学习ARM技术的培训资料、可以作为开发人员的参考资料、也可以作为大学学生的辅导教材。<br />致 谢<br /> 感谢我的很多同事提供了技术上的建议,感谢我的家人对我的支持和关心。由于时间仓促和水平所限,错误和不妥的地方,请读者批评指正并给出宝贵意见。<br /> <br /><br />王宇行 <br />2007年8月 <br /><br /><br /> <br /> 目录<br />第一章 ARM 开发工具 1<br />1.1 开发流程 1<br />1.2 开发工具 3<br />1.2.1 编译器简介 3<br />1.2.2 链接器简介 4<br />1.2.3 fromelf工具 5<br />1.2.4 常用的编译和链接参数 6<br />1.2.5 makefile基础 10<br />1.3 总 结 14<br />第二章 ARM 映像文件分析 15<br />2.1 映像文件物理结构 15<br />2.1.1 ELF简介 16<br />2,1,2 目标文件的物理结构 17<br />2.1.3 可执行映象文件的物理结构 22<br />2.2 映像文件的逻辑结构 26<br />2.2.1逻辑结构的基本构成 26<br />2.2.2 装载域和运行域 29<br />2.2.3 分散加载技术 32<br />2.2.4 装载域到运行域的数据拷贝 36<br />2.3 本章总结 41<br />第三章:ARM汇编语言基础 42<br />3.1 ARM 处理器概述 42<br />3.1.1 ARM处理器模式 42<br />3.1.2 寄存器 43<br />3.1.3 处理器工作状态 52<br />3.1.4 ARM数据长度 52<br />3.1.5 ARM存储系统 53<br />3.1.6 存储和地址相关内容 54<br />3.2 ARM 汇编程序的结构 59<br />3.2.1段 59<br />3.2.2 标识符(label) 60<br />3.2.3 程序入口 62<br />3.2.4 程序结束 62<br />3.2.5 包含其它汇编源文件 62<br />3.2.6引用外部标识符 62<br />3.3 ARM 汇编程序的常量和变量 63<br />3.3.1常量 63<br />3.3.2变量 64<br />3.4 ARM 汇编程序的运算符和表达式 68<br />3.4.1数字表达式 69<br />3.4.2 逻辑表达式 70<br />3.4.3 数字和逻辑表达式实例 70<br />3.4.4 字符串表达式 71<br />3.5 ARM 汇编程序的数据定义 75<br />3.5.1 LTORG 75<br />3.5.2 DCB 79<br />3.5.3 DCW 79<br />3.5.4 DCD 79<br />3.5.5 DCB,DCW,DCD使用实例 80<br />3.5.6 SPACE 81<br />3.5.7 MAP和FILED 82<br />3.5.8 MAP和FILED实例 82<br />3.6 ARM 汇编程序的控制结构 84<br />3.6.1 选择 84<br />3.6.2 循环 85<br />3.6.3 选择和循环实例 86<br />3.7 ARM 汇编指令 87<br />3.7.1 数据处理指令 88<br />3.7.2 比较指令 98<br />3.7.3 存储器访问指令 103<br />3.7.4 堆栈操作指令 112<br />3.7.5 交换指令 119<br />3.7.6 跳转指令 121<br />3.7.7条件执行指令 125<br />3.7.8 软件中断指令SWI 132<br />3.8. ARM 程序和THUMB程序混合使用 135<br />3.8.1混合使用的原因 135<br />3.8.2 ARM和Thumb状态的切换方式 135<br />3.9 汇编语言实例 138<br />3.9.1 字符串处理 138<br />3.9.2 十进制数转换为7段数码显示 141<br />3.9.3 系统初始化简介 143<br />3.9.4 七段数码显示 147<br />3.10 总结 154<br />第四章:ARM C语言基础 155<br />4.1 数据类型 155<br />4.1.1 基本数据类型 155<br />4.1.2 数据类型修饰符 156<br />4.2 常量 157<br />4.2.1 整数 157<br />4.2.2 字符 157<br />4.2.3 字符串 157<br />4.3 变量 158<br />4.3.1变量修饰符. 158<br />4.4 操作符 162<br />4.4.1 算数操作符 162<br />4.4.2 关系操作符 163<br />4.4.3 逻辑操作符 163<br />4.4.4 位操作符 163<br />4.5 控制结构 164<br />4.5.1选择 164<br />4.5.2 循环 167<br />4.6 结构体 169<br />4.7 编译指令 171<br />4.7.1 #define和#undef 171<br />4.7.2 #if 和#endif 171<br />4.7.3 :#error 172<br />4.8 C程序优化 172<br />4.8.1除法和求余运算 172<br />4.8.2 条件执行 174<br />4.8.3 关系表达式 175<br />4.8.4 循环 177<br />4.8.5 寄存器分配 177<br />4.8.6 函数 180<br />第五章:标准C库的应用 184<br />5.1 标准C库的组成 184<br />5.1.1 与目标硬件无关的库函数 184<br />5.1.2 与目标硬件相关的库函数 184<br />5.2 标准C库的位置 185<br />5.3 标准C库的使用流程 185<br />5.3.1 标准C库完成的功能 185<br />5.3.2 应用程序使用库函数时的调用过程 185<br />5.4 标准C库函数的移植和重定向简例 188<br />5.4.1系统初始化程序init.s 189<br />5.4.2 主程序main.c 190<br />5.5 ARM编译器对C语言的扩展 193<br />5.5.1 __irq 193<br />5.5.2 __swi 194<br />5.5.3 __asm 195<br />5.5.4 __inline 196<br />5.5.5 __weak 196<br />5.5.6 register 197<br />5.5.7 _int64 197<br />5.5.8 _pure 198<br />5.5.9 __value_in_regs 198<br />第六章:ARM 汇编和C混合编程 199<br />6.1 C语言里嵌入汇编指令 199<br />6.1.1 内联汇编(Inline Assemble) 199<br />6.1.2 内联汇编实例 199<br />6.1.3 嵌入式汇编(Embedded Assemble) 201<br />6.2 C 程序调用汇编语言函数 202<br />6.3 汇编程序调用C语言函数 203<br />6.3.1 汇编中调用用户自定义的C函数 203<br />6.3.2 汇编中调用标准库函数 203<br />6.5 APCS概述 205<br />6.5.1 寄存器的使用规则 205<br />6.5.2 堆栈的使用规则 205<br />6.5.3 参数传递规则 206<br />6.5.4 函数返回值规则 207<br />6.5.5 参数传递和函数返回值总结 207<br />6.6 混合编程实例 209<br />6.6.1生成伪随机数 209<br />6.6.2 数字转化成字符串 212<br />6.7 编写基于ROM的程序 217<br />6.7.1系统初始化 217<br />6.7.2 裁剪库函数 224<br />6.7.3 中断处理 226<br />6.7.4 串口驱动 230<br />6.7.5 I/O地址映射 230<br />6.7.6 生成并装载Rom映像文件 232<br />6.7.7 在scatter文件里定义堆栈 235<br />第七章:引导代码分析 237<br />7.1 前言 237<br />7.2 概述 237<br />7.2.1 BOOT相关硬件:FLASH ROM 237<br />7.2.2 BOOT的主要功能 238<br />7.2.3 主要功能分析 242<br />7.2.4 BOOT流程图 255<br />7.2.5 地址重映射 262<br />第八章:ARM中断处理 266<br />8.1中断概述 266<br />8.1.1 中断分类 266<br />8.1.2 响应时间 266<br />8.1.3 屏蔽和使能中断 267<br />8.1.4可重入的中断处理程序 268<br />8.2 硬件中断处理流程 268<br />8.2.1 ARM内核自动完成的动作 268<br />8.2.2 跳转到中断处理函数 269<br />8.2.3 中断处理完成后返回 269<br />8.2.4 中断处理流程图(图8.2) 270<br />8.3 硬件中断实现 272<br />8.3.1 定义中断服务程序 274<br />8.3.2 主程序 274<br />8.4 中断服务子程序中关键的变量类型 276<br />8.4.1 Volatile 276<br />8.4.2 _irq 279<br />8.4.3 访问绝对地址的内存位置 280<br />第九章:调试基础 281<br />9.1 调试构架 281<br />9.1.1 调试主机 282<br />9.1.2 协议转换器 282<br />9.1.3 调试目标 282<br />9.2 调试逻辑结构 287<br />9.3 JTAG简介 288<br />9.3.1 基本概念 288<br />9.3.2 使用举例 290<br />第十章:SCATTER文件 291<br />10.1 SCATTER文件的作用 291<br />10.2 SCATTER文件简介 291<br />10.2.1 对加载域的描述 291<br />10.2.2 对运行域的描述 292<br />10.2.3 对输入段的描述 292<br />10.3 SCATTER文件的使用 293<br />10.3.1系统挂接不同类型的存储器 293<br />10.3.2 复杂的内存映射(memory map) 293<br />10.3.3 映射外部控制寄存器的地址 295<br />10.3.4 映射堆和栈的地址 296<br />10.3.5 Scatter文件实例 297<br />第十一章:位置无关代码和数据 298<br />11.1 简介 298<br />11.2 只读段(RO)位置无关(PI) 298<br />11.2.1编写位置无关的代码 298<br />11.2.2 位置无关的代码编译和连接参数 299<br />11.2.3 位置无关的代码段分析 299<br />11.3 读写段(RW)位置无关(PI) 307<br />11.3.1可重入代码(Reentrant Code) 307<br />11.3.2 位置无关的数据编译和连接参数 310<br />11.4 位置无关(PI)代码段和数据段编写实例分析 310<br />11.4.1实例简介 310<br />11.4.2 symdefs文件 311<br />11.4.3 实例分析 315<br /><br /> |
|