1 ADS调试用
ADS是编译器,AXD是调试器。编译成AXF以后再在ARM的RAM里调试。
2 FLASHPGM
FLASH烧写的软件。 AXF在RAM里调试,掉电就没有了,方便程序修改。调试好的程序再下 到FLASH里,上电直接运行。
同类的软件还有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好。
3 BANYANT调试代理
调试代理就是用它帮你使用更简单的JTAG (便宜啊)来实现原本1K才卖的 JTAG仿真器的大部分功能。
调试代理还有很多种,什么H-JTAG了、ARM7都是,BANYANT比较好。
需要注意的是,每种调试代理安装方法虽然都简单但都不一样,需要看说明。而且AXD调试之前都要运行。
4 ARM-ELF-TOOLS工具链
里面是UCLINUX开发用的工具比如ARM-ELF-GCC只类的。工具链就是把很多工具打 包在一起发布的方便你开发的东西。
另外如果你开发LINUX就要用ARM-LINUX-TOOLS,不一样,不通用。
5 U-BOOT
大名鼎鼎的BOOTLOADER生成工具,同类的好象还有VIVI(名字很暧昧~~)
生成的BOOTLOADER烧到FLASH里,然后就可以用BOOTLOADER下载 烧写其他了
有了BOOTLOADER才能下UCLINUX 。BOOTLOADER就像电脑 上的BIOS。当然UCOS的不用这个,用什么我不知道:)
6 UCLINUX包
UCLINUX的源码包
7 VMWARE
老牌的虚拟机软件,在一个机器上虚拟出一个机器装LINUX(PC上用的),省得你来回开关机 了。
8 source insight 代码编辑工具 linux下使用kscope
ADS 全称为ARM Developer Suite ,是ARM公司推出的新一代ARM集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。在ADS工具诞生 之前,一直使用的是ARM SDT工具,目前ARM SDT工具已经慢慢被淘汰。ADS除了可以安装在Windows NT4、Windows 2000、Windows 98和Windows 95操作系统下,还支持Windows XP和Windows Me操作系统。
ADS 由命令行开发工具、GUI(Graphics User Interface,图形用户界面)开发环境(Code Warrior和AXD)、实用程序和支持软件组成。有了这些部件,用户就可以为ARM系列的RISC处理器编写和调试自己的开发应用程序了。下面将分别 介绍这4个组成部分。
1.命令行开发工具
命 令行开发工具在实际应用中相对比较广泛,用它最大的好处就是可以将许多编译命令写在一个脚本文件中,然后只执行该脚本文件就可以让工具自动完成所有编译的 工作。命令行中常用
图1.3 S3C2410芯片结构
的命令如下。
(1)armcc
armcc 是ARM C编译器,这个编译器通过了Plum Hall C Validation Suite为ANSI C的一致性测试。armcc用于将用ANSI C编写的程序编译成32位ARM指令代码。
在 命令控制台环境下,输入以下命令:
> armcc –help
将 可以查看armcc的语法格式以及最常用的一些操作选项。
armcc 最基本的用法为:
> armcc [options] file1 file2 ... filen
这 里的options是编译器所需要的选项,fiel1,file2…filen 是相关的文件名。
以 下简单介绍一些最常用的操作选项。
● -c 表示只进行编译不连接文件;
● -C (注意:这是大写的C)禁止预编译器将注释行移走;
● -D<symbol> 定义预处理宏,相当于在源程序开头使用了宏定义语句;
● -E 仅仅是对C源代码进行预处理后就停止;
● -g<options> 指定是否在生成的目标文件中包含调试信息表;
● -I<directory> 将directory所指的路径添加到#include的搜索路径列表中去;
● -J<directory> 用directory所指的路径代替默认的对#include的搜索路径;
● -o<file> 指定编译器最终生成的输出文件名。
● -O0 不优化;
● -O1 这是控制代码优化的编译选项,大写字母O后面跟的数字不同,表示的优化级别就不同,-O1关闭了影响调试结果的优化功能;
● -O2 该优化级别提供了最大的优化功能;
● -S 对源程序进行预处理和编译,自动生成汇编文件而不是目标文件;
● -U<symbol> 取消预处理宏名,相当于在源文件开头,使用语句#undef symbol;
● -W<options> 关闭所有的或被选择的警告信息。
有 关更详细的选项说明,读者可查看ADS软件的在线帮助文件。
(2)armcpp
armcpp 是ARM C++编译器,它将ISO C++ 或EC++ 编译成32位ARM指令代码。该编译器的命令选项和armcc的选项基本一样,这里就不再重复。
(3)tcc
tcc 是Thumb C编译器,该编译器通过了Plum Hall C Validation Suite为ANSI一致性的测试。tcc将ANSI C源代码编译成16位的Thumb指令代码,同时它的编译选项和用法类似armcc,具体使用请参考ADS软件的在线帮助文件。
(4)tcpp
tcpp 是Thumb C++ 编译器,它将ISO C++ 和EC++源码编译成16位Thumb指令代码,同时它的编译选项和用法类似armcc,具体使用请参考ADS软件的在线帮助文件。
(5)armasm
armasm 是ARM和Thumb的汇编器,它对用ARM汇编语言和Thumb汇编语言写的源代码进行汇编。在命令行输入:armasm –help将会看到armasm汇编器的用法以及它的编译选项。
> armasm [options] sourcefile objectfile
> armasm [options] -o objectfile sourcefile
以上是关于armasm的两种基本用法,其中 options为它的选项,常用的选项如下所示。
● -LIST 写一个列表文件在指定的文件;
● -Depend 保存编译后的依赖源文件;
● -Errors 将标准出错的诊断信息放到指定的文件中;
● -I 添加目录到源文件的搜索路径;
● -PreDefine 预执行一个 SET{L,A,S}指令;
● -NOCache 缓冲关闭(默认是开);
● -MaxCache 定义最大缓冲的大小(默认是8MB);
● -NOWarn 关闭打印告警信息;
● -G 输出调试表;
● -APCS 使预定义匹配已选择proc-call标准;
● -Help 打印帮助信息;
● -LIttleend Little-endian ARM;
● -BIgend Big-endian ARM;
● -MEMACCESS 说明目标内存系统的属性;
● -M 写源文件依赖性列表到标准输出;
● -MD 写源文件依赖性列表到标准输入;
● -CPU 设置目标ARM内核类型;
● -FPU 设置目标FP 体系版本,SOFTVFP,SOFTFPA,VFP,FPA,NONE之一;
● -16 汇编16位Thumb指令;
● -32 汇编32位ARM指令。
(6)armlink
armlink 是ARM连接器,该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行连接,生成一个可执行文件,也可以将多个目标文件部分连接成一 个目标文件,以供进一步的连接。ARM连接器生成的是ELF格式的可执行映像文件。armlink的一般用法如下:
> armlink option-list input-file-list
其 中,option-list是一个区分大小写的选项表;input-file-list是一系列库和对象文件。关于armlink的具体使用请参考ADS 软件的在线帮助文件。
(7)armsd
armsd 是ARM 和Thumb的符号调试器,它能够进行源码级的程序调试。用户可以在用C或汇编语言写的代码中进行单步调试,设置断点,查看变量值和内存单元的内容。 armsd的一般用法如下:
> armsd [options] [<imagefile> [<arguments>]]
其 中,options是一系列调试选项;imagefile定义一个AIF或ELF文件的名字;arguments是被imagefile接受的命令行参 数。关于armsd的具体使用请参考ADS软件的在线帮助文件。
讲 到这里我们可以举一个简单的应用实例来看看常用的ARM命令行是如何使用的。以附件光盘中的SWI(Sotfware Interrupter)参考项目为例,它的编译命令如下:
armasm -g a_swi.s
armcc -c -g -O1 main.c
armcc -c -g -O1 c_swi.c
armlink a_swi.o main.o c_swi.o -o swi.axf
其 中,armasm命令用来编译ARM汇编代码,armcc用来编译C代码,armlink用来最终连接目标文件为ELF格式的可执行映像文件。
2.GUI开发环境
ADS GUI开发环境包含Code Warrior和AXD两种,其中Code Warrior是集成开发工具,而AXD是调试工具。下面将分别介绍这两个工具。
CodeWarrior for ARM是一套完整的集成开发工具,充分发挥了ARM RISC 的优势, 使产品开发人员能够很好的应用尖端的片上系统技术。该工具是专为基于ARM RISC的处理器而设计的,它可加速并简化嵌入式开发过程中的每一个环节,使得开发人员只需通过一个集成软件开发环境就能研制出ARM产品,在整个开发周 期中,开发人员无需离开CodeWarrior开发环境,因此节省了在操作工具上花的时间,使得开发人员有更多的精力投入到代码编写上 来,CodeWarrior集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面。用户可以使用ADS的CodeWarrior IDE为ARM和Thumb处理器开发用C、C++或ARM汇编语言编写的程序代码。CodeWarrior IDE缩短了用户开发项目代码的周期,主要是由于:一是全面的项目管理功能;二是子函数的代码导航功能,使得用户能迅速找到程序中的子函数。关于 CodeWarrior的具体使用将在1.3.2中详细介绍。
AXD(ARM eXtended Debugger),即ARM扩展调试器。调试器本身是一个软件,用户通过这个软件使用调试代理可以对包含有调试信息的,正在运行的可执行代码进行比如变 量的查看,断点的控制等调试操作。调试代理既不是被调试的程序,也不是调试器。在ARM体系中,它有这样几种方式:Multi-ICE(Multi- processor in-circuit emulator)、ARMulator和Angel。其中Multi-ICE是一个独立的产品,是ARM公司自己的JTAG在线仿真器,不是由ADS提 供的。AXD可以在Windows和UNIX下进行程序的调试,它为用C、C++和汇编语言编写的源代码提供了一个全面的Windows和UNIX环境。 1.3.3中会具体介绍AXD工具的使用方法。
3.实用程序
ADS 除了提供上述工具外,它还提供以下的实用工具来配合前面介绍的命令行开发工具的 使用。
(1)Flash downloader是用于把二进制映像文件下载到ARM开发板上的Flash存储器的工具。
(2)fromELF 是ARM映像文件转换工具。该命令将ELF格式的文件作为输入文件,将该格式转换为各种输出格式的文件,包括plain binary(BIN格式映像文件)、Motorola 32-bit S-record format(Motorola 32位S格式映像文件)、Intel Hex 32 format(Intel 32位格式映像文件)和Verilog-like hex format(Verilog 十六进制文件)。fromELF命令也能够为输入映像文件产生文本信息,例如代码和数据长度。
(3)armar,ARM 库函数生成器将一系列ELF格式的目标文件以库函数的形式集合在一起,用户可以把一个库传递给一个连接器以代替几个ELF文件。
4.支持的软件
ADS 为用户提供ARMulator软件,使用户可以在软件仿真的环境下或者在基于ARM的硬件环境调试用户应用程序。ARMulator是一个ARM指令集仿 真器,集成在ARM的调试器AXD中,它提供对ARM处理器的指令集的仿真,为ARM和Thumb提供精确的模拟。用户可以在硬件尚未做好的情况下,开发 程序代码。
ADS 软件主要由上述4个部分组成,下面将介绍在实际工作中经常用到的Code Warrior和AXD工具的基本使用。
Code Warrior IDE提供一个简单通用的图形化用户界面用于管理软件开发项目。可以以ARM和Thumb处理器为对象,利用Code Warrior IDE开发C、C++和ARM汇编代码。下面将通过一个实例来讲述Code Warrior IDE的具体使用,为了使读者容易理解,这里以附件光盘中提供的SWI项目为例,讲述Code Warrior IDE工具的使用。
1.创建项目工程
建 立项目工程是嵌入式实际开发中必不可少的一部分,因为工程将所有的源码文件组织在一起,并能够决定最终生成文件存放的路径、输出的格式等。在 CodeWarrior中新建一个工程的方法有两种,可以在工具栏中单击New按钮,也可以在File菜单中选择New菜单,这样就会打开一个如图1.4 所示的对话框。
图1.4 新建工程对话框
在 Project可选框中为用户提供了7种可选择的工程类型,如下所示。
● ARM Executable Image 用于由ARM指令的代码生成一个ELF格式的可执行映像文件;
● ARM Object Library 用于由ARM指令的代码生成一个armar格式的目标文件库;
● Empty Project 用于创建一个不包含任何库或源文件的工程;
● Makefile Importer Wizard 用于将Visual C的nmake或GNU make文件转入到Code- Warrior IDE 工程文件;
● Thumb ARM Interworking Image 用于由ARM指令和Thumb指令的混和代码生成一个可执行的ELF格式的映像文件;
● Thumb Executable image 用于由Thumb指令创建一个可执行的ELF格式的映像文件;
● Thumb Object Library 用于由Thumb指令的代码生成一个armar格式的目标文件库。
在 这里选择ARM Executable Image,然后在Project name里输入名为swi的工程文件名。接着在Location项中单击Set按钮选择项目工程存放的位置,这里存放的位置为C:/TestCode。最 后单击“确定”按钮,即可建立一个新的名为swi的工程。
这 个时候会出现swi.mcp的窗口,如图1.5所示,有3个标签页,分别为Files、Link Order、Targets,默认的是显示第一个选项卡Files。通过在该选项卡中右击,选中Add Files就可以把要用到的源程序添加到工程中。
图1.5 添加源文件到工程中
为 工程添加源码常用的方法有两种,既可以使用如图1.5所示方法,也可以在Project菜单项中,选择Add Files,这两种方法都会打开文件浏览框,用户可以把已经存在的文件添加到工程中来。当选中要添加的文件时,会弹出一个对话框,如图1.6所示,询问用 户把文件添加到何类目标中,在这里,我们选择DebugRel目标。这里我们添加了swi.h,a_swi.s c_swi.s和main.c文件。
在 建立好一个工程时,默认的Targets是DebugRel,还有另外两个可用的Targets,分别为Realse和Debug,这3个target的 含义如下。
● DebugRel 使用该目标,在生成目标的时候,会为每一个源文件生成调试信息;
● Debug 使用该目标为每一个源文件生成最完整的调试信息;
● Release 使用该目标不会生成任何调试信息。
到 目前为止,一个完整的名为swi的项目工程已经建立,下面对工程进行编译和连接工作。
2.编译和连接项目工程
在 编译swi项目之前,先进行设置,单击Edit菜单,选择DebugRel Settings,或者按Alt + F7键,显示如图1.7所示对话框。
图1.6 选择生成目标类型 图1.7 DebugRel设置对话框
图 1.7的最左边部分是目标设置面板,它包括如下几个大的设置对象。
(1)Target 设置选项
● Target Settings 包括Target Name、Linker、Pre-linker和Post-linker等设置;
● Access Paths 主要是用于项目的路径设置;
● Build Extras 主要用于Build附加的选项设置;
● Runtime Settings 包括一般设置、环境设置等;
● File Mappings 包含映射信息、文件类型、编辑语言等;
● Source Trees 包含源代码树结构信息以及路径选择等;
● ARM Target 定义输出image文件名和类型等;
(2)Language Settings设置选项
● ARM Assembler 对ARM汇编语言的支持选项设置;
● ARM C Compiler 对C语言的支持选项设置;
● ARM C++ Compiler 对C++语言的支持选项设置;
● Thumb C Compiler 对Thumb C语言的支持选项设置;
● Thumb C++ Compiler 对Thumb C++语言的支持选项设置。
(3)Linker 设置选项
● ARM Linker 对输出的连接类型、RO、RW Base地址设置等选项;
● ARM fromELF 定义输出文件格式以及路径等。
(4)Editor 设置选项
● Custom Keywords 对客户化关键字高亮颜色的设置。
(5)Debugger 设置选项
● Other Executables 当调试该目标板时制定其他的可执行文件来调试;
● Debugger Settings 对调试器的一些基本设置;
● ARM Debugger 选择调试时调试器(AXD、Armsd和其他等)的选择;
● ARM Runner 选择运行时调试器(AXD、Armsd和其他等)的选择。
(6)Miscellaneous 设置选项
● ARM Features 设置一些受限制的特性
接 下来单击CodeWarrior IDE的菜单Project下的make菜单,就可以对swi工程进行编译和连接了。整个编译连接之后生成的结果如图1.8所示。
图1.8 编译和连接之后的结果
在 工程swi所在的目录下,会生成一个名为工程名_data的目录,即swi_data的目录,在这个目录下不同类别的目标对应不同的目录。在本例中由于我 们使用的是DebugRe目标,所以生成的最终文件都应该在该目录下。进入到DebugRel目录中去,读者会看到make后生成的映像文件和二进制文 件,映像文件用于调试,二进制文件可以烧写到目标板的Flash中运行。关于Code Warrior IDE的具体使用请参考ADS软件的在线帮助文件。
AXD 是ADS软件中独立于CodeWarrior IDE的图形软件,打开AXD软件,默认打开的目标是ARMulator。ARMulator也是调试的时候最常用的一种调试工具,本节主要是结合 ARMulator介绍在AXD中进行代码调试的方法和过程,使读者对AXD的调试有初步的了解。要使用AXD必须首先要生成包含有调试信息的程序,在 1.3.2中,已经生成的swi.axf文件就是含有调试信息的可执行ELF格式的映像文件。这一节还是以swi工程为例讲述AXD调试工具的基本用法。
1.打开调试文件
在 菜单File中选择Load image选项,打开Load Image对话框,找到要装载的.axf映像文件,单击“打开”按钮,就把映像文件装载到目标内存中了。在所打开的映像文件中会有一个蓝色的箭头指示当前 执行的位置,如图1.9所示。
图1.9 打开swi调试文件
此 外,在菜单File中还有一个Load Debug Symbols选项,该选项是用来调试那些调试器不能访问调试符号的情况,比如调试装载在ROM中的image。通常Load image选项用来调试装载在RAM中的代码。
在 菜单Execute中选择Go将运行代码。要想进行单步的代码调试,在Execute菜单中选择Step选项,或按F10键即可以单步执行代码,窗口中蓝 色箭头会发生相应的移动。
2.设置断点
有 时候,用户可能希望程序在执行到某处时查看一些所关心的变量值,此时可以通过设置断点达到此要求。将光标移动到要进行断点设置的代码处,在Execute 菜单中,选择Toggle Breakpoint或按F9键,就会在光标所在行的起始位置出现一个红色实心圆点,表明该处已设为断点。假设本例中给62行代码设置断点,首先将光标移 至62行,然后按F9键或单击Toggle Breakpoint按钮,结果如图1.10所示。
图1.10 设置断点
3.查看寄存器内容
查 看寄存器的值在实际嵌入式开发调试中经常使用,使用方法为从Processor Views菜单中选择Memory选项,如图1.11所示。在Memory Start address选择框中,用户可以根据要查看的存储器的地址输入起始地址,在下面的表格中会列出连续的64个地址。从图1.11中可以看出地址为0x0的 存储器中的初始值为0x E7FF0010,注意因为用的是little-endian[ 注2] ,所以读数 据的时候注意高地址中存放的是高字节,低地址存放的是低字节。1
4.查看变量值
在 调试过程中,经常需要查看某个变量的值。在AXD工具中,查看变量值的方法是先用鼠标选中要查看的变量,然后右击,在弹出的对话框中选择Watch,将会 显示指定变量的详细信息。此处以62行的res_3为要查看的变量,先选中res_3变量,然后右击,选择Watch项,将弹出如图1.12所示的对话 框,该对话框显示了res_3变量的地址和值等详细信息。
图1.11 查看寄存器值 图1.12 查看变量对话框
此 外,AXD工具的使用方法还有很多,关于AXD IDE的具体使用请参考ADS软件的在线帮助文件,这里不再赘述。