logo资料库

ADS手册1.2版.pdf

第1页 / 共28页
第2页 / 共28页
第3页 / 共28页
第4页 / 共28页
第5页 / 共28页
第6页 / 共28页
第7页 / 共28页
第8页 / 共28页
资料共28页,剩余部分请下载后查看
ARM ADS集成开发环境的使用
8.1 ADS集成开发环境组成介绍
8.1.1 命令行开发工具
8.1.1.1 armcc用法详解
8.1.1.2 armlink用法详解
8.1.2 ARM运行时库
8.1.2.1 运行时库类型和建立选项
8.1.2.2 库路径结构
8.1.3 GUI开发环境\(Code Warrior和AXD\)
8.1.3.1 CodeWarrior集成开发环境
8.1.3.2 ADS调试器
实用程序
8.1.5 支持的软件
8.2 使用ADS创建工程
8.2.1 建立一个工程
8.2.2 编译和链接工程
8.2.3 使用命令行工具编译应用程序
8.3 用AXD进行代码调试
8.4 本章小结
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 第8章 ARM ADS 集成开发环境的使用 在这一章里,将介绍 ARM 开发软件 ADS(ARM Developer Suite)。通过学习如何在 CodeWarrior IDE 集成开发环境下编写,编译一个工程的例子,使读者能够掌握在 ADS 软件 平台下开发用户应用程序。本章还描述了如何使用 AXD 调试工程,使读者对于调试工程有 个初步的理解,为进一步的使用和掌握调试工具起到抛砖引玉的作用。 本章主要内容有: - ADS 软件组成介绍 - 使用 ADS 创建工程 - 用 AXD 进行代码调试 8.1 ADS 集成开发环境组成介绍 ARM ADS 全称为 ARM Developer Suite。是 ARM 公司推出的新一代 ARM 集成开发工 具。现在 ADS 的最新版本是 1.2,它取代了早期的 ADS1.1 和 ADS1.0。它除了可以安装在 Windows NT4,Windows 2000,Windows 98 和 Windows 95 操作系统下,还支持 Windows XP 和 Windows Me 操作系统。 ADS 由命令行开发工具,ARM 时实库,GUI 开发环境(Code Warrior 和 AXD),实用程 序和支持软件组成。 有了这些部件,用户就可以为 ARM 系列的 RISC 处理器编写和调试自 己的开发应用程序了。 下面就详细介绍一下 ADS 的各个组成部分。 8.1.1 命令行开发工具 这些工具完成将源代码编译,链接成可执行代码的功能。 ADS 提供下面的命令行开发工具: armcc armcc 是 ARM C 编译器。这个编译器通过了 Plum Hall C Validation Suite 为 ANSI C 的 一致性测试。armcc 用于将用 ANSI C 编写的程序编译成 32 位 ARM 指令代码。 因为 armcc 是我们最常用的编译器,所以对此作一个详细的介绍。 在命令控制台环境下,输入命令: armcc –help 可以查看 armcc 的语法格式以及最常用的一些操作选项 armcc 最基本的用法为: armcc [options] file1 file2 ... filen 这里的 option 是编译器所需要的选项,fiel1,file2…filen 是相关的文件名。 这里简单介绍一些最常用的操作选项。 -c:表示只进行编译不链接文件; -C:(注意:这是大写的 C)禁止预编译器将注释行移走; -D:定义预处理宏,相当于在源程序开头使用了宏定义语句#define symbol , 这里 symbol 默认为 1; -E:仅仅是对 C 源代码进行预处理就停止;
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 -g:指定是否在生成的目标文件中包含调试信息表; -I : 将 directory 所 指 的 路 径 添 加 到 #include 的 搜 索 路 径 列 表 中 去 ; -J:用 directory 所指的路径代替默认的对#include 的搜索路径; -o:指定编译器最终生成的输出文件名。 -O0:不优化; -O1:这是控制代码优化的编译选项,大写字母 O 后面跟的数字不同,表示的优化级别 就不同,-O1 关闭了影响调试结果的优化功能; -O2:该优化级别提供了最大的优化功能; -S:对源程序进行预处理和编译,自动生成汇编文件而不是目标文件; -U:取消预处理宏名,相当于在源文件开头,使用语句#undef symbol; -W:关闭所有的或被选择的警告信息; 有关更详细的选项说明,读者可查看 ADS 软件的在线帮助文件。 armcpp armcpp 是 ARM C++编译器。它将 ISO C++ 或 EC++ 编译成 32 位 ARM 指令代码。 tcc tcc 是 Thumb C 编译器。该编译器通过了 Plum Hall C Validation Suite 为 ANSI 一致性 的测试。tcc 将 ANSI C 源代码编译成 16 位的 Thumb 指令代码。 tcpp tcpp 是 Thumb C++ 编译器。 它将 ISO C++ 和 EC++ 源码编译成 16 位 Thumb 指令代 码。 armasm armasm 是 ARM 和 Thumb 的汇编器. 它对用 ARM 汇编语言和 Thumb 汇编语言写的源 代码进行汇编。 armlink armlink 是 ARM 连接器。该命令既可以将编译得到的一个或多个目标文件和相关的一 个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目 标文件,以供进一步的链接。ARM 链接器生成的是 ELF 格式的可执行映像文件。 armsd armsd 是 ARM 和 Thumb 的符号调试器。它能够进行源码级的程序调试。用户可以在 用 C 或汇编语言写的代码中进行单步调试,设置断点,查看变量值和内存单元的内容。 8.1.1.1 armcc 用法详解 下面为读者介绍上述的 4 种 ARM C 和 C++编译器的命令通用语法。 compiler [preprocessor-options] [output-format] [target-options] [debug-options] [code-generation-options] [warning-options] [additional-checks] [error-options] [source] [PCS-options] [source-language] [search-paths] 用户可以通过命令行操作选项控制编译器的执行。所有的选项都是以符号”-”开始,有 些选项后面还跟有参数。在大多数情况下,ARM C 和 C++编译器允许在选项和参数之间存 在空格。 命令行中各个选项出现顺序可以任意。 这里的 compiler 是指 armcc,tcc, armcpp 和 tcpp 中的一个; PCS-options:指定了要使用的过程调用标准; source-language:指定了编译器可以接受的编写源程序的语言种类。对于 C 编译器默认 的语言是 ANSI C,对于 C++编译器默认是 ISO 标准 C++; search-paths:该选项指定了对包含的文件(包括源文件和头文件)的搜索路径;
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 preprocessor-options:该选项指定了预处理器的行为,其中包括预处理器的输出和宏定 义等特性; output-format:该选项指定了编译器的输出格式,可以使用该项生成汇编语言输出列表 文件和目标文件; target-options:该选项指定目标处理器或 ARM 体系结构; debug-options:该选项指定调试信息表是否生成,和该调试信息表生成时的格式; code-generation-options:该选项指定了例如优化,字节顺序和由编译器产生的数据对齐 格式等选项; warning-options:该选项决定警告信息是否产生; additional-checks:该选项指定了几个能用于源码的附加检查,例如检查数据流异常, 检查没有使用的声明等; error-options:该选项可以关闭指定的可恢复的错误,或者将一些指定的错误降级为警 告; source:该选项提供了包含有 C 或 C++源代码的一个或多个文件名,默认的,编译器在 当前路径寻找源文件和创建输出文件。如果源文件是用汇编语言编写的(也就是说该文件的 文件名是以.s 作为扩展名),汇编器将被调用来处理这些源文件。 如果操作系统对命令行的长度有限制,可以使用下面的操作,从文件中读取另外的命令 行选项: -via filename 该命令打开文件名为 filename 的文件,并从中读取命令行选项。用户可以对-via 进行嵌 套调用,亦即,在文件 filename 中又通过-via finlename2 包含了另外一个文件。 在下面的例子中,从 input.txt 文件中读取指定的选项,作为 armcpp 的操作选项: armcpp -via input.txt source.c 以上是对编译器选项的一个简单概述。它们(包括后面还要介绍的其他一些命令工具)既 可以在命令控制台环境下使用,同时由于它们被嵌入到了 ADS 的图形界面中,所以也可以 在图形界面下使用。 8.1.1.2 armlink 用法详解 在介绍 armlink 的使用方法之前,先介绍要涉及到的一些术语。 映像文件(image):是指一个可执行文件,在执行的时候被加载到处理器中。一个映像 文件有多个线程。它是 ELF(Executable and linking format)格式的。 段(Section):描述映像文件的代码或数据块。 RO:是 Read-only 的简写形式。 RW:是 Read-write.的简写形式。 ZI:是 Zero-initialized 的简写形式。 输入段(input section):它包含着代码,初始化数据或描述了在应用程序运行之前必须要 初始化为 0 的一段内存。 输出段(output section):它包含了一系列具有相同的 RO,RW 或 ZI 属性的输入段。 域(Regions):在一个映像文件中,一个域包含了 1 至 3 个输出段。多个域组织在一起, 就构成了最终的映像文件。 Read Only Position Independent(ROPI):它是指一个段,在这个段中代码和只读数据的地 址在运行时候可以改变。 Read Write Position Independent(RWPI):它是指一个段,在该段中的可读/写的数据地址 在运行期间可以改变。 加载时地址:是指映像文件位于存储器(在该映像文件没有运行时)中的地址。
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 运行时地址:是指映像文件在运行时的地址。 下面介绍一下 armlink 命令的语法 完整的连接器命令语法如下: armlink [-help] [-vsn] [-partial] [-output file] [-elf] [-reloc][-ro-base address] [-ropi] [-rw-base address] [-rwpi] [-split] [-scatter file][-debug|-nodebug][-remove?RO/RW/ZI/DBG]|-noremove] [-entry location ] [-keep section-id] [-first section-id] [-last section-id] [-libpath pathlist] [-scanlib|-noscanlib] [-locals|-nolocals] [-callgraph] [-info topics] [-map] [-symbols] [-symdefs file] [-edit file] [-xref] [-xreffrom object(section)] [-xrefto object(section)] [-errors file] [-list file] [-verbose] [-unmangled |-mangled] [-match crossmangled][-via file] [-strict] [-unresolved symbol][-MI|-LI|-BI] [input-file-list] 上面各选项的含义分别为: -help 这个选项会列出在命令行中常用的一些选项操作。 -vsn 这个选项显示出所用的 armlink 的版本信息。 -partial 用这个选项创建的是部分链接的目标文件而不是可执行映像文件。 -output file 这个选项指定了输出文件名,该文件可能是部分链接的目标文件,也可能是可执行映像 文件。如果输出文件名没有特别指定的话,armlink 将使用下面的默认: 如果输出是一个可执行映像文件,则生成的输出文件名为__image.axf; 如果输出是一个部分链接的目标文件,在生成的文件名为__object.o; 如果没有指定输出文件的路径信息,则输出文件就在当前目录下生成。如果指定了路径 信息,则所指定的路径成为输出文件的当前路径。 -elf 这个选项生成 ELF 格式的映像文件,这也是 armlink 所支持的唯一的一种输出格式,这 是默认选项。 -reloc 这个选项生成可重定址的映像。 一个可重定址的映像具有动态的段,这个段中包含可重定址信息,利用这些信息可以在 链接后,进行映像文件的重新定址; -reloc,-rw-base 一起使用,但是如果没有-split 选项,链接时会产生错误。 -ro-base address 这个选项将包含有 RO(Read-Only 属性)输出段的加载地址和运行地址设置为 address, 该地址必须是字对齐的,如果没有指定这个选项,则默认的 RO 基地址值为 0x8000。 -ropi 这个选项使得包含有 RO 输出段的加载域和运行域是位置无关的。如果该选项没有使 用,则相应的域被标记为绝对的。通常每一个只读属性的输入段必须是只读位置无关的。如 果使用了这个选项,armlink 将会进行以下操作: 检查各段之间的重定址是否有效; 确保任何由 armlink 自身生成的代码是只读位置无关的。 这里希望读者注意的是,ARM 工具直到 armlink 完成了对输入段的处理后,才能够决 定最终的生成映像是否为只读位置无关的。这就意味着 ,即使为编译器和汇编器指定了
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 ROPI 选项,armlink 也可能会产生 ROPI 错误信息。 -rw-base address 这个选项设置包含 RW(Read/Write 属性)输出段的域的运行时地址,该地址必须是字对 齐的。 如果这个选项和-split 选项一起使用,将设置包含 RW 输出段的域的加载和运行时地址 都设置在 address 处。 -rwpi 这个选项使得包含有 RW 和 ZI(Zero Initialization,初始化为 0)属性的输出段的加载和运 行时域为位置无关的。如果该选项没有使用,相应域标记为绝对的。这个选项要求-rw-base 选项后有值,如果-rw-base 没有指定的话,默认其值为 0,即相当于-rw-base 0。通常每一个 可写的输入段必须是可读/ 可写的位置无关的。 如果使用了该选项,armlink 会进行以下的操作: 检查可读/可写属性的运行域的输入段是否设置了位置无关属性; 检查在各段之间的重定址是否有效; 生成基于静态寄存器 sb 的条目,这些在 RO 和 RW 域被拷贝和初始化的时候会用到。 编译器并不会强制可写的数据一定要为位置无关的,这就是说,即使在为编译器和汇编 器指定了 RWPI 选项,armlink 也可能生成数据不是 RWPI 的信息。 -split 这个选项将包含 RO 和 RW 属性的输出段的加载域,分割成 2 个加载域。一个是包含 RO 输出段的加载域,默认的加载地址为 0x8000,但是可以用-ro-base 选项设置其他的地址 值,另一个加载域包含 RO 属性的输出段,由-rw-base 选项指定加载地址,如果没有使用 -rw-base 选项的话,默认使用的是-rw-base 0。 -scatter file 这个选项使用在 file 中包含的分组和定位信息来创建映像内存映射。 注 意 , 如 果 使 用 了 该 选 项 的 话 , 必 须 要 重 新 实 现 堆 栈 初 始 化 函 数 __user_initial_stackheap()。 -debug 这个选项使输出文件包含调试信息,调试信息包括,调试输入段,符号和字符串表。这 是默认的选项。 -nodebug 这个选项使得在输出文件中不包含调试信息。生成的映像文件短小,但是不能进行源码 级的调试。armlink 对在输入的目标文件和库函数中发现的任何调试输入段都不予处理,当 加载映像文件到调试器中的时候,也不包含符号和字符串信息表。这个选项仅仅是对装载到 调试器的映像文件的大小有影响,但是对要下载到目标板上的二进制代码的大小没有任何影 响。 如果用 armlink 进行部分链接生成目标文件而不是映像文件,则虽然在生成的目标文件 中不含有调试输入段,但是会包含符号和字符串信息表。 这里特别请读者注意的是: 如果要在链接完成后使用 fromELF 工具的话,不可使用-nodebug 选项,这是因为如果 生成的映像文件中不包含调试信息的话,则有下面的影响: fromELF 不能将映像文件转换成其他格式的文件; fromELF 不能生成有意义的反汇编列表。 -remove (RO/RW/ZI/DBG) 使用这个选项会将在输入段未使用的段从映像文件中删除。如果输入段中含有映像文件
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 入口点或者该输入段被一个使用的段所引用,则这样的输入段会当作已使用的段。 在使用这个选项时候要注意,不要删除异常处理函数。使用-keep 选项来标识异常处理 函数,或用 ENTRY 伪指令标明是入口点。 为了更精确的控制删除未使用的段,可以使用段属性限制符。可以使用以下的段属性限 制符: RO 删除所有未使用的 RO 属性的段; RW 删除所有未使用的 RW 属性的段; ZI 删除所有未使用的 ZI 属性的段; DBG 删除所有未使用的 DEBUG 属性的段。 这些限制符出现的顺序是任意的,但是它们必须要有”( )”括住,多个限制符之间要用符 号”/”进行间隔。ADS 软件中默认选项是-remove (RO/RW/ZI/DBG)。 如果没有指定段属性限制符,则所有未使用的段都会被删除。因为-remove 就等价于 -remove(RO/RW/ZI/DBG)选项。 -noremove 这个选项保留映像文件中所有未被使用的段。 -entry location 这个选项指定映像文件中唯一的初始化入口点。一个映像文件可以包含多个入口点,使 用这个命令定义的初始化入口点是存放在可执行文件的头部,以供加载程序加载时使用。当 一个映像文件被装载时,ARM 调试器使用这个入口点地址来初始化 PC 指针。初始化入口 点必须满足下面的条件: 映像文件的入口点必须位于运行域内; 运行域必须是非覆盖的,并且必须是固定域(就是说,加载域和运行域的地址相同)。 在这里可以用以下的参数代替 location 参数: 1. 入口点地址:这是一个数值,例如-entry 0x0; 2. 符号:该选项指定映像文件的入口点为该符号所代表的地址处,比如: -entry int_handler 表示程序入口点在符号 int_handler 所在处。 如果该符号有多处定义存在,armlink 将产生出错信息。 offset+object(section):该选项指定在某个目标文件的段的内部的某个偏移量处为映像文 件的入口地址,例如: -entry 8+startup(startupseg) 如果偏移量值为 0,可以简写成 object(section),如果输入段只有一个,则可以简化为 object。 -keep section-id 使用该选项,可以指定保留一个输入段,这样的话,即使该输入段没有在映像文件中使 用,也不会被删除。参数 section-id 取下面一些格式: 1. symbol 该选项指定定义 symbol 的输入段不会在删除未使用的段时被删除。如果映像文件中有 多处 symbol 定义存在,则所有包含 symbol 定义的输入段都不会被删除。例如: -keep int_handler
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 则所有定义 int_handler 的符号的段都会保留,而不被删除。 为了保留所有含有以_handler 结尾的符号的段,可以使用如下的选项: -keep *_handler 2. object(section) 这个选项指定了在删除未使用段时,保留目标文件中的 section 段。输入段和目标名是 不区分大小写的,例如,为了在目标文件 vectors.o 中保留 vect 段,使用: -keep vectors.o(vect) 为了保留 vectors.o 中的所有以 vec 开头的段名,可以使用选项: -keep vectors.o(vec*) 3. object 这个选项指定在删除未使用段时,保留该目标文件唯一的输入段。目标名是不区分大小 写的,如果使用这个选项的时候,目标文件中所含的输入段不止一个的话,armlink 会 给出出错信息。比如,为了保留每一个以 dsp 开头的只含有唯一输入段的目标文件,可 以使用如下的选项: -keep dsp*.o -first section-id 这个选项将被选择的输入段放在运行域的开始。通过该选项,将包含复位和中断向量地 址的段放置在映像文件的开始,可以用下面的参数代替 section-id: 1.symbol 选择定义 symbol 的段。禁止指定在多处定义的 symbol,因为多个段不能同时放在映像 文件的开始。 2.object(section) 从目标文件中选择段放在映像文件的开始位置。在目标文件和括号之间不允许存在空 格,例如 -first init.o(init) 3.object 选择只有一个输入段的目标文件。如果这个目标文件包含多个输入段,armlink 会产生 错误信息。用这个选项的例子如下: -first init.o 这里希望读者注意的是: 使用-first 不能改变在域中按照 RO 段放在开始,接着放置 RW 段,最后放置 ZI 段的基 本属性排放顺序。如果一个域含有 RO 段,则 RW 或 ZI 段就不能放在映像文件的开头。类 似地,如果一个域有 RO 或 RW 段,则 ZI 段就不能放在文件开头。 两个不同的段不能放在同一个运行时域的开头,所以使用该选项的时候只允许将一个段 放在映像文件的开头。 -last section-id 这个选项将所选择的输入段放在运行域的最后。例如,用这个选项能够强制性的将包含 校验和的输入段放置在 RW 段的最后。使用下面的参数可以替换 section-id。 1. symbol 选择定义 symbol 的段放置在运行域的最后。不能指定一个有多处定义的 symbol。使用 该参数的例子如下: -last checksum 2. object(section) 从目标文件中选择 section 段。在目标文件和后面的括号间不能有空格,用该参数的例
ARM 应用系统开发详解──基于 S3C4510B 的系统设计 子为: -last checksum.o(check) 3. object 选择只有一个输入段的目标,如果该目标文件中有多个输入段,armlink 会给出出错信 息。 和-first 选项一样,需要读者注意的是; 使用-last 选项不能改变在域中将 RO 段放在开始,接着放置 RW 段,最后放置 ZI 段的 输出段基本的排放顺序。如果一个域含有 ZI 段,则 RW 段不能放在最后,如果一个域含有 RW 或 ZI 段,则 RO 段不能放在最后。 在同一个运行域中,两个不同的段不能同时放在域的最后位置。 -libpath pathlist 这个选项为 ARM 标准的 C 和 C++库指定了搜索路径列表。 注意,这个选项不会影响对用户库的搜索路径。 这个选项覆盖了环境变量 ARMLIB 所指定的路径。参数 pathlist 是一个以逗号分开的多 个路径列表,即为 path1, path2,... pathn,这个路径列表只是用来搜索要用到的 ARM 库函数。 默认的,对于包含 ARM 库函数的默认路径是由环境变量 ARMLIB 所指定的。 -scanlib 这个选项启动对默认库(标准 ARM C 和 C++库)的扫描以解析引用的符号。这个选项是 默认的设置。 -noscanlib 该选项禁止在链接时候扫描默认的库。 -locals 这个选项指导链接器在生成一个可执行映像文件的时候,将本地符号添加到输出符号信 息表中。该选项是默认设置。 -nolocals 这个选项指导链接器在生成一个可执行映像文件的时候,不要将本地符号添加到输出符 号信息表中。如果想减小输出符号表的大小,可以使用该选项。 -callgraph 该选项创建一个 HTML 格式的静态函数调用图。这个调用图给出了映像文件中所有函 数的定义和引用信息。对于每一个函数它列出了: 1. 函数编译时候的处理器状态(ARM 状态还是 Thumb 状态); 2. 调用 func 函数的集合; 3. 被 func 调用的函数的集合; 4. 在映像文件中使用的 func 寻址的次数。 此外,调用图还标识了下面的函数: 1. 被 interworking veneers 所调用的函数; 2. 在映像文件外部定义的函数; 3. 允许未被定义的函数(以 weak 方式的引用); 静态调用图还提供了堆栈使用信息,它显示出了: 1. 每个函数所使用的堆栈大小; 2. 在全部的函数调用中,所用到的最大堆栈大小。 -info topics 这个选项打印出关于指定种类的信息,这里的参数 topics 是指用逗号间隔的类型标识符 列表。类型标识符列表可以是下面所列出的任意一个:
分享到:
收藏