这篇文章是为了给像我一样刚接触嵌入式的菜鸟同学看的,高手可以略过。
环境说明:
(1)、Linux系统ubuntu12.04,安装于虚拟机VMware中;
(2)、开发板BeagleBoneBlack为A5C,装有系统Angstrom;
(3)、Eclipse从官网下载解压安装,版本Eclipse IDE for C/C++ Developers Version:Luna RC3 Release(4.40rc3);
(4)、交叉编译工具在linux系统中用高级软件包管理器下载
sudo apt-get install g++-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabi
一、Eclipse安装
Eclipse的安装分为两个步骤,先安装JAVA环境,由于Eclipse使用JAVA编写的,所以运行该软件需要JAVA环境以及各种JAVA工具。
1、下载 JDK
从http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html选择下载JDK的最新版本 JDK 8。
下载后得到文件jdk-8u11-linux-i586.tar.gz,该文件保存在家目录下的software文件中,。
2、解压文件到目录/usr/lib/
$ sudo tar -zxvf ~/software/jdk-8u11-linux-i586.tar.gz -C /usr/lib/
3、配置
$ sudo gedit /etc/environment
在environment中修改PATH,追加JDK路径,添加CLASSPATH与JAVA_HOME后如下:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jdk1.8.0/bin"
CLASSPATH="/usr/lib/jdk1.8.0/lib"
JAVA_HOME="/usr/lib/jdk1.8.0"
然后就是要告诉系统,我们使用的sun的JDK,而非OpenJDK了:
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jdk1.8.0/bin/java 300
$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jdk1.8.0/bin/javac 300
$ sudo update-alternatives --config java
如上所示,这样就设置好了要使用的java了。
从 官方网站下载合适版本,Eclipse IDE for C/C++ Developers linux 32Bit,得到文件eclipse-cpp-luna-RC3-linux-gtk.tar.gz
5、解压文件,该文件保存在家目录下的software文件中,
$ sudo tar -zxvf ~/software/eclipse-cpp-luna-RC3-linux-gtk.tar.gz -C /usr/lib/
6、创建启动快捷方式
$ sudo gedit /usr/share/applications/eclipse.desktop
内容如下:
[Desktop Entry]
Type=Application
Name=Eclipse
Comment=Eclipse Integrated Development Environment
Icon=/usr/lib/eclipse/icon.xpm
Exec=/usr/lib/eclipse/eclipse
Terminal=false
Categories=Development;IDE;Java;
经过以上步骤Eclipse终于在ubuntu12.04中安家了,截图如下:
二、交叉编译工具的下载与安装
交叉编译的工具选择比较多,推荐 Linaro Toolchain(这个链接资源很多,但需要翻墙),根据自己的情况选择合适的工具下载。交叉编译工具的选择是否正确可以有一个简单的测试方法,先下载该工具然后安装,接着自己写一个简单的hello.c程序,再在终端中使用该交叉工具的命令,对这个源程序进行编译生成可执行文件,接着把该文件传送到目标板上运行,看是否有正确输出,如果有那么这个交叉编译工具就选对了。只是现在我们在Ecilpse这个框架的帮助下,可以开发更加复杂的程序,以及对程序很方便的运行(生成的可执行文件Eclipse可以帮我们直接传到板子上并运行),以及调试(Eclipse还可以进行远程调试哦!!!),这些都是Eclipse通过安装插件后实现的。我安装的时候是在ubuntu12.04中用apt下载的,如下:
sudo apt-get install g++-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabi
下载安装好之后可以在/usr下面看到文件夹arm-linux-gnueabi,这就是我们要使用的交叉编译工具了,同时在系统的/usr/bin目录下可以看到多了一些命令,在终端下输入arm-linux-gnueabi-然后连按两下Tab键即可看到,如下图,其中有调用编译器、链接器的命令,如arm-linux-gnueabi-g++、arm-linux-gnueabi-gcc、arm-linux-gnueabi-as,这是准备好给Eclipse调用的。
在交叉编译工具的安装目录下,还可以看到一些头文件和库函数,这些也是在编写BeagleBoneBlack板子上的程序的时候,我们要调用的文件。
三、搭建运行环境
以下以建立一个Hello的C++工程为例。
1、双击图标弹出对话款,让你选择你的工作空间路径,Eclipse让用户把工程文件夹全部都放在一个工作空间文件夹中,便于管理,
2、点击OK,打开Eclipse界面,依次选择File—>New—>C++ Project,如下图
填写工程名,建立空白工程,或者Hello工程,toolchain这里可以选择Cross GCC,也可以选择Linux Gcc,反正编译器都会要我们自己配置,我选择Linux Gcc(当然Cross GCC也可以),点击Finish。
3、此时一个工程就创建好了,在以后编程时为了保证你的程序没有问题你可以在PC机上先运行一下看是否有正确输出(当然,这仅仅是在你的程序比较简单没有去控制目标平台上的硬件的情况下),点击工具栏的小锤子,然后点击RUN,就可以在下方的控制台中看到程序输出结果。
4、但是现在做的是交叉编译,在不配置的情况下,Eclipse调用了Linux系统安装时自带的GCC编译器,生成的二进制文件可以在PC机上运行,当无法再目标平台(也就是BeagleBoneBlack板子中)运行,那么下面进行配置。在工作空间窗口中选中testc工程,点击Project—>Properties,弹出对话款如下,
如上图,依次按照step1、step2、step3进行点击,接下来分别修改GCC C++ Compiler、GCC C Compiler、GCC C++ Linker、GCC Assembler的command,分别点击这些选项将g++、gcc、g++、as替换成前面提到的交叉编译命令arm-linux-gnueabi-g++、arm-linux-gnueabi-gcc、arm-linux-gnueabi-g++、arm-linux-gnueabi-as,也就是接下来的step4、step5、step6、step7.
5、原来的编译命令替换成交叉编译命令
修改好之后,就是告诉Eclipse,在对源程序进行预处理、编译、链接时,不要用系统自带的GCC编译器,请选择我们设置的这些命令(也就是安装交叉编译工具后所产生的这些命令),设置还没结束......
6、虽然已经告诉Eclipse使用什么编译命令了,但是在编写BBB的程序的时候,我们所调用的交叉编译工具中的头文件和库文件Eclipse还找不到,这也需要设置。同时也可以知道在这个应用中Eclipse显然只是个框架,编译器以及库函数都是我们自己设置的,同样以后再使用第三方库或者编译器时,我们应该仍然可以在这些地方进行设置(猜的),
依次点击step8、step9、step10、step11,也就是告诉Eclipse,在我们调用了C库函数的时候头文件在哪里找,而C头文件就在前面安装交叉编译工具时的/usr/arm-linux-gnueabi/include/文件夹中,添加该路径即可。接下来还要告诉Eclipse调用了C++库函数的时候头文件在哪里找,而C++头文件就在前面安装交叉编译工具时的/usr/arm-linux-gnueabi/include/g++/4.6.3/文件夹中,设置好头文件路径。
7、告诉Eclipse库函数(静态库和共享库)的路径,该路径为/usr/arm-linux-gnueabi/include/lib/
设置完成后点击OK,结束。
8、一个工程设置就结束了,接下来点击小锤子(编译),看看结果,如下图
显然,编译通过了,而且生成了二进制文件testc。
接下来点击RUN按钮,看看结果,如下图
点击RUN之后,控制台输出
make all
make: 没有什么可以做的为‘all’
然后一闪而过变成空白,同时也无法在终端下运行这个二进制文件,
原因很简单,生成的二进制文件不能再本PC机处理器的架构上运行,而只能在BBB板子上的cortex-A8的芯片中运行。
现在可以在Eclipse这个框架之下生成目标平台BBB上的可执行文件了,那么如何把文件便捷的传送过去,有几种方法可供选择。
第一种:在ubuntu的终端中sftp root@192.168.7.2(这是板子和PC机采用USB链接方式,如果板子接在路由器局域网中替换IP地址即可)远程登录系统通过get和put命令实现上传和下载,当然也可以使用命令scp -r pathname root@192.168.7.2:path,-r可以传送整个文件夹,不加则只能传送单个文件。sftp和scp,前者适用于文件、目录的管理,当然也可以进行单个文件的传送,后者不但可以传送文件,还可以传送目录。
第二种:在ubuntu中配置一个NFS,然后在目标板子上将这个NFS挂载到本地,实现目录共享。
强调一下为什么不能选择上面那个,因为如果选择dstore服务协议,那么后面Eclipse和BBB板子之间的文件传送会要求BBB板子的系统中有Daemon server在运行,否则即使配置好了也会出错,而且在配置过程中Eclipse也会告诉你“This configuration allows you to work with processes on local or remote systems using the DataStore protocol.”,也就是说,如果选择这种通信协议,我们还要再BBB板子上安装Daemon server,而为了安装这个服务,我们还要安装这个服务运行所需的JAVA环境,显然在一块开发板上安装这些东西完全是麻烦没有必要的。
在查看了Eclipse的官方的RSE User Guide(可能需要翻墙)http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.rse.doc.user%2Fgettingstarted%2Fg_start.html后,查看到内容如下
事实上,现在介绍的这种方式选择linux之后,后面每一步的选择都选择成ssh,意思就跟前面一开始选择ssh only那种烦方式等同了。
另外,。。。。。
下面进行远程运行的配置。
等上面的都设置好之后,点击Apply, 然后Run,效果如下图。记住针对这个工程的远程在线运行的配置名称为testc++Debug。
由此就实现了在Eclipse中,连接BBB板子,远程运行板子上的程序,并在Eclipse的console中看到运行结果!很方便,以后要再次远程运行时,点击RUN旁边的倒三角形,然后下拉列表中,选择这个工程的远程在线运行的配置名称testc++Debug即可。如下图
五、在线调试
远程调试使得程序运行在目标板上,而调试的操作以及结果显示都在本地的主机上,非常方便的功能。在BBB板子的系统里面已经安装有gdbserver,如果没有,则需要到ftp://ftp.gnu.org/gnu/gdb上下载gdb套件,用交叉编译工具编译好,在放在板子的/usr/bin/目录中。主机上安装sudo apt-get install gdb-multiarch,这个是远程调试的客户端,而且他可以配合多种体系结构的gdbserver,安装好之后一切就绪。
step1,首先开启目标板上的gdbserver服务,监听主机端口,
step2,点击界面中的那只绿色的小虫子旁边的倒三角形,下拉列表中选择Debug configrtion,如下图
step3,在弹出的界面中配置如下,
step4,配置端口号,
点击Debug,开始调试,效果如下图
以下为单步调试的效果。
Note:有时候,设置好单步调试之后,连接不成功,这个时候可能需要先远程在线运行一下,接着在来进行远程调试,其中原因可能是因为上一次操作有不适当步骤。另外,由于库的原因,gdb-multiarch调试之前还会输出一些警告信息,这个拷贝一下即可。