用Eclipse和GDB构建ARM交叉编译和在线调试环境

我们在 Linux 主机中搭建我们的开发环境,使用 Ubuntu 10.04 LTS 为例。

搭建应用开发环境安装 JRE

Eclipse依赖于Java 环境,所以必须先安装 JRE 或 JDK。

安装Eclipse和CDT

去Eclipse官网下载最新的EclipseIDE。

我们一般选择 C/C++ 版本(EclipseIDE for C/C++ Developers),这个版本自带了CDT,不用另行安装CDT插件。下载时选择 Linux 的版本,如:eclipse-cpp-juno-linux-gtk.tar.gz

直接把下载下来的压缩包(eclipse-cpp-juno-linux-gtk.tar.gz)解压到某一目录,运行可执行文件eclipse即可。

运行eclipse后,可先进行Eclipse使用环境Workspace的配置。

创建交叉应用工程

在Eclipse主界面点击菜单 File > New > C/C++ Project,在弹出的“C/C++ Project”对话框中,输入项目名称。选择一个项目类型(如Executable/Empty Project),在 Toolchains 中一定要选 Cross GCC,这是CDT对交叉环境的支持,提供了额外的功能,以方便嵌入式应用程序的开发。

点击下一步,来到“Select Configurations”页面,我们采用默认,直接下一步,来到“Cross GCC Command”的设置。这里我们可以填写交叉编译工具链的交缀和路径,如:

Cross compiler prefix: arm-arago-linux-gnueabi-Cross compiler path: /data/linux/ti-sdk5/linux-devkit/bin

上例的情况是在我们已经安装好了ARM芯片商提供的交叉编译包。一般来说,芯片商都提供了这样一个交叉编译环境,包括目标平台的编译工具链、Glibc库、二进制工具和其它常用工具。上例是TI提供的DM3730的开发包的安装路径和程序的前缀(真实程序为:arm-arago-linux-gnueabi-gcc、arm-arago-linux-gnueabi-ld等)

最后点击完成,一个交叉项目就创建好了。关于交叉编译前缀和路径的设置,在项目创建后,可以在项目的属性中改变它。

这里我们写一个简单的测试程序,如:

#include <iostream>using namespace std;int main(int argc, char ** argv){signal(0, 0);cout<<"This is a message from HelloDm3730!\n";return 0;}

点击构建,对它进行编译。编译后,我们可以在左侧的“Project Explorer”中,项目目录下的Binaries中看到编译出来的程序。把它拷贝到目标ARM开发板上,运行,结果正确。

运行调试

程序编译成目标平台的二进制码后,怎么拷贝到目标板上运行调试是个问题。

我们可以通过TFTP把编译好的程序下载到目标板上,即在开发主机安装TFTP服务器,在目标板上使用tftp命令向主机取文件。

另一个比较方便的做法是,在开发主机上部署NFS服务,导出一个共享目录,然后目标板上使用mount命令,把开发主机上的共享目录挂载到本地。这样,开发主机和目标板使用同一个目录,就不用不断下载程序了。NFS的部署可以参照《Linux下使用NFS共享目录》。

终极的解决办法是搭建GUI的在线调试环境,即写完代码后,点击调试,Eclipse自动编译程序,然后把程序下载到目标板,然后运行打开GDB在线调试,这样就可以单步调试了,就像调试本地程序一样。

搭建在线调试环境gdb+gdbserver总体介绍

远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。

就目前而言,嵌入式Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:

普通列表项目用ROM Monitor调试目标机程序

用KGDB调试系统内核

用gdbserver调试用户空间程序

这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。

而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采用gdb+gdbserver的方式进行调试。

源代码下载

嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。这样,应用程序在嵌入式目标系统上运行,而gdb调试在Host端,所以要采用远程调试(remote)的方法。进行GDB调试,目标系统必须包括gdbserver程序(在主机上正对硬件平台编译成功后下载到目标机上),宿主机也必须安装GDB 程序。一般Linux发行版中都有一个可以运行的GDB,但开发人员不能直接使用该发行版中的GDB来做远程调试,而要获取GDB的源代码包,针对arm 平台作一个简单配置,重新编译得到相应GDB。GDB的源代码包可以从GNU官网中下载。

配置编译及安装

再次强调一次,GDB远程调试套件包括Host端的gdb和Target端的gdbserver,对于gdb,宿主机上发行版本自带的PC版gdb是不能用的,它没有目标架构(ARM)相关的调试支持。所以我们应该使用gdb的源码,针对ARM平台编译一个(toolchain还是Host上的)特别的版本。当然,如果芯片商提供的交叉编译套件中已经包含了arm-linux-gdb,我们就不用重新编译gdb了,直接用它即可。不管怎么说,gdbserver还是需要用目标板的toolchain重新编译一遍,因为芯片商提供的交叉开发套件通常不包括gdbserver。

下载完后,解压:

#cd /opt#tar xzvf /tmp/gdb-6.8.tar.gz

建立配置文件,编译:

#cd /opt#mkdir -p arm-gdb/build#cd arm-gdb/build#/opt/gdb-6.8/configure –target=arm-linux –prefix=/opt/arm-gdb#make#make install

上面命令中,–target配置gdb的目标平台,–prefixp指定了编译结果的存放位置,也就是安装目录。编译完后可以在/opt/arm-gdb/bin目录下找到可执行的arm-linux -gdb, arm-linux -gdbtui, arm-linux-run。 拷贝arm-linux-gdb 到/usr/bin目录:

#cd /opt/arm-gdb/bin/#cp arm-linux-gdb /usr/bin/我想去旅行,一个人背包,一个人旅行,

用Eclipse和GDB构建ARM交叉编译和在线调试环境

相关文章:

你感兴趣的文章:

标签云: