问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用eclipse进行嵌入式Linux的开发

发布网友 发布时间:2022-04-19 18:05

我来回答

3个回答

懂视网 时间:2022-04-08 09:09

安装 Eclipse 和 CDT

去 Eclipse官网下载最新的Eclipse IDE。

我们一般选择 C/C++ 版本(Eclipse IDE 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!
";
 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/

    下面把 gdbserver 移植到ARM平台。要点是指定目标平台的交叉编译链(gcc和ar)。我们创建一个临时的编译目录,以避免弄脏原代码。

    #cd /home/kim
    #mkdir gdb-build
    #CC="/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-gcc" AR=/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-ar /opt/gdb-6.8/gdb/gdbserver/configure --target=arm-linux --host=arm-linux
    #make

    上面命令中,–target=arm-linux表示目标平台,–host表示主机端运行的是arm-linux-gdb,不需要配置—prefix,因为gdbserver不在主机端安装运行。临时环境变量CC和AR用于指定交叉编译和汇编选项,在同一行命令的configure执行时将应用这些选项。

    没有错误的话就在/home/kim/gdb-build目录下生成gdbserver可执行文件,注意此时要更改其属性,否则可能会出现无法访问的情况,chmod 777 gdbserver将其更改为任何人都可以读写执行;使用arm-linux-strip命令处理一下gdbserver,将多余的符号信息删除,可让elf文件更精简,通常在应用程序的最后发布时使用;然后把它烧写到flash的根文件系统分区的/usr/bin(在此目录下,系统可以自动找到应用程序,否则必须到gdbserver所在目录下运行之),或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。

    编译好gdbserver后,把它拷贝到目标板上的 /usr/bin 目录下,运行,如果能显示帮助信息,则交叉编译成功,如:

    #gdbserver
    Usage: gdbserver [OPTIONS] COMM PROG [ARGS ...]
     gdbserver [OPTIONS] --attach COMM PID
     gdbserver [OPTIONS] --multi COMM
    
    COMM may either be a tty device (for serial debugging), or 
    HOST:PORT to listen for a TCP connection.
    
    Options:
     --debug  Enable general debugging output.
     --remote-debug Enable remote protocol debugging output.
     --version  Display version information and exit.
     --wrapper WRAPPER -- Run WRAPPER to start new programs.
     --once  Exit after the first connection has closed.

    如果提示其它错误信息,如二进制文件无法执行,则表示编译不成功。注意我们交叉编出来的gdbserver是无法在开发主机上运行的。

    命令行远程调试

    在目标板上,运行 gdbserver 命令启动测试程序的调试,并指定目标板的IP和监听端口号,如:

    #gdbserver 192.168.188.120:12345 HelloDm3730 (注,HelloDm3730 为要调试的程序)
    Process HelloDm3730 created; pid = 625
    Listening on port 12345

    我们看到gdbserver已经正常启动了,正在等待客户端程序gdb的连接。

    此时我们在开发主机上运行 arm-linux-gdb,指定gdbserver的IP和端口,连接上去,如:

    # arm-arago-linux-gnueabi-gdb 
    (gdb) target remote 192.168.188.120:12345
    Remote debugging using 192.168.188.120:12345
    0x400b57f0 in ?? ()

    显示“0x400b57f0 in ?? ()”表示已经连接到远端的gdbserver并且开始调试了,此时目标板终端会显示“Remote debugging from host 192.168.188.201”,再次确认远程调试连接成功。接下来的调试方法与普通本机的gdb使用相同。

    CDT + GDB 图形化远程调试

    我们可以直接使用 arm-linux-gdb 对应用程序进行远程调试,但命令行界面实在是不够友好。这里我们想办法在Eclipse上,通过CDT使用GDB进行远程在线调试。

    在Eclipse中选择一个项目,点击菜单 Run > Debug Configurations,在左侧的Dubug类型中找到“C/C++ Remote Application”,右击点“New”,创建一个远程调试配置,如下图:

    技术分享

    如果安装的CDT插件不全,可能没有“C/C++ Remote Application”这个类型,意味着CDT没有远程调试功能。这时需要安装一个叫“Remote System Explorer End-User Runtime ”的插件,如何安装请参考:How do I debug a remote application?。

    Eclipse的C/C++插件CDT已经很好的支持gdb在远程调试了。调试一个应用程序时,CDT有三种运行方式:

    1. Automatic Remote Launcher :远程自动运行,这是最方便好用的一种方式
    2. Manual Remote Launcher : 远程手动运行。用户自己在目标板上运行gdbserver,然后在开发主机上指定远程连接的方式(如IP地址和端口),连接到gdbserver
    3. Remote Attach Launcher :远程依附运行。类似于上一种,但它不是重新运行程序开启一个debug会话,而是直接Attach到一个已经运行的程序,然后调试

    在Debug Configurations 对话框中,创建一个远程调试配置,这个配置在创建时会根据项目情况提供一个默认的配置,默认将使用第一种Automatic Remote Launcher方式,这在Main标签中下方“GDB (DSF) Automatic Remote Debugging Launcher”可以看出,点击右边的“Select other…”可以切换其它方式。

    远程手动运行方式

    我们希望Eclipse每次生成一个项目之后,自动把生成出来的二进制程序拷贝到目标板上,这可以通过NFS挂载共享目录来实现,我们只需要配置项目属性(依次展开:C/C++Build > Settings > Build Steps > Post-build steps,在Command中输入“cp ProgramBin /mnt/share”)即可。

    接下来配置CDT的Debug选项,步骤如下:

    1. 选中项目→菜单栏 ”Run“→Debug Configurations…
    2. 双击 C/C++ Remote Application 新建一个配置,Eclipse会根据当前选择的项目初始化大部分配置,这里只需修改Debugger配置页
    3. 在右下方点击“Select other”,选择“GDB(DSF) Manual Remote Debugging Launcher”,确认
    4. 选择进入Debugger配置页,在Main标签中,GDB debugger 填写 arm-linux-gdb,如果未加入PATH环境变量则应该填入绝对路径
    5. 在Debugger配置页的Shared Libraries标签中,可以添加库路径,比如调试过程中要步入外部函数,就必须在这里给出带调试信息的库文件路径,否则会找不到该函数的定义
    6. 在Debugger配置页的Connection标签中,Type选“TCP”,并填写目标板上gdbserver监听的IP和端口号(这个在下面文档会提及)
    7. 所有配置完成后,点“Apply”保存配置,并关掉配置窗口

    接下来在目标板上运行 gdbserver,假如测试程序HelloDm3730已经下载到当前目录,如:

    #gdbserver 192.168.188.120:12345 HelloDm3730
    Process HelloDm3730 created; pid = 625
    Listening on port 12345

    目标板的 GDB 服务开启后,我们就可以在开发主机中,点击Eclipse的调试按钮(指定调试配置为刚才配置好的),开始应用程序的远程调试。我们在连接目标板的终端中,可以看到程序的标准输出;也可以在这里标准输入。

    当我们结束调试后,目标板上的gdbserver进程会自动退出。如果我们在修改代码后想再次调试,仍然需要在目标板上运行gdbserver,这样会很麻烦,但毕竟可以进行远程的图形化调试了。

    远程自动运行调试

    我们希望在开发主机上查看目标板(远端主机)的系统状况,如查看远程的文件,查看进程列表等,甚至打开终端运行远程机器上的程序。我们还希望这样一个工具软件能集成在Eclipse上,并且提供了API接口让Eclipse的插件能调用远程机器上的程序。

    TM/RSE 就是这样一个工具,全称是 Target Management / Remote Systems Explorer,是Eclipse上的一个插件。Eclipse的远程管理插件有很多,但这个最常用,所以我们安装了 Eclipse 的C++版,就自带了这个插件。ARM的软件开发环境DS-5 也使用了这个插件,其实整个DS-5的基础都是Eclipse社区的开源软件搭建起来的。关于TM/RSE的更多介绍,可参考其官方资料:TM and RSE FAQ

    我们可以在安装了TM/RSE的Eclipse上,点击右上角的“Open Perspective”按钮,打开“Remote System Explorer”,在 Remote System Explorer 上,你可以很方便的管理多个远程连接,查看远程文件和进程,运行远程程序等。

    RSE 支持很多网络连接类型,常用的有:

  • FTP/sFTP
  • SSH
  • Telnet
  • 支持连接到Unix/Linux/Windows主机和Local(本地)。要在开发主机上连接远程机器,必须先在远程机器上安装并启动某一远程控制服务,如 Telnet 服务、FTP服务、SSH服务。如果远程主机安装了文件服务(如FTP、SFTP)和Shell服务(如SSH、Telnet),那么可以在本地开发主机上,CDT可以调用RSE的API接口拷贝生成的目标程序到远端,并在远端目标板上运行gdbserver,从而做到自动下载和调试程序的功能。

    CDT调用RSE的API接口实现远程调试的过程可分解为:

    1. 通过文件服务接口下载编译的程序到目标板(可用的文件服务有:FTP、SFTP)
    2. 通过Shell运行目标板上的gdbserver加载下载的程序(可用的Shell服务有:SSH、Telnet)

    上面的第一步不是必需的,我们可以通过其它手段来实现,如在目标板上mount一个NFS文件系统,让开发主机(也挂载了同一个NFT文件系统)在编译后执行一条拷贝命令即可,这可以在项目的编译选项中配置。需要注意的是,如果想忽略这一步骤,还要在项目的Debug Configuration 中,勾选“Skip download to target path”,这样CDT才不会每次启动调试时都尝试打开文件服务接口。

    为了方便,我们还是希望让目标板同时提供文件服务和Shell服务。我们有两种选择:

    1. 在目标板上部署 OpenSSH。OpenSSH 本身带了SSH服务和SFTP服务,所以一个软件包可以搞定。缺点是编译出来的文件很大
    2. 在目标板上部署 Dropbear 和 vsFTP(或者其它FTP服务器)

    下面将分别介绍这两种方案。

    方案一:编译和部署OpenSSH

    请参考: 《Openssh服务器移植到2440处理器上》

    方案二:编译和部署Dropbear 和 vsFTP

    因为目标板的资源有限,在目标板上部署Telnet/FTP/SSH服务有点麻烦。好在Linux社区永远是开放的,我们有太多选择,如SSH服务可使用DropBear或OpenSSH,FTP可使用vsftpd等。如果我们的目标板已经在这些当中的某一服务了,那好办,直接连接即可;如果目标板上没有这些服务,我们还得自己编译和部署——用交叉编译器编译出目标平台的程序,然后部署和配置它。这里我们使用Dropbear来部署SSH服务。Dropbear 依赖 zlib 库,所以如果目标板上没有 libz.so,还得自己编译。

    先在网上下载最新的 zlib 和 dropbear。我下载的版本是:dropbear-2012.55.tar.gz 和 zlib-1.2.7.tar.gz 。

    编译的基本流程是:解压,配置,编译,安装。我们可以在./configure时就指定交叉编译工具。

    对于 zlib,我们指定安装路径为~/soft/install,这样make install后,make就会把编译后的程序拷贝安装到这个目录,方便我们取程序。如:

    #tar -xzf zlib-1.2.7.tar.gz
    #cd zlib-1.2.7
    #CC="/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-gcc" AR=/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-ar ./configure --shared --prefix=~/soft/install/
    #make
    #make install

    “安装”后,可在我们指定的目录~/soft/install/的lib下找到共享库文件(so),我们要用到的是:libz.so libz.so.1 libz.so.1.2.7

    对于 Dropbear ,我们需要多指定ranlib和strip,并且要指定目标平台为arm-linux。安装路径要使用绝对路径,虽然我们不安装。如:

    #tar -xzf dropbear-2012.55.tar.gz
    #cd dropbear-2012.55
    #CC="/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-gcc" AR=/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-ar RANLIB="/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-ranlib" STRIP="/data/Linux/ti-sdk5/linux-devkit/bin/arm-arago-linux-gnueabi-strip" ./configure --prefix=/home/kim/soft/dropbear-bin/ --host arm-linux
    #make

    编译后,在当前目录可以看到我们需要的程序:

    dropbear: ssh2 server 
    dropbearkey: 密钥生成器 
    dropbearconvert: 可以转换openssh的密钥
    dbclient: ssh2 client 

    把zlib的三个so(libz.so libz.so.1 libz.so.1.2.7,前两个是连接文件)拷贝到目标板上的 /usr/lib;把dropbear生成的四个程序拷贝到目标板的 /usr/sbin 目录下。

    然后(在目标板上)建立配置文件,生成SSH需要的密钥,如:

    #mkdir /etc/dropbear 
    #cd dropbear 
    #dropbearkey -t rsa -f dropbear_rsa_host_key
    #dropbearkey -t dss -f dropbear_dss_host_key

    最后启动服务:

    #dropbear -E
    [746] Jan 01 03:30:41 Running in background (提示在后台运行了)

    最好为目标板的用户建立密码。然后在开发机上,先测试一下我们的SSH服务:

    #ssh root@192.168.188.55
    root@192.168.188.55‘s password: (这里输入密码)

    如果输入正确的密码,但总是登录不成功(在目标板上的终端提示:user ‘root‘ has invalid shell, rejected),可能是由于 root 帐号没有设置正确的登录shell。各大多数程序一样,Dropbear 只允许 /etc/passwd 中列举的用户登录,并且在/etc/passwd中该用户需要设置正确的shell(/bin/sh 或 /bin/csh)。有些busybox用的是/bin/bash,所以被Dropbear拒绝了。这里我们使用 /bin/sh 以后,就可以正常登录了。

    vsFTP 暂时没有编译成功,它没有提供 configure 工具。

    使用CDT远程调试

    现在回过头来看CDT的远程调试。假设我们已经完成了以下工作:

  • 在远端部署了SSH或Tenlet服务(Telnet 在当前版本的RSE属于试验性质,远程调试没调通,不知是什么原因)
  • 在远端部署了某一个文件服务器(如SFTP或vsFTP)(这项没有也行,但调试会稍微麻烦点)
  • 本地RSE能访问远端功能(如Shell)
  • 在远端部署了 gdbserver,并存放在/usr/bin 中
  • 远端运行 gdbserver 时,开发主机能用 gdb (命令行)连接过去
  • 我们应该先在Remote System Explorer上创建连接,让RSE能连接到目标机器和管理目标机器。然后在项目的Debug Configurations中,创建“C/C++ Remote Application”的一个配置,在Main标签中,Connection选择RSE上建立的连接,然后输入远端的程序存放的路径,这个路径是包含最终的程序文件名的,不是目录。注意:如果在远端没有部署文件服务(SFTP或FTP),那么还需要勾选“Skip download to target path”,这样CDT才不会每次启动调试时都尝试打开文件服务接口,造成调试进行不下去。但勾选“Skip download to target path”了后,必须有途径把最新的程序拷贝到刚才指定的远端程序路径,如每次手动拷贝,或者在项目配置中,Post-build steps 中输入自动拷贝命令,让项目每次编译后自动拷贝到目标机器。

    参考

  • Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 上
  • Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 下
  • How do I debug a remote application?
  • gdb+gdbserver方式进行ARM程序调试
  • Remote System Explorer之DropBear移植
  • Remote System Explorer之FTP移植(vsftpd)        

       最精在研究u-boot,之前用的编译方法是在windows下用vs进行就该,然后用虚拟机里的ubuntu进行编译,中间使用共享文件夹。后来觉得太麻烦了,干脆直接在linux下进行修改和编译,因此安装了Eclipse for c/c++ developer。下面介绍两种交叉编译环境搭建的方法:

     

    一.使用工程中自带的Makefile。

      1.选择New->Project,而不是Import

    技术分享           

      2.再选择Makefile Project with Existing Code

    技术分享

      3.之后再在Project Name中填入工程名称

    技术分享

      4.最后直接Build All或者Build Project即可

    技术分享

    二.采用IDE自动生成Makefile

      1.同样选择New Project,不过之后选择C Project而不是Makefile Project with Existing Code

    技术分享

      2.这里输入工程名称,保证跟workspace里的工程文件夹名称相同。在下面Project type里面选择Cross-Compile Project

    技术分享

      3.之后右键工程选择Properties

    技术分享

      4.选择C/C++ Build->Settings。在Tool Settings标签栏里面选择Cross Settings。之后在Prefix里面填入形如powerpc-linux-gnu-的前缀,再在Path里面填上Tool Chain的路径,就OK了!

    技术分享

    OK这样就可以在Eclipse这个强大的IDE下进行交叉编译了。

     

     

    经过一段时间的摸索,终于把linux下搭建基于Eclipse的arm的开发环境给搭建起来了,做下笔记,以便日后查看。

    0. 用的linux版本是Ubuntu 9.04

        用的板子是FriendlyARM s3c2440

    1. 准备好相应的软件包:

        arm-linux-gcc-3.4.1.tar.bz2(网上现成的交叉编译工具,有兴趣的话也可以自己重头编译)

                                     地址:ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2

        jdk-6u21-linux-i586.bin(其实这里jre应该也够了,装个jdk以备以后开发java程序需要)

                                     地址:http://www.oracle.com/us/sun/index.html

        eclipse-cpp-helios-linux-gtk.tar.gz

                                     地址:http://www.eclipse.org/downloads/

     

    2. 首先建立交叉编译环境

        (1) 将arm-linux-gcc的压缩包arm-linux-gcc-2.95.3.tar.gz解压缩;eclipse-cpp-helios-linux-gtk.tar.gzeclipse-cpp-helios-linux-gtk.tar.gz

             $ sudo tar vxjf arm-linux-gcc-3.4.1.tar.bz2

        (2) 将路径usr/local下的arm目录拷贝到你自己系统的/usr/local下;

             cd ./usr/local
             $ sudo mv arm /usr/local

        (3) 修改环境变量,把交叉编译器的路径加入到PATH。(有三种方法,强烈推荐使用方法一,我也不知道为啥,网上说的)

             方法一:修改/etc/bash.bashrc文件
                   $ sudo vi /etc/bash.bashrc    在最后加上:
                    export PATH=$PATH:/usr/local/arm/3.4.1/bin(注意,这里的等号前后不能有空格,下同)

                    export PATH
        方法二:修改/etc/profile文件:(经测试发现,方法二必须重新启动,使用source的话换个终端就无效了)
                   $ sudo  vi /etc/profile        增加路径设置,在末尾添加如下:
                    export PATH=$PATH:/usr/local/arm/3.4.1/bin
         方法三:#export PATH=$PATH:/usr/local/arm/3.4.1/bin   注:(这只能在当前的终端下才是有效的!)

             总结:在这里我们还是用第二种方式吧,第一种方式Eclipse识别不出来的  -- 2010-10-10 9:47

        (4) 保存对profile的修改后,执行source /etc/bash.bashrc 就OK了,该命令能立即使新的环境变量生效,不用重启电脑; 

              用$ echo $PATH 检查是否将路径加入到PATH

        (5) 测试是否安装成功:$ arm-linux-gcc -v

     

    3. 安装Eclipse运行所需的jre,这里以jdk替代

        (1) 安装jdk-6u21-linux-i586.bin

             

    [c-sharp] view plaincopy    
    1. $ cd /usr/local/lib   
    2. $ sudo cp /home/jdk-6u4-linux-i586.bin ./   
    3. $ sudo chmod +x jdk-6u4-linux-i586.bin   
    4. $ sudo ./jdk-6u4-linux-i586.bin   

     

        (2) 设置环境变量

             在/etc/profile中加入如下的内容:

             (由上面可知这里用的是第一种方法,其实我暂时也没搞明白具体区别在哪里,姑且这样这着吧)
             

    [c-sharp] view plaincopy    
    1. JAVA_HOME=/usr/local/lib/jdk1.6.0_21   
    2. JRE_HOME=/usr/local/lib/jdk1.6.0_21/jre   
    3. CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib   
    4. PATH=$PATH:$JAVA_HOME/bin  
    5. export JAVA_HOME JRE_HOME CLASSPATH   

     

        (3) source /etc/profile

        (4) java -version

     

    4. 安装Eclipse

        (1) 解压Eclipse

              

    [c-sharp] view plaincopy    
    1. sudo tar zxvf eclipse-cpp-helios-linux-gtk.tar.gz -C /usr/local/dev   

     

        (2) 把Eclipse的编译器配置成arm-linux-gcc

              解压完以后我们就能在相应的目录找到Eclipse文件了,双击打开运行。

              新建一个工程以后选择工程的Properties,在弹出的页面上进行如下图设置:

              技术分享

              加了一个名为arm的编译方式以后,将它下面GCC C Compiler和GCC C Linker的Command改成arm-linux-gcc,然后就万事OK了,你现在就可以通过Eclipse利用arm-linux-gcc来进行交叉编译了。

              技术分享

     

    5.PC开启NFS与开发板链接

          PC上编译好的东西必须拿到板子上才能运行,拿U盘拷来拷去好像有点不太现实,我们利用NFS挂载就可以轻松解决这个问题。

       (1) 安装

          在Ubuntu系统下,使用NFS需要首先安装以下NFS的软件包

          服务器端 : nfs-common、nfs-kernel-server、portmap;

          客户端:nfs-common、portmap;

          在服务器端安装软件包的命令式:$sudo apt-get install nfs-kernel-server

           (安装nfs-kernel-server时,apt会自动安装nfs-common和portmap)

          目标板上的Linux系统由Linux内核和busybox共同提供对NFS的支持,不必安装其他的NFS客户端。

       (2) 配置

          NFS的配置文件是/etc/exports。

          在该文件后面加一行:/home/xxx/workspace *(rw,no_root_squash)  使目录/home/xxx/workspace允许所有的IP以读写的权限来访问。

       (3) 使用

          使用之前必需开启NFS服务:$sudo /etc/init.d/nfs-kernel-server start

          当然,使用之后可以关闭NFS服务:$sudo /etc/init.d/nfs-kernel-server stop

          首先在Linux服务器上进行NFS服务器的回环测试,验证共享目录能否被访问。

           $ mount -t nfs 192.168.1.1:/home/xxx/workspace /mnt

           $ ls /mnt

          启动开发板后在目标系统的Linux Shell下

           $ mount -t nfs 192.168.1.1:/home/xxx/workspace /mnt/nfs -o nolock

           $ ls /mnt/nfs

          如果成功开发板就可以直接运行主机上的程序了。

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

    标签:

    热心网友 时间:2022-04-08 06:17

    工具:

           虚拟机Linux:Fedora 9

      交叉编译工具:arm-linux-gcc-3.4.1.tar.bz2

      集成开发工具:Eclipse(Linux安装包中自带的,安装Linux时选中安装)

      安装ARM交叉编译器

    步骤:

    1、安装jdk

      jdk(java development kit)即java开发包,其中包含了运行eclipse所需要的jre. ubuntu缺省安装的gnu版本的jre运行效率不高,所以需要安装sun公司的jre. 首先从sun的网站上下载安装包jdk-6u7-linux-i586.bin,然后如下进行安装:

      # mkdir -p /opt/java
            # ./jdk-6u7-linux-i586.bin // 执行自解压文件,生成目录
            # mv jdk1.6.0_07 /opt/java // 把目录移到/opt/java下
            # cd /opt/java
            # ln -s jdk1.6.0_07 jdk 
            # mv /etc/alternatives/java /etc/alternatives/java.gnu
            # ln -s /opt/java/jdk/bin/java /etc/alternatives/java
            # export JAVA_HOME=/opt/java/jdk // 设置环境变量

      2、安装eclipse和cdt

      从eclipse网站上下载安装包eclipse-SDK-3.4-linux-gtk.tar.gz 和cdt-master-5.0.0.zip

      # cd /opt
            # tar zxvf eclipse-SDK-3.4-linux-gtk.tar.gz // 解压生成eclipse目录
            # export PATH=/opt/eclipse:$PATH
            # mkdir -p /opt/cdt
            # cd /opt/cdt
            # unzip cdt-master-5.0.0.zip
            # cp -r plugins/* /opt/eclipse/plugins/
            # cp -r features/* /opt/eclipse/features/

      二、创建c/c++工程

      假设已经在linux上安装好了arm交叉工具链,下面介绍如何创建、交叉编译和调试c/c++工程,进入eclipse安装路径后,运行eclipse。

    创建c 工程  

    使用缺省的Linux GCC工具链 

     进入c/c++ 界面 

     添加源代码文件1

      添加源代码文件2

      编辑代码

      设置工程属性,指定交叉工具链1

      设置工程属性,指定交叉工具链2

      设置工程属性,指定交叉工具链3

      编译工程

      已生成arm平台可执行代码

      配置调试选项

      设置Debugger和 GDB debugger选项

      设置连接类型为TCP,目标板的ip地址和调试端口号。端口号任意指定,通常大于1024(避免和系统所用端口号冲突)

      在开发板上运行程序,格式如上图所示:gdbserver是交叉调试辅助程序;192.168.0.150是主机的ip地址;1234是调试端口号,和eclipse调试选项里设定的端口号要一致

      点击Debug,进入调试界面

      执行到断点

      eclipse的调试界面和操作和在windows下开发类似。

      所需开发工具及环境

      虚拟机Linux:Fedora 9

      交叉编译工具:arm-linux-gcc-3.4.1.tar.bz2

      集成开发工具:Eclipse(Linux安装包中自带的,安装Linux时选中安装)

      安装ARM交叉编译器

      1. 安装。其实很简单,就是将下载的arm-linux-gcc-3.4.1.tar.bz2解压到Linux根目录即可(因为解压后已经包含了/usr/local目录,所以要解压到根目录),如下命令:


      tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 -C /

      解压后的目录/usr/local/arm/3.4.1/

      2. 设置环境变量。就是把交叉编译器的路径设置到系统环境变量里面去。


      echo $PATH

      查看现有的环境变量

      如果只想临时添加交叉编译器的环境变量(注:临时添加的系统重启或注销后又没有了),只需在命令行输入如下命令:


      export PATH=$PATH:/usr/local/arm/3.4.1/bin

      如果想这个环境变量永久的添加到系统的环境变量中,则你只需把这个命令添加到/root/.bashrc文件的最后一行即可(这个文件是隐藏文件,你要在文件浏览器中单击查看菜单,勾选显示隐藏文件才能看到)

      3. 测试建立的交叉编译环境。新建一个c程序,文件名:test.c, 如下:


      #include <stdio.h>
    int main(void)
    {
        printf("Hellow world!\n");
        return 0;
    }

      进行交叉编译,如下:


      arm-linux-gcc -o test test.c

      将交叉编译好的目标文件test下载到ARM开发板中并运行,如下:


      ./test

      输出结果为:

      Hellow world!

      用集成开发工具Eclipse来开发嵌入式应用程序

      双击Eclipse图标启动Eclipse

      设置Eclipse的工作空间,就是选个目录,单击OK

      启动后的主界面

      开始新建一个应用程序工程

      选择新建一个C工程,单击Next

      给工程取个名字,这里我就叫test_app;然后选择工程类型,我选择了个Hellow world C工程模版,单击Next

      填写作者、版权等信息,单击Next

      没什么选的,点击Finish

      单击Yes

      新建好的项目工程

      展开左边的源代码目录,双击打开主函数。这里只是输出一句"Hello World!!!",你可以做一些其他复杂的应用

      单击Project菜单,去掉Build Automatically的勾选,因为勾选的话,每次修改一个地方工程都会自动进行编译

      打开工程的属性对话框进行编译选项的设置

      我们的应用程序最终要到嵌入式arm上运行,这里就要把gcc改成arm-linux-gcc编译器,当然前提是你要在你的开发主机上先安装arm-linux-gcc

      C连接器也要改成arm-linux-gcc

      这里的Libraries是设置你的应用程序中用到的库文件,比如应用程序中用到了线程类,则这里在上面添加pthread这个库,下面就添加这个库的路径。如果应用程序没用到任何库文件就不用管了

      选中左侧的工程名,右键,在弹出的菜单中选择Build Project编译工程

      编译好后的工程,目标文件在Debug目录下

    热心网友 时间:2022-04-08 07:35

    一、安装软件
    在ubuntu下安装软件有两种方法:使用apt-get来自动安装或手动安装。用户使用自动安装非常方便,适合初学者。但是安装过程过于依赖资源网站的连接状况,可能需要耗费过多的时间。这里我们推荐手动安装的方式,花的时间比较短。
    1、安装jdk
    jdk(java development kit)即java开发包,其中包含了运行eclipse所需要的jre. ubuntu缺省安装的gnu版本的jre运行效率不高,所以我们需要安装sun公司的jre. 首先从sun的网站上(http://java.sun.com/javase/downloads/index.jsp)下载安装包jdk-6u7-linux-i586.bin,然后如下进行安装:
    # mkdir -p /opt/java
    # ./jdk-6u7-linux-i586.bin // 执行自解压文件,生成目录
    # mv jdk1.6.0_07 /opt/java // 把目录移到/opt/java下
    # cd /opt/java
    # ln -s jdk1.6.0_07 jdk
    # mv /etc/alternatives/java /etc/alternatives/java.gnu
    # ln -s /opt/java/jdk/bin/java /etc/alternatives/java
    # export JAVA_HOME=/opt/java/jdk // 设置环境变量
    2、安装eclipse和cdt
    从eclipse网站上(http://www.eclipse.org/)下载安装包eclipse-SDK-3.4-linux-gtk.tar.gz 和cdt-master-5.0.0.zip
    # cd /opt
    # tar zxvf eclipse-SDK-3.4-linux-gtk.tar.gz // 解压生成eclipse目录
    # export PATH=/opt/eclipse:$PATH
    # mkdir -p /opt/cdt
    # cd /opt/cdt
    # unzip cdt-master-5.0.0.zip
    # cp -r plugins/* /opt/eclipse/plugins/
    # cp -r features/* /opt/eclipse/features/
    二、创建c/c++工程
    假设我们已经在linux上安装好了arm交叉工具链,下面介绍如何创建、交叉编译和调试c/c++工程。为了更直观的说明,我们截取了相关的图片:
    进入eclipse安装路径后,运行eclipse
    eclipse运行界面
    eclipse运行界面
    创建c 工程
    使用缺省的Linux GCC工具链
    进入c/c++ 界面
    添加源代码文件1
    添加源代码文件2
    编辑代码
    设置工程属性,指定交叉工具链1
    设置工程属性,指定交叉工具链2
    设置工程属性,指定交叉工具链3
    编译工程
    已生成arm平台可执行代码
    配置调试选项
    设置Debugger和 GDB debugger选项
    设置连接类型为TCP,目标板的ip地址和调试端口号。端口号任意指定,通常大于1024(避免和系统所用端口号冲突)
    在开发板上运行程序,格式如上图所示:gdbserver是交叉调试辅助程序;192.168.0.150是主机的ip地址;1234是调试端口号,和eclipse调试选项里设定的端口号要一致
    点击Debug,进入调试界面
    执行到断点
    eclipse的调试界面和操作和在windows下开发类似,相信到了这一步,大家已经可以很方便来进行应用程序的开发了。
    所需开发工具及环境
    虚拟机Linux:Fedora 9
    交叉编译工具:arm-linux-gcc-3.4.1.tar.bz2
    集成开发工具:Eclipse(Linux安装包中自带的,安装Linux时选中安装)
    安装ARM交叉编译器
    1. 安装。其实很简单,就是将下载的arm-linux-gcc-3.4.1.tar.bz2解压到Linux根目录即可(因为解压后已经包含了/usr/local目录,所以要解压到根目录),如下命令:
    tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 -C /
    解压后的目录如下图:
    解压后的目录/usr/local/arm/3.4.1/
    2. 设置环境变量。就是把交叉编译器的路径设置到系统环境变量里面去。
    echo $PATH
    查看现有的环境变量,显示如下图:
    如果你只想临时添加交叉编译器的环境变量(注:临时添加的系统重启或注销后又没有了),只需在命令行输入如下命令:
    export PATH=$PATH:/usr/local/arm/3.4.1/bin
    添加后的环境变量如下图:(多了一个/usr/local/arm/3.4.1/bin)
    如果你想这个环境变量永久的添加到系统的环境变量中,则你只需把这个命令添加到/root/.bashrc文件的最后一行即可(这个文件是隐藏文件,你要在文件浏览器中单击查看菜单,勾选显示隐藏文件才能看到)
    3. 测试建立的交叉编译环境。新建一个c程序,文件名:test.c, 如下:
    #include <stdio.h>
    int main(void)
    {
    printf("Hellow world!\n");
    return 0;
    }
    进行交叉编译,如下:
    arm-linux-gcc -o test test.c
    将交叉编译好的目标文件test下载到ARM开发板中并运行,如下:
    ./test
    输出结果为:
    Hellow world!
    用集成开发工具Eclipse来开发嵌入式应用程序
    双击Eclipse图标启动Eclipse
    设置Eclipse的工作空间,就是选个目录,单击OK
    启动后的主界面
    开始新建一个应用程序工程
    选择新建一个C工程,单击Next
    给工程取个名字,这里我就叫test_app;然后选择工程类型,我选择了个Hellow world C工程模版,单击Next
    填写作者、版权等信息,单击Next
    没什么选的,点击Finish
    单击Yes
    新建好的项目工程
    展开左边的源代码目录,双击打开主函数。这里只是输出一句"Hello World!!!",你可以做一些其他复杂的应用
    单击Project菜单,去掉Build Automatically的勾选,因为勾选的话,每次修改一个地方工程都会自动进行编译
    打开工程的属性对话框进行编译选项的设置
    我们的应用程序最终要到嵌入式arm上运行,这里就要把gcc改成arm-linux-gcc编译器,当然前提是你要在你的开发主机上先安装arm-linux-gcc
    C连接器也要改成arm-linux-gcc
    这里的Libraries是设置你的应用程序中用到的库文件,比如应用程序中用到了线程类,则这里在上面添加pthread这个库,下面就添加这个库的路径。如果应用程序没用到任何库文件就不用管了
    选中左侧的工程名,右键,在弹出的菜单中选择Build Project编译工程
    编译好后的工程,目标文件在Debug目录下
    结束语
    建立交叉编译环境是开发嵌入式程序的第一步,编译器版本也有很多,这里就介绍用的较多的一种。而Eclipse则是本人认为开发嵌入式应用程序最为方便的集成开发工具,他不仅让整个工程清晰可见,更重要的是他不需要你去为整个工程编写复杂的Makefile文件,他会为你自动生成Makefile。
    ubuntu上安装arm交叉编译环境arm-linux-gcc
    首先下载 arm-linux-gcc-4.3.2.tgz,这个就不多说了,重点介绍一下怎么安装。将 arm-linux-gcc-4.3.2.tgz 文件拷贝到 Ubuntu 的主文件夹下,在 Ubuntu 中新建一个终端,以root用户运行,输入下面的命令安装交叉编译器:
    #tar zxvf arm-linux-gcc-4.3.2.tgz
    解压后会产usr文件夹,将这个目录下的usr/local/arm的arm文件夹复制到文件系统的usr/local目录下,命令为
    #mv usr/local/arm usr/local
    然后把交叉编译器路径添加到系统环境变量中,
    在终端中执行:
    gedit /etc/profile
    添加以下四行到该文件中:
    export PATH=/usr/local/arm/4.3.2/bin:$PATH
    export TOOLCHAIN=/usr/local/arm/4.3.2
    export TB_CC_PREFIX=arm-linux-
    export PKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    ...最好是粉蓝绿之类的 大屏幕 前后摄像头 三星HTC索爱等都可 不要... ...3000左右的机子,htconex的水货怎么样与三星i9100比哪个更好一点,适... 私密照片适用机型 ...看上了三星的i9100和HTC的g19和索尼lt26 不知道选择哪一部 求大神... ...全部歌词?歌词大概……那是一个夜晚……我和谁谁媳妇缠绵…_百度知 ... 老年人缺铁性贫血有哪些症状 酪梨虾是什么 诺基亚C7无法使用OVI套件在电脑上升级地图。 我用ovi套件更新软件总手机重启后提示连接失败,跪求高人指点。。。_百... 我nokia2730c用ovi套件升级成v7.75版,结果变成全英文(设置语言修改没用... 求一份简单的嵌入式linux程序源码 简单的嵌入式linux开发项目,求推荐! 基于S3C2440的嵌入式Linux开发实例的目录 求帮忙做个作业,嵌入式Linux开发环境搭建 跪求一份完整的嵌入式Linux方面的C项目实例 嵌入式Linux应用层开发有哪些实例? 柚子皮煮冰糖的功效的做法 柚子皮煮水可做什么? 柚子皮煮水止咳的做法是 柚子皮煮水止咳的做法是怎么样的? 组合式净化空调机组粗中效过滤器压差值多大时说明... 空调机组的初效过滤器及中效过滤器能否清洗呢? 初效过滤器以及中、高效空气过滤器有什么区别? 有关空调箱的:中效过滤器前有必要装初效过滤器吗 新风系统中粗效过滤器与高效过滤器有什么区别? 洁净车间空调系统有哪几道过滤网? 空调净化系统运行时,当初,中效过滤器压差的数值... 净化车间空调系统的净化原理 洁净室的过滤器标准是怎样的? 洁净厂房的空调系统风柜更换初效过滤器中效过滤器... 嵌入式系统Linux内核开发实战指南的前言(序) 如何做嵌入式Linux操作系统 在校大学生如何积累嵌入式linux项目经验??急急急 谁能给我说一下嵌入式Linux的开发流程包括哪些步骤... 嵌入式linux系统开发的具体步骤? 学习嵌入式Linux怎么应用开发? 嵌入式linux怎么学?学习嵌入式linux有什么方法? Linux嵌入式系统开发的内容简介 嵌入式linux的应用特点 嵌入式Linux驱动程序开发学习路线? 嵌入式Linux系统开发模式 大家有谁知道什么是嵌入式Linux系统?有什么实际作... 对中学生合理使用手机的建议是什么? 建国70周年纪念币在哪个银行预约? 初中生如何合理玩手机? 中国人民银行70周年纪念币怎么预约 中学生如何正确使用手机 中华人民共和国70周年纪念币在哪里买的呢? 如何引导初中孩子合理使用手机 中行预约中华人民共和国成立70周年纪念币办理流程...