• 沒有找到結果。

第 1 章 嵌入式系统开发入门

1.3 ADS 集成开发环境介绍

1.3.1 ADS 软件组成

1.3.1.4 支持的软件

ADS 为用户提供 ARMulator 软件,使用户可以在软件仿真的环境下或者在基于 ARM 的硬件环境调试用户应用程序。ARMulator 是一个 ARM 指令集仿真器,集成在 ARM 的调 试器 AXD 中,它提供对 ARM 处理器的指令集的仿真,为 ARM 和 Thumb 提供精确的模拟。

用户可以在硬件尚未做好的情况下,开发程序代码。

关于 ADS 软件主要由上述四个部分组成,下面将介绍在实际工作中经常用到的 Code Warrior 和 AXD 工具的基本使用。

1.3.2 使用 Code Warrior IDE

Code Warrior IDE 提供一个简单通用的图形化用户界面用于管理软件开发项目。可以利 用 Code Warrior IDE 开发 C,C++和 ARM 汇编代码以 ARM 和 Thumb 处理器为对象。下面 将通过一个实例来讲述 Code Warrior IDE 的具体使用,为了使读者容易理解,这里还是以附 件光盘中提供的 SWI 项目为例,讲述 Code Warrior IDE 工具的使用。

1.3.2.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 文件转入到 CodeWarrior 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 所示,有三个标签页,分别为 files,link order,

target 默认的是显示第一个标签页 files。通过在该标签页点击鼠标右键,选中“Add Files…”

可以把要用到的源程序添加到工程中。

图 1.5 添加源文件到工程中

为工程添加源码常用的方法有两种,既可以使用入图 1.5 所示方法,也可以在“Project”

菜单项中,选择“Add Files…”,这两种方法都会打开文件浏览框,用户可以把已经存在的 文件添加到工程中来。当选中要添加的文件时,会出现一个对话框,如图 1.6 所示,询问用 户把文件添加到何类目标中,在这里,我们选择 DebugRel 目标。这里我们添加了 swi.h,a_swi.s c_swi.s 和 main.c 文件。

在建立好一个工程时,默认的 target 是 DebugRel,还有另外两个可用的 target,分别为 Realse 和 Debug,这三个 target 的含义分别为:

DebugRel:使用该目标,在生成目标的时候,会为每一个源文件生成调试信息;

Debug:使用该目标为每一个源文件生成最完整的调试信息;

Release:使用该目标不会生成任何调试信息。

图 1.6 选择生成目标类型

到目前为止,一个完整的名为 swi 的项目工程已经建立,下面该对工程进行编译和链接 工作。

1.3.2.2 编译和链接项目工程

在编译 swi 项目之前,先进行设置,点击 Edit 菜单,选择“DebugRel Settings…”,或 者按 Alt + F7 快捷键,显示如图 1.7 对话框。

图 1.7 DebugRel 设置对话框

图 1.7 的最左边部分是目标设置面板,它包括如下几个大的设置对象:

Ø Target 设置选项

Target Settings:包括 Target Name,Linker,Pre-linker 和 Post-linker 等设置。

Access Paths:主要是用于项目的路径设置。

Build Extras:主要用于 Build 附加的选项设置。

Runtime Settings:包括一般设置、环境设置等。

File Mappings:包含映射信息,文件类型,编辑语言等。

Source Trees:包含源代码树结构信息,以及路径选择等。

ARM Target:定义输出 image 文件名和类型等。

Ø Language Settings 设置选项

ARM Assembler:对 ARM 汇编语言的支持选项设置。

ARM C Compiler:对 C 语言的支持选项设置。

ARM C++ Compiler:对 C++语言的支持选项设置。

Thumb C Compiler:对 Thumb C 语言的支持选项设置。

Thumb C++ Compiler:对 Thumb C++语言的支持选项设置。

Ø Linker 设置选项

ARM Linker:对输出的链接类型、RO、RW Base 地址设置等选项。

ARM fromELF:定义输出文件格式以及路径等。

Ø Edit 设置选项

Custom Keywords:对客户化关键字高亮颜色的设置。

Ø Debugger 设置选项

Other Executables:制定其他的可执行文件来调试当调试该目标板时。

Debugger Settings:对调试器的一些基本设置。

ARM Debugger:选择调试时调试器(AXD,Armsd 和其他等)的选择。

ARM Runner:选择运行时的调试器(AXD,Armsd 和其他等)的选择。

Ø Miscellaneous 设置选项

ARM Features:设置一些受限制的特性。

接下来点击 CodeWarrior IDE 的菜单 Project 下的 make 菜单,就可以对 swi 工程进行编 译和链接了。整个编译链接之后生成如图 1.8 所示:

图 1.8 编译和链接的之后

在工程 swi 所在的目录下,会生成一个名为:工程名_data 的目录,即 swi_data 的目录,

在这个目录下不同类别的目标对应不同的目录。在本例中由于我们使用的是 DebugRe 目标,

所以生成的最终文件都应该在该目录下。进入到 DebugRel 目录中去,读者会看到 make 后 生成的映像文件和二进制文件,映像文件用于调试,二进制文件可以烧写到目标板的 Flash 中运行。关于 Code Warrior IDE 的具体使用请参考 ADS 软件的在线帮助文件。

1.3.3 使用 AXD IDE

AXD 是 ADS 软件中独立于 CodeWarrior IDE 的图形软件,打开 AXD 软件,默认是打 开的目标是 ARMulator。ARMulator 也是调试的时候最常用的一种调试工具,本节主要是结 合 ARMulator 介绍在 AXD 中进行代码调试的方法和过程,使读者对 AXD 的调试有初步的 了解。要使用 AXD 必须首先要生成包含有调试信息的程序,在上节中,已经生成的 swi.axf 文件就是含有调试信息的可执行 ELF 格式的映像文件。这一节还是以 swi 工程为例讲述 AXD 调试工具的基本用法。

1.3.3.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 即可以单步执行代码,窗口中蓝色箭头会发生相应的移动。

1.3.3.2 设置断点

有时候,用户可能希望程序在执行到某处时,查看一些所关心的变量值,此时可以通过 设置断点达到此要求。将光标移动到要进行断点设置的代码处,在 Execute 菜单中,选择

“Toggle Breakpoint”或按 F9,就会在光标所在行的起始位置出现一个红色实心圆点,表明 该处为已设为断点。假设本例中给 62 行代码设置断点,首先将光标移至 62 行,然后按 F9 或点击“Toggle Breakpoint”按钮,此时如图 1.10 所示:

图 1.10 设置断点

1.3.3.3 查看寄存器内容

查看寄存器的值在实际嵌入式开发调试中经常使用,使用方法:从 Processor Views 菜 单中选择“Memory”选项,如图 1.11 所示。在 Memory Start address 选择框中,用户可以根 据要查看的存储器的地址输入起始地址,在下面的表格中会列出连续的 64 个地址。从图 1.11 中可以看出地址为 0x0 的存储器中的初始值为 0x E7FF0010,注意因为用的是 little-endian*

(注 2),所以读数据的时候注意高地址中存放的是高字节,低地址存放的是低字节。

*注 2:Big-endian 和 Little-endian 是用来表述一组有序的字节数存放在计算机内存中时的顺序的术语。

Big-endian 是将高位字节(序列中最重要的值)先存放在低地址处的顺序,而 Little-endian 是将低位字

节(序列中最不重要的值)先存放在低地址处的顺序。举例来说,在使用 Big-endian 顺序的计算机中,要 存储一个十六进制数 5F48 所需要的字节将会以 5F48 的形式存储(比如 5F 存放在内存的 1000 位置,而 48 将会被存储在 1001 位置)。而在使用 Little-endian 顺序的系统中,存储的形式将会是 485F(48 在地址 1000 处,5F 在地址 1001 处)。如果将 0x5F48 写到以 0x0000 开始的地址中,则存放的顺序如下:

地址 Big-endian Little-endian 0x0000 5F 48 0x0001 48 5F

IBM 的 370 种大型机、大多数基于 RISC 的计算机以及 Motorola 的微处理器使用的是 Big-endian 顺序,TCP/IP

协议也是。而 Intel 的处理器和 DEC 公司的一些程序则使用的 Little-endian 方式。

图 1.11 查看寄存器值

1.3.3.4 查看变量值

在调试过程中,经常需要查看某个变量的值,在 AXD 工具中,查看变量值的方法是:

先用鼠标选中要查看的变量,然后鼠标右击,在探出的对话框中选择“Watch..”,将会显示 指定变量的详细信息。此处以 62 行的 res_3 为要查看的变量,先选中 res_3 变量,然后鼠标 右击,选择“Watch..”项,将弹出如图 1.12 的对话框,该对话框显示了 res_3 变量的地址和 值等详细信息。

图 1.12 查看变量对话框

总之,AXD 工具的使用方法还有很多,关于 AXD IDE 的具体使用请参考 ADS 软件的 在线帮助文件,这里不再赘述。

1.4 嵌入式 Linux 开发介绍

在这一节中主要讲述 Linux 开发的基础知识,其中包括 Linux 的发展历史,Linux 的开 发环境和 ARM Linux 系统的开发流程,首先让我们来看一下 Linux 的发展历史。

1.4.1 Linux 历史

Linux 是 Unix 操作系统的一个克隆,由名叫 Linus Torvalds 的大学生在 1991 年开发诞 生的。Linus Torvalds 将他写的操作系统源代码放在了 Internet 上,受到很多计算机爱好者的 热烈欢迎,并且这些计算机爱好者不断地添加新的功能和特性,并不断的提高它的稳定性。

在 1994 年,Linux 1.0 正式发布。现在,Linux 已经成为一个功能超强的 32 位操作系统。Linux 为嵌入操作系统提供了一个极有吸引力的选择,它是个和 Unix 相似、以核心为基础的、完

在 1994 年,Linux 1.0 正式发布。现在,Linux 已经成为一个功能超强的 32 位操作系统。Linux 为嵌入操作系统提供了一个极有吸引力的选择,它是个和 Unix 相似、以核心为基础的、完