在ARM嵌入式开发环境中,我们大多数见到所使用的工具一般是ARM Development Studio, 或者Developer Suite 5等等付费的开发工具包,而对于我们在学习和工程环境中,有时候并不想购买昂贵的工具包,我们可以使用开源的工具链搭建一套开发环境,这就用不着购买昂贵的ARM官方的ADS、Keil等开发工具了。
我们可以从arm官网上去下载ARM Development Studio,安装起来并且申请一个30 天trial 的license使用,实际上对于熟悉Eclipse的人来说这个大可不必,我们可以找开源和免费的交叉编译工具链来自己打造类ARM Development Studio 的开发环境,虽然其在ARM上开发的完整程度可能达不到ARM Development Studio那么多的工具,比如Mali Debugger等,但是对于大部分使用C语言或者C++开发的部分,我们可以使用开源的工具链去完成。
1、下载Eclipse Embedded C/C++
本文就围绕着在ARM上开发裸板程序和ARM上的Linux程序来介绍一下开发工具以及搭建方法。
首先我们无论如何都需要的一个IDE,也就是ARM Development所使用的IDE——Eclipse IDE for Embedded C/C++ Developers,这个我们可以去Eclipse.org官网上去下载。
如果是在Linux下搭建就选Linux下载。
我们只要找好一个地方解压就可以了。
注:Eclipse 的运行李开不了JDK运行时,一般来说推荐使用OpenJDK作为运行时使用。OpenJDK 请自行选择版本安装,一般来说当前使用OpenJDK 11来作为Eclipse运行时较为稳定。
下载安装OpenJDK请到
https://adoptopenjdk.net/installation.html
或
https://www.azul.com/downloads/?package=jdk#download-openjdk 下载对应操作系统的版本
2、介绍交叉编译工具链
接下来介绍主要的交叉编译工具链的事情了。
首先我们要介绍一下交叉工具链了。
由于我所使用的是香橙派H616,在香橙派上我们使用命令
uname -a
看到如下返回
Linux orangepizero2-XellossMedia 4.9.170-sun50iw9 #25 SMP PREEMPT Fri Dec 4 12:46:25 CST 2020 aarch64 aarch64 aarch64 GNU/Linux
请注意,这里告诉我们CPU使用的是arm 64位CPU,这需要使用64位arm编译工具链去编译,默认情况下aarch64指令编译出来的程序只能在aarch64上跑。如果用32位的arm编译工具链来编译的程序(例如名称为“chipinfo”)跑,就会出现
-bash: ./chipinfo: No such file or directory
的错误。因此在对应的开发板上要提前使用uname -a 或者 uname -m或者uname -p确定一下使用哪种工具链。
另外还要注意工具链名称的区别。
我们不能用错了工具链。
在C语言开发的编译器工具链当中,我们首先遇到的是gcc,也就是x86_64或i686下的gcc,我们在PC的Linux系统当中安装的那个版本,就是gcc,它不是交叉编译的版本。何为交叉编译?交叉编译顾名思义,就是在一个指令集平台上编译另一个指令集的二进制可执行文件的过程,叫做交叉编译。当我们通过命令apt install gcc
安装的gcc,它是没有交叉编译功能的,意思就是说,我在x86平台上编译x86二进制程序文件,分发的目标主机仍然是x86的平台,或者我在arm平台上编译arm二进制可执行文件,分发的目标主机仍然是arm平台,这就不是交叉编译。当我要在x86平台编译arm/aarch64时,或者反过来我在arm上编译x86应用程序时,就叫做交叉编译。在嵌入式或者手机App开发过程中,都避免不了要和交叉编译工具打交道。
一般来说我们都是在基于x86或x86_64的Windows或者Linux操作系统的PC机上运行编译器。我们首先会选好构建主机架构(build arch)和目标主机架构(target arch),以及构建操作系统(build os)和目标操作系统(target os),这四个属性将是我们选择交叉编译工具链安装包最主要的四个属性。
交叉编译工具链可以由以下三个维度去划分:
按照编译构建的操作系统的维度分为:
- 1、基于Windows 运行时
- 2、基于Linux 运行时
按照编译构建的主机架构的维度分为:
- 1、
x86 (32bit) - 2、x86_64 (64bit)
- 3、
arm (32bit) - 4、aarch64 (64bit)
删除线的部分已经极少使用
由于苹果M1是全新aarch64架构,性能强劲
按照目标运行操作系统的维度分为:
- 1、裸机程序开发
- 2、基于Linux (GNU)
- 3、基于Android
- 4、基于Windows
- 5、
WinCE、QTopia、Meego
将不考虑目标运行系统为WinCE、QTopia、Meego等老旧或者已经废弃的嵌入式环境
按照目标主机架构的维度分为:
- 1、x86 (32bit)
- 2、x86_64 (64bit)
- 3、arm (32bit)
- 4、aarch64 (64bit)
我们不会去排列组合所有的指令集和操作系统的交叉编译工具链去一个一个构建编译工具链,只需要找到我们需要的构建主机架构和构建操作系统,以及常用的目标主机架构就可以了。
目前我们常用的操作系统无非WIndows和Linux,构建主机一般是超过4G内存的x86_64构建主机架构。由于Windows其兼容性我们也可以选择Windows i686/x86_64两种指令集。我们选用Linaro.org使用的mingw64/w32工具链来代表Windows平台的工具链。
- i686对应mingw32
- x86_64对应mingw64
目标主机一般是嵌入式Linux和裸板开发两种目标与运行环境。
android目标运行环境请参考android sdk + android studio。
因此我们一般存在如下交叉编译组合:
编译平台:mingw32/mingw64 目标平台:arm/aarch64-linux
编译平台:i686/x86_64-linux 目标平台:arm/aarch64-linux
编译平台:mingw32/mingw64 目标平台:arm/aarch64-none
编译平台:i686/x86_64-linux 目标平台:arm/aarch64-none
请注意arm-none或aarch64-none是在arm和aarch64平台上进行无操作系统开发,也就是我们所说的裸板开发。
arm/aarch64-linux | arm/aarch64-none | |
---|---|---|
mingw32/mingw64 | mingw32/mingw64 - arm/aarch64-linux | mingw32/mingw64 - arm/aarch64-none |
i686/x86_64-linux | i686/x86_64-linux - arm/aarch64-linux | i686/x86_64-linux - arm/aarch64-none |
按照这个表格去寻找我们需要的编译工具链即可。 |
我们所需要的是arm上的linux程序开发,因此需要从Linaro上去下载编译工具链:
我们从Linaro的release中找到gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu.tar.xz
符合我们的要求,我们下载回来并且解压:
tar -xvf gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu.tar.xz
3、sh, make最小构建工具
我们需要一个符合POSIX标准shell和make工具来让Eclipse能够运行gcc。
我们下载xPack并且解压。然后将xPack解压后的bin目录,例如我解压在
E:\Research\ARMToolchains\GNU Build Tools
目录中,我们将E:\Research\ARMToolchains\GNU Build Tools\bin
放到我们操作系统PATH
环境变量中,将该目录加入PATH环境变量可以确保我们的Eclipse在编译构建过程中防止出现找不到sh
以及找不到make
命令的问题。
接下来我们启动Eclipse,进行下一步设置。
4、Eclipse Embeded C/C++整合和搭建ARM开发板可以运行的Linux程序
启动Eclipse以后,我们需要先进行以下设置:
设置开发板ssh连接
打开Window->Preferences->Remote Development->Remote Connections,将远程服务从串口改为SSH,
这一步我们要添加一下开发板的SSH连接
如果已经在系统中创建了id_rsa和id_rsa.pub密钥对,可以通过公钥+公钥口令登录,否则可以使用密码登录
添加完成后我们在远程连接栏里面看到ssh添加了一个连接记录。
我们现在新建一个C语言项目,创建过程需要一点修改。
在下一步中我们选择Hello World ANSI C Project,右侧选择Cross GCC接下来Next到这一步,我们几乎在每次创建新项目时都会遇到,我们需要填一下所需要的交叉编译器工具的路径以及前缀,我们到我们交叉编译的目录下看一下
我们找到刚才解压的交叉编译工具链的bin目录:
我们的前缀就是前面蓝色框里每个文件前面这个共同的部分。
aarch64-linux-gnu-
注意:由于我所使用的开发板是Allwinner H616,基于Contex-A53的aarch64架构,因此我使用的是aarch64工具链,运行在gnu linux上,因此我使用的编译链前缀是aarch64-linux-gnu。不要忘记前缀后面还有一个“-”。
填入到刚才那个窗口中,并且将我们解压的交叉工具链所在的bin目录的路径填到Cross compiler path中。
Finish后,我们的一个交叉编译项目就创建好了。
创建完成后,Eclipse会报告这么一个错误,我们可以放心大胆地直接无视掉这个错误。右键删除即可。
接下来我们要对项目进行构建构建完成后我们可以看到make的gcc编译过程日志,没报错并且成功构建了目标。在项目的目录下我们看到了一个新的节点叫Binaries
这个节点下方我们就可以找到可执行二进制程序了。我们现在想要发送到开发板上去运行。发送的SSH连接地址在我们一开始就已经加入Eclipse的配置当中了,我们接下来只需要添加个运行配置。
3、配置运行到开发板上
我们首先需要创建一个C/C++ Remote Application运行配置,将运行连接从Local改为我们之前配置的目标SSH连接,首先我们先打开运行配置:
我们选择远程连接为之前配置的远程连接
如果Run按钮为灰色,是因为C/C++ Application没有指定,在Search Project中选择二进制文件
选择好远程连接后还要选择远程执行文件的路径。这个路径会打开ssh连接到开发板,并且指定一个远程目录,运行时将自动传送这个文件到开发板指定的目录中。
运行前执行命令,如果没有的话一般可以留空
当选择好路径后会如下图所示,这时候就可以点击Run,此时会自动将编译好的二进制可执行文件上传到ssh并运行。
接下来运行程序结果
运行成功~!
参考来源: