Linux下搭建树莓派交叉编译环境
本学期选了嵌入式开发课程,所以第一步就是要准备环境。硬件环境自不必说,购买了树莓派二代、sd卡,读卡器、路由器、网线这些都是以前就有的。软件环境的搭建包括如下几步:
1.搭建虚拟机Linux环境
2.烧录树莓派系统
3.在虚拟机Linux环境中搭建本地开发与编译环境
4.在虚拟机Linux上搭建交叉编译环境
5.开发一段简单的程序,通过本地编译后,再进行交叉编译。之后将编译好的程序放到树莓派上执行进行测试。
具体步骤:
1.搭建虚拟机Linux
理论上说,在windows环境下如果也能找到满足要求的交叉编译工具链,那么也可以不装Linux。但是考虑到windows环境下的工具比较难找,而且嵌入式系统本身也是基于Linux的特定版本,进行交叉编译时在兼容性上更不容易出现问题,所以还是需要先安装一个Linux环境。我采用的是virtualbox虚拟机软件。virtualbox是一个轻量级的虚拟机软件,安装起来比较方便,使用中也还算稳定。安装过程很简单,此处略过。在virtualbox中加载Ubuntu安装镜像文件*.iso,启动后安装,过程略。
2.烧录树莓派的映像文件,使之可以正常启动。
根据手册的说明,需要将从树莓派官网下载的系统映像文件raspbian-jessie.img 烧录到sd卡上,以使树莓派可以正常使用。在这里我开始犯了一个错误。想到烧录文件,习惯性的采用了windows下的常用软件ultraiso,烧录完成后插到树莓派上加电。没有任何输出,让我一度不知道哪里出错。后来严格按照手册里说的Linux命令:sudo dd if=raspbian-jessie.img of=/dev/sdb bs=2M 进行烧录,系统可以正常启动了。
分析:ultraiso属于文件刻录的性质,但其并不改变卡/磁盘的分区结构。所以刻录完的sd卡分区格式不符合要求。而dd命令属于块数据输出,在烧录数据的同时也变更了sd卡的分区格式。
此外,此步骤还发生了一点意外。开始我烧录了一个不带桌面的精简版系统。当使用sudo apt-get install lxde命令添加桌面时,报空间不足,无法安装。于是重新烧录标准版,但启动到一半时系统中断死机。在想不出理由的情况下,使用sudo fdisk删除sd卡上所有分区,重新烧录,终于成功了。
系统启动后,需要考虑的是主机与目标机的连接问题。树莓派系统默认是开着ssh服务的。所以当用网线连接到路由器,并获得ip后,用命令ssh [email protected]是可以连接目标机的。但考虑到有图形界面还是要更方便一些。于是安装vnc服务,方法是命令:sudo apt-get install tightvncserver ,之后执行tightvncserver即开启了vnc远程桌面服务。此时用vnc客户端工具即可进行可视化操作。
3.在Linux下搭建本地开发环境
通常Linux的大多数发行版默认包含gcc等工具,但为了方便,我们也可以安装eclipse的Linux版本。使用此类IDE工具可以提高开发效率。
方法是,在Linux下执行 sudo apt-get install eclipse
安装完成后可以看到eclipse的启动图标。正常情况下可以顺利启动eclipse。此时的eclipse默认是java开发环境,为了开发c程序,我们还需要增加一些插件。方法是:在eclipse的help-install new software菜单中指定网址:http://download.eclipse.org/releases/indigo ,选择collaboration-Mylyn Context Connector: c/c++ Development,这样就把开发c/c++项目的插件安装上了。之后还需要执行一下sudo apt-get install build-essential,把编译环境需要用到的文件装上。就完成了本地开发环境的搭建。
正常启动eclipse后,可以在new 菜单中看到c/c++项目,如下图
4.搭建交叉编译环境
通常网上已有经过验证的交叉编译工具链,需要下载下来即可。首先安装git工具:sudo apt-get install git,之后下载:git clone git://github.com/raspberrypi/tools.git
等待下载完成,即可看到包含了若干种类的编译工具。我的Linux是64位版本,所以使用gcc-linaro-arm-Linux-gnueabihf-raspbian-x64/bin/arm-Linux-gnueabihf-gcc即可。
加入环境变量,编辑.bashrc文件,在末尾加入export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-Linux-gnueabihf-raspbian-x64/bin
实验例子,写一段c代码
本地执行成功,之后进行交叉编译:
arm-Linux-gnueabihf-gcc tst.c –o tst 生成tst执行文件,传输到目标平台:
sftp [email protected] 连接后,用put /home/xx/workspace/rr/tst /home/pi/tst
执行成功
5.直接使用eclipse进行目标平台编译
使用手工方式(写c代码、写makefile文件、手工编译等)还是比较繁琐的,另外也容易出错。既然集成开发环境可以编译本地代码,自然也可以进行交叉编译。于是经过一番探索,完成了这个步骤。
首先在项目属性的c/c++ Build的Settings菜单中,点Manage Configurations,增加一项新配置(我这里起名ARM)并激活,修改GCC C Compiler和GCC C Linker中的命令,采用前面提到过的arm-Linux-gnueabihf-gcc。注意此处用了绝对路径,因为之前加环境变量PATH是加到了bash.rc中,如果加到.profile中就不用这么麻烦了。
之后,Project-Build All,成功。