在完成对ubuntu的基本操作和指令的学习后,我们下面正式的进入有关于我们stm32/ARM单片机的软件安装过程。首先我们就要介绍这个会贯穿我们整个开发过程中的软件gcc-arm-none-eabi。
最直接的当我说出这个软件的时候,大部分童鞋可能会奇怪他到底是个什么呢?首先他是个软件这就不用多说了,做什么的软件呢?编译软件,或是准确点叫工具链。那么听起来是不是和keil、IAR感觉一样呢?我们是不是安装好他以后,打开获得一个界面导入代码就可以编译hex文件呢?答案是否定的。
又我们国内Keil+IAR环境教育出来的童靴们,很少会理解IDE其本质的含义。也许查询百度,他会告诉你IDE是集成开发环境,那么KEIL、IAR这样的IDE(集成开发环境)集成了什么功能呢?首先我们来看看他们的功能:
文本编辑器
编辑源代码文件,提供基础的文本编辑功能与语法加亮等功能。
编译器
编译与链接文件,使源代码文档可以转化为在单片机上执行的机器码格式文件。
调试器
连接单片机调试器硬件(如:jlink、ST-link等)实现单步执行、寄存器提取、资源监测等调试功能。
我们可以看到的是,在商业化的软件如KEIL之流,他们把很完善的功能都集成在了一个带有界面的程序中,所以叫他们IDE即集成开发环境,固然这样很方便,对于很多新手或刚入职的工程师来说,这样的软件极大的简化了他们距离实际编写程序的距离。但缺点也显而易见:它阻碍了童鞋们对编译器以及编译过程的理解,也在集成化的过程中缺少了很多可选择的高级功能。
经过上面的介绍我想大家已经理解了一个集成开发环境的构成,而我们所讲的gcc-arm-none-eabi就是其中的编译器的功能,更专业的,在嵌入式开发中我们一般将它叫做工具链。(工具链:一般由编译器、连接器、解释器和调试器组成)关于它的调试功能这个比较复杂,我们之后慢慢来讲。
在我们这个系列的第一篇STM32高级开发(1)-开源是什么的文章中我们就介绍了,gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器。那么说了这么多介绍,它都包含什么具体功能又怎么安装与使用呢,我们继续。
首先打开gcc-arm-none-eabi项目的官网:
https://launchpad.net/gcc-arm-embedded/+download
在写这篇文章时它的软件版本已更新到了5_4-2016q3 。我们直接点击下面Linux版进行下载。在下载的过程中建议大家去网站的首页看看,随便逛逛了解一下gcc-arm-none-eabi。
在下载完成我们在用户目录下,并新建一个文件夹名叫:
Library,其实叫什么名字都行,只是以后我们所有的库和工具都会放在这里,所以就起名叫这个了,然后把下载好的压缩包放入Library文件夹中,并解压(右键压缩包选择解压到此处)。然后我们就可以删除压缩包了,或者放个地方存着以防以后还要用。
随后双击解压后的文件进入 gcc-arm-none-eabi-5_4-2016q3 -> bin
这个文件夹中的便是软件的执行文件了,不过他们都是通过指令行调用的,但是在终端调用之前,我们需要把软件的路径置于系统的环境变量之下,这样系统才能过直接调用程序,否则我们每次执行都需要输入长长的路径系统才能够找到软件。
打开终端输入:
$ sudo gedit /etc/profile
修改这个文件来添加我们的路径,ubuntu的环境变量文件有好多个,他们都在不同的时候起作用,具体的讲解可以看看这篇文章:Ubuntu系统环境变量详解,里面把这个问题讲的很清楚了,这个文章中列举的文件后几个也许你在自己的系统中找不到,但那只是系统没有创建设定,如果新建一个同样名称的文件他们依然是会起作用的。
再打开profile文件后我们在其末尾添加:
export PATH=$PATH:/home/yangliu/Library/gcc-arm-none-eabi-5_4-2016q3/bin
此处export意为设置变量,”PATH”是一个系统默认的内置变量即系统路径。”$PATH”,意为取值PATH变量。“:”代表拼接,用它来分割多个路径。后面的即为我们编译器执行文件的路径,这个根据大家自己的路径设置,可以随便点开一个执行文件查看他的路径复制粘贴即可。此处这行设置意为:将后面的路径与PATH之前的值合并,并更新给PATH,即将一段路径添加入PATH路径内。
随后点击保存。在终端中输入指令更新系统路径。
$ source /etc/profile
或,注意下面这个指令“.”后有空格,其效果与source 指令相同。
$ . /etc/profile
为了查看我们是否已经成功设置路径,在终端中输入:
$ arm-non
点击Tab看看系统是否自动补全为:arm-none-eabi-
$ arm-none-eabi-
如果补全了,那么说明我们已经设置成功了,我们此时可以直接键入指令来调用工具链的程序。如果没有,说明你上面的环境变量设置步骤有误请重新检查自己的操作。
同时如果你安装的是64位的ubuntu版本,则需要安装lsb-core才能正常使用这个工具链,使用指令:
$ sudo apt-get install lsb-core
随后我们输入指令,来再次欣赏一下自己的成果,这个条指令意为显示工具链的版本。(是不是很长,记得我们的小技巧吗?只要输入”arm-”再按Tab就能补全指令啦,是不是很方便?)
$ arm-none-eabi-gcc -v
之后重启一下,让系统更新全局环境变量。
注意以上操作,从source 开始请使用一个终端,不要关闭,否则可能出错:无法找到工具链。实际按理说source指令和重启的效果是一样的,但在我安装的过程中却出错了,重启之后才变正常了。
还有个检查的方法就是,使用指令查看当前系统PATH变量的值,查看是否PATH中是否有刚刚设置的路径:
$ echo $PATH
实际上Ubuntu的软件源中是有gcc-arm-none-eabi的,可以使用sudo apt-get install gcc-arm-none-eabi来安装,但是由于其版本一般落后于官方release 的版本故没有采用这个方式安装。
在我们安装好gcc-arm-none-eabi后,我们可以在终端中输入指令来调用gcc-arm-none-eabi的功能了,那么这个工具链下茫茫多的执行软件都是做什么的呢,可以看到在路径下一共有28个工具。接下来我们就来介绍一下我们将会用到的工具和他的功能及使用方式。
arm-none-eabi-gcc
这个工具为c语言编译器,可以将.c文件转化为.o的执行文件。如果大家不明白,.o是什么作用,建议大家去看一些关于编译过程和原理的介绍,如这篇文章:C语言的编译过程。
它的使用方法是,在终端中cd到工作目录,如编译当前目录下的hello.c文件,生成hello.o文件:
arm-none-eabi-gcc -c hello.c
arm-none-eabi-g++
这个工具为c++语言编译器,可以将.cpp文件转化为.o的执行文件,使用方式如上。
arm-none-eabi-ld
这个工具为链接器即最后链接所有.o文件生成可执行文件的工具。一般我们不使用 arm-none-eabi-ld 的指令调用它,而是通过使用arm-none-eabi-gcc 来调用,因为前者对c/cpp文件混合型生成的.o文件们的支持性不好,所以官方的说明书中也推荐使用arm-none-eabi-gcc 指令来代替arm-none-eabi-ld,如下:
arm-none-eabi-gcc -o hello hello.o
arm-none-eabi-objcopy
此工具将链接器生成的文件转化为bin/hex等烧写的格式,用以下载进入单片机。如下:
arm-none-eabi-objcopy hello hello.bin
arm-none-eabi-gdb
工具链中的调试器,将它连接到调试器硬件产生的网络端口,就可以进行硬件和代码的调试了。GDB是gnu下一个独特的调试软件,它具有很多自己的特性,也许大家无法想象使用命令行调试的景象,但是之后我们会看到它的强大。
当然这一系列的指令只是一个简单且包含用法错误的例子,实际的使用中我们要输入很多设置参数,才能适配我们的单片机,所以这个样例只是为了让大家理解工具链的调用方式,在我们之后的工程编写中会为大家介绍他们详细的用法。
至此,我们的工具链便介绍完成了,大家目前可能会有些疑问,难道编译过程就那么多命令行一个一个输入吗?一个一个文件手动编译?GDB又要怎么通过计算机网络端口连接到调试器呢?我们请看下一篇的讲解:STM32高级开发(6)-make与调试器驱动。