2.4 嵌入式系统集成开发环境

用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发的整个进程。因此,一套含有编译软件、链接软件、调试软件及函数库的集成开发环境都是不可缺少的。其中,ADS是嵌入式系统集成开发环境的重要工具。

2.4.1 ADS的介绍

ADS是为嵌入式ARM设计的一整套软件开发工具,从最初的软件原型到最终优化的ROM代码。

支持的主机系统如下:

■ IBMcompatiblePCswithWindows95,98,2000,MEorNT4

■ SunworkstationswithSolaris2.6,2.7or2.8

■ HPworkstationswithHPUX10.20,11

■ RedHatLinux6.2&7.1

ADS开发环境如图2-4所示。

ADS集成开发环境的组成如下:

(1)编译器

ADS提供多种编译器,支持ARM和Thumb指令的编译。

armcc是ARMC编译器。

tcc是ThumbC编译器。

armcpp是ARMC++编译器。

tcpp是ThumbC++编译器。

armasm是ARM和Thumb的汇编器。

图2-4 ADS开发环境

(2)链接器

armlink是ARM链接器。该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。

(3)符号调试器

armsd是ARM和Thumb的符号调试器,能够进行源码级的程序调试。用户可以在用C语言或汇编语言写的代码中进行单步调试、设置断点、查看变量值和内存单元的内容。

(4)FromELF

将ELF格式的文件转换为各种格式的输出文件,包括BIN格式映像文件、Motorola32位S格式映像文件、Intel32位格式映像文件和Verilog十六进制文件。FromELF命令也能够为输入映像文件产生文本信息,如代码和数据长度。

(5)armar

armar是ARM库函数生成器,它将一系列ELF格式的目标文件以库函数的形式集合在一起。用户可以把一个库传递给一个链接器以代替几个ELF文件。

(6)CodeWarrior

CodeWarrior集成开发环境为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarrior IDE为ARM和Thumb处理器开发用C、C++或者ARM汇编语言编写的程序代码。

(7)调试器

ADS中包含有3个调试器:AXD、Armsd和ADW/ADU。

在ARM体系中,可以选择多种调试方式:Multi-ICE、ARMulator或Angel。

Multi-ICE是一个独立的产品,是ARM公司自己的JTAG在线仿真器,不是由ADS提供的。

ARMulator是一个ARM指令集仿真器,集成在ARM的调试器AXD中,提供对ARM处理器的指令集的仿真,为ARM和Thumb提供精确的模拟。用户可以在硬件尚未做好的情况下,开发程序代码,利用模拟器方式调试。

Angel是ARM在目标机Flash中的监控程序,只需通过RS-232C串口与PC主机相连,就可以对基于ARM架构处理器的目标机进行监控器方式的调试。

(8)C和C++库

ADS提供ANSIC库函数和C++库函数,支持被编译的C和C++代码。用户可以把C库中的与目标相关的函数作为自己应用程序中的一部分,重新进行代码的实现。这就为用户带来了极大的方便,针对自己的应用程序的要求,对与目标无关的库函数进行适当的裁剪。在C库中有很多函数是独立于其他函数的,并且与目标硬件没有任何依赖关系。对于这类函数,用户可以很容易地从汇编代码中使用。

有了这些部件,用户可以为ARM系列的RISC处理器编写和调试自己的开发应用程序。

2.4.2 ADS建立工程的使用介绍

ADS建立工程大体分为9个重要的步骤。

(1)建立一个新工程

1)建立工程

运行ADS1.2集成开发环境。选择“File→New…”菜单,在对话框中选择Project,如图2-5所示,新建一个工程文件。

图2-5 建立工程

选择Creat Folder选项后创建目录,这样可以将所有与该工程相关的文件放到该工程目录下,便于管理工程。在输入了工程名和选择了工程路经后,单击“确定”按钮,就生成一个新的工程项目。

2)新建一个源文件

选择“File→New…”菜单,在对话框中选择File。

在File Name文本框中输入新建的文件的名称。

在Location文本框图中输入将要建立的文件的路径,也可单击Set按钮,从弹出的标准文件对话框Open中选择将要建立的文件的路径。

进入源程序代码的编辑窗口,可在编辑窗口中输入编辑源代码,代码输入编辑完后保存文件。

若要将新建文件加入到当前工程项目中,选择AddtoProject复选框,在Project下拉列表框中选择所需加入的工程项目的名称。在Target列表框中选择新建立的文件加入的生成目标。

(2)配置生成目标

在ADS中通过Debug Setting对话框来设置一个工程项目中的各生成目标的生成选取项。在Target Setting窗口中设置的各生成选项只适应于当前的生成目标。ARM提供的可执行的映像文件的模板包括了下面3个生成目标:

■ Debug生成的目标映像文件中包含了所有的调试信息,用于开发过程中使用。

■ Release生成的目标映像文件中不包含调试信息,用于生成实际发行的软件版本。

■ Debug Rel生成的目标映像文件中包含了基本的调试信息。

对程序代码进行调试时,必须选择Debug生成目标。

在Debug Settings对话框中包括下面6个面板,如图2-6所示。

图2-6 Debug Settings对话框

用户可以选择某个面板设置相关的生成选项,所选的选项用于工程项目中当前生成目标。

1)生成目标基本选项设置(Target Settings)面板,用于设置当前生成目标的一些基本信息,如生成的目标名称、所使用的连接器等。

2)编程语言选项设置(Language Settings)面板,用于设置ADS中各语言处理工具的选项,包括汇编器的选项和编译器的选项,这些选项对于工程项目中的所有的源程序都使用,不能单独设置某一个源文件的编译选项和汇编选项。

3)连接器选项设置(Linker)面板,用于设置与连接器相关的选项及与FromELF工具相关的选项。

4)编辑器选项设置(Editor)面板,用于设置用户个性化的关键词显示方式。

5)调试器选项设置(Debugger)面板,用于设置系统中选用的调试器及相关的配置选项。

6)其他选项设置(Miscellaneous Setting)面板,用于设置杂类的选项。

(3)编程语言选项设置

编程语言选项设置(Language Settings)包括汇编器选项设置和编译器选项设置,即ARM Assembler,ARM C Compiler,ARM C++ Compiler,Thumb C Compiler,Thumb C++ Compiler的设置。下面主要介绍ARM Assembler,ARM C Compiler的设置,其他设置大致相同。

1)汇编器选项设置(ARM Assembler)

在Debug Settings对话框中的Target Settings Panels列表框中选择Language Settings下的ARM Assembler项,弹出如图2-7所示的汇编器选项对话框。该对话框中右边是ARM Assembler选项组的选项,包括6个选项卡,分别是Target,ATPCS,Options,Predefines,Listing,Control和Extras选项卡。

图2-7 汇编器选项

在每个选项卡中,Equivalent Command Line列表框中列出了当前汇编器选项设置的命令行格式。有一些汇编器选项没有提供图形界面,需要使用命令行格式来设置。

2)编译器选项卡设置(ARM C Compiler)

下面介绍CodeWarrior IDE中内嵌的编译器的选项设置。在Debug Settings对话框中的Target Settings Panels列表框中选择Language Settings下的ARM C Compiler项,弹出如图2-8所示的包含ARM C Compiler选项的编译器选项卡对话框。ARM C Compiler选项组包括8个选项卡,分别是Target and Source,ATPCS,Warnings,Errors,Debug and Optimization,Preprocessor,Code Generation和Extras选项卡。

图2-8 编译器选项卡

(4)连接器选项设置

连接器选项设置如图2-9所示。

图2-9 连接器选项

(5)FromELF工具选项设置

FromELF工具选项设置如图2-10所示。

(6)保存工程模板

设置完成后,将工程文件名改为工程项目模板名,然后在ADS1.2软件安装目录下的Stationery目录下新建模板目录,再将刚设置完的工程模板文件存放到该目录下即可。这样以后在新建工程时就能在新建工程窗口中看到该模板了。

(7)添加和编辑源程序

新建工程后,选择“Project→Add Files”菜单,把和工程相关的所有文件即除inti外的所有文件加入到工程中。ADS1.2不能自动按文件类别对这些文件进行分类,用户可以选择“Project→Create Group”菜单创建文件组,然后分别将不同类的文件加入到不同的组,以方便管理,如图2-11所示。

图2-10 FromELF工具选项

图2-11 添加和编辑源程序

(8)编译和连接工程

在CodeWarrior IDE中编译文件,具体包括下面一些操作:

1)编译当前编辑窗口中的文件。

2)对源文件进行语法检查。

3)在CodeWarrior IDE中,可以选择“Project→Check Syntax”对一个源文件进行语法检查。

4)打开需编译的工程项目。

5)在工程项目窗口的Files视图中选择待检查的源文件或打开待检查的源文件使其进入编辑状态。

6)选择“Project→Check Syntax”命令。

(9)生成工程项目

在CodeWarrior IDE中,通过选择“Project→Make”命令,或者工具栏上的Make按钮来生成工程项目。具体的操作方法如下:

1)在工程项目窗口的Files视图的Touch栏上选择包含在生成目标中的源文件;然后选择“Project→Make”命令。

2)在工程项目窗口中选择Link Order视图。

3)在该窗口中通过拖放操作安排各源文件的顺序,也就是进行连接操作时的顺序。

4)删除目标文件。

5)选择“Project→Remove Object Code”命令,弹出删除对话框。

6)若单击All Target按钮,则删除所有的生成目标中的目标文件;若单击Current Target按钮,则删除当前的生成目标中的目标文件。单击Cannel按钮。

2.4.3 AXD调试器的使用介绍

AXD(ARM extended Debugger)是ADS软件中独立于CodeWarrior IDE的图形软件,可从CodeWarrior for ARM Developer Suite中进入AXD下进行调试。要使用AXD必须首先要有生成包含调试信息的程序,即由CodeWarrior for ARM Developer Suite编译生成含有调试信息的可执行ELF格式的映像文件。

(1)在AXD中打开调试文件

在菜单File中选择“Load image…”选项,打开Load image对话框,找到要装入的.axf映像文件,单击“打开”按钮,就可把映像文件装载到目标内存中,如图2-12所示。

图2-12 AXD环境

利用菜单Execute中的子菜单选项可对可执行映像文件进行调试,各选项的含义如下:

■ 选择Go选项或按F5键,将全速运行代码;

■ 选择Stop选项或按Shift+F5组合键,将停止运行代码;

■ 选择Step In选项或按F8键,以单步执行代码,若遇到函数,则进入函数内执行;

■ 选择Step选项或按F10键,以单步执行代码,若遇到函数,则把函数看成一条语句单步执行;

■ 选择Step Out选项或按shift+F8组合键,在Step In单步执行代码进入函数内后,若选该项,则可从函数中跳出返回到上一级程序执行;

■ 选择Run To cursor选项或按F7键,以全速运行到光标处停下;

■ 选择Show Execution Context选项,可显示执行的内容;

■ 选择Delete All Breakpoint选项,清除所有的断点。

(2)查看寄存器、变量内容和内存内容

利用AXD菜单选项Processor Views和System Views中的子菜单选项可查看寄存器、变量值,还可查看某个内存单元的数值等。子菜单的各选项的含义如下:

■ 选择Registers选项,可查看或修改目标板处理器中寄存器中的值;

■ 选择Variables选项,可查看或修改当前可执行的映像文件中的变量值,这些变量可以是局部变量、全局变量、类属变量,可增加或删除查看或修改的变量。

■ 选择Memory选项,可查看或修改存储器中的值。

■ 选择Watch选项,可对处理器设置观察点,观察点可以是寄存器、地址等,但不能修改。注意:菜单选项Processor Views下的Watch只能观察处理器,而菜单选项System Views下的Watch,可观察目标板上的任何资源,可增加或删除观察点。

查看寄存器窗口,如图2-13所示。查看变量内容,如图2-14所示。

图2-13 寄存器窗口

图2-14 变量内容

查看内存内容,如图2-15所示。

(3)设置断点

在程序调试时经常设置断点,即在程序的某处设置断点,当程序执行到断点处即可停下,这时,开发人员可通过前面的方法查看寄存器、存储器或变量的值,以判定程序是否正常。设置断点的方法是:将光标移到需设置断点处,使用快捷键F9在此处设置断点。

看断点的方法:在菜单选项System Views下选择breakpoint view选项可查看各断点的状态,在断点状态对话框中,右击利用快捷菜单可增加或删除断点。按F5键,程序将运行到断点,如果想进入函数内看如何运行的,可以在Execute菜单中选择Step In选项,进入到子函数内部进行单步程序的调试,如图2-16所示。

图2-15 内存内容

图2-16 断点设置

实例2-1 ARM开发环境ADS的使用实例

——附带光盘“Ch2\实例2-1”文件夹

——附带光盘“AVI\实例2-1.avi”

通过这个实例,可以使读者熟悉ADS开发环境提供的各种工具,以生成可以在ARM上运行的二进制文件及在调试程序过程中常用的调试方法。

实例需要的工具如下:

硬件:用于ARM920T的JTAG仿真器、ARM嵌入式开发平台、串口线。

软件:仿真器驱动程序、ARM ADS1.2集成开发环境、超级终端通信程序。

[详细步骤]

1)启动armJtag驱动程序,在处理器类型中选择ARM9。

2)用ADS打开程序。打开后如图2-17所示。

在startup中存放的是CPU启动时的启动代码,这里也是所有代码的入口。在inc文件夹中存放的是本实例中的头文件的目录;在src文件夹中存放的是实例中用到的所有源代码所在的目录;在init文件夹中存放的是和平台初始化相关的代码,如堆栈的初始化等。在uhal文件夹中存放的是硬件抽象层的代码。

3)编译整个工程。编译完成后会在工程目录下生成一个文件夹,这里生成文件夹名为Exp1_Data。生成的二进制文件在不同的目录下,本实例提供两个版本,即Debug和Release。编译时版本的选择如图2-18所示。

图2-17 ADS打开程序

图2-18 编译工程

编译结束后,弹出如图2-19所示的提示窗口,包括错误信息和警告,警告不影响程序的运行。

图2-19 提示窗口

4)调试代码。在编译无错误信息后就可以进行代码调试,单击“调试”按钮图标,弹出如图2-20所示的AXD窗口。

图2-20 AXD窗口

5)选择Options菜单,选择Configure Target,弹出如图2-21所示的Choose Target窗口。

图2-21 Choose Target窗口

6)选择Remote_A.dll文件,单击Configure,弹出如图2-22所示的Remote_A connection窗口。

7)单击“select...”,选择ARM ethernet driver,再单击“Configure…”配置目标板IP地址,在弹出的对话框中输入“127.0.0.1”。单击OK按钮确定。然后关闭AXD窗口。再单击调试按钮图标,代码下载到开发平台后弹出如图2-23所示的窗口。

8)在调试过程中常用的包括单步跟踪,查看内存地址,查看当前寄存器,设置断点等。菜单位置如图2-24所示。

9)当启动查看内存、寄存器、低级符号表后显示的窗口如图2-25所示。

图2-22 Remote_A connection窗口

图2-23 下载到开发平台后的窗口

图2-24 菜单位置

图2-25 启动后显示的窗口

10)本实例中用到的内存布局文件是init文件夹中scat_ram.scf文件。这个文件的指定位置如图2-26所示。

图2-26 文件的指定位置

11)单步跟踪程序的运行过程。

12)启动online Books后,如图2-27所示,输入要查询的关键字即可获得帮助信息。

图2-27 启动online Books