BeagleBone Black运行的linux中安装的gcc虽然可以编译程序。但是使用远程登陆的方式进行文本编辑毕竟不方便,而且嵌入式的arm处理器性能有限,编译简单的代码尚可,可如果代码稍微复杂就会非常的力不从心了。如果能够使用功能强大的计算机进行开发那就美滋滋了。
处理器的差异
一件很明显的事情,包括我所使用的BeagleBone Black在内的嵌入式开发板的处理器和我们工作学习所使用的PC差异巨大。众所周知,电脑采用Intel和AMD提供的x86架构处理器,采用CISC指令集(复杂指令集)。而我的BeagleBone Black开发板采用的是由TI(德州仪器)提供的ARM架构处理器,采用RISC指令集(精简指令集)。显然,两者的程序并不能公用。这样的问题不仅仅的存在于ARM处理器,同样存在于其他的未处理/控制器,包括8051系列单片机、avr系列单片机、pic系列单片机、msp430单片机、MIPS系列(包括龙芯)处理器等等等等。此处并不做过多的展开,主要阐明这种差异,更详细的内容可以自行了解。
也许到此处你会发现一个问题。就以最简单的51单片机为例,应用于计算机端的程序自然不能在它上面运行,但是我们的编程工作是在计算机上进行的。这就是说:51单片机虽然不能够直接运行计算机的程序,但是可以运行在计算机上编译的程序,那么BeagleBone Black是不是也可以呢?答案是肯定的。这就要用到交叉编译器。
交叉编译器
交叉编译器是在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码。
其实大凡做过单片机开发的一定是用过交叉编译工具链的,只是可能你自己并不知道。因为这些交叉编译工具链集成在了Keil、IAR、CCS们里面,你并没有切实的感受到他们的工作,另外值得注意的是这些商业商业的收费的集成开发环境集成的交叉编译环境大多也是不公开且不能单独使用的。除了这些商业化软件集成的交叉编译环境之外话有很多的单独提供的交叉编译工具链,包括开源的交叉编译工具链。
我选用的交叉编译工具链源自Linaro。Linaro提供的开源交叉编译工具链非常的丰富而且都在不断的更新:
arm-eabi是用于编译裸机程序的,当然也包括Bootloader;
arm-linux-gnueabihf适用于编译运行于嵌入式linux的程序。
arm-eabi
- arm:指的是arm内核的处理器;
- eabi:指的是嵌入式应用二进制接口(Embedded application binary interface)。
交叉编译工具链在windows上面运行的时候需要配合mingw32使用,可以直接下载gcc-linaro-7.4.1-2019.02-i686-mingw32_arm-eabi.tar.xz版本。
arm-linux-gnueabihf
-
arm:指的是arm内核的处理器;
-
linux:表示用于运行在linux上的程序的编译;
-
gnueabihf:The GNU C compiler for armhf architecture,hf表示使用hard硬件浮点模式。
交叉编译工具链在windows上面运行的时候需要配合mingw32使用,可以直接下载gcc-linaro-7.4.1-2019.02-i686-mingw32_arm-linux-gnueabihf.tar.xz版本。
交叉编译环境的安装与配置
将下载好的上述交叉编译工具软件包解压到自己想要安装的目录(最好不要有中文)。将解压后的bin目录添加到环境变量。打开命令行工具,输入指令:
arm-linux-gnueabihf-gcc -v
可以查看到打印结果:
至此,交叉编译环境安装完成。
交叉编译第一个程序
在计算机的一个文件夹中新建一个C++文件hello.cpp,并键入一个简单的程序。
#include <iostream>
int main(int argc, char const *argv[])
{
using namespace std;
cout << "HELLO BeagleBone Black\n";
return 0;
}
打开命令行工具,切换到文件目录。输入并运行
arm-linux-gnueabihf-g++ -o hello hello.cpp
查看刚刚的目录,发现多出了一个hello文件。将这个文件上传到BBBlack开发板,上传方式可以采用U盘或是FTP方式。上传后在超级终端打开上传的文件夹,运行程序(参考第二篇)。运行结果如图: