搭建嵌入式开源开发环境

前言

因为参加合泰杯的项目以及个人学习需要,我需要在Linux远端服务器中搭建一个HT32F52352的编译环境,但是网上关于合泰的芯片资料太少了,而且官网并没有直接提供在Linux环境下开发的交叉工具链,但是苦于没有了解过这方面的知识不知道如何下手,在网上找到一些资料但是一些内容并不是非常适合,需要做出一些修改。出于记录学习同时支持开源的目的,写文在此进行介绍。本文参考了正点原子的《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5》和Foresights大佬的《STM32高级开发(5)-gcc-arm-none-eabi》这篇博客,介绍了初学者常见的Cortex-M系列单片机在远端服务器上开发的目的介绍其环境搭建的步骤(非远端环境也可以使用,而且基于相同理论也可以在Windows平台下以开源工具搭建嵌入式开发环境)。

本文基于Ubuntu虚拟机环境进行演示,如果要在Windows平台下实现,只需要把针对Linux环境下的软件版本换成Windows,同时配置环境变量方式换成Windows的方式即可,如果针对服务器环境只需要把一些操作换成远端操作就行了。

如果你从未在Linux环境下工作过,请注意我在代码框中写的注释!!这篇文章的内容非常繁琐,可能会花费很长的时间,而一些步骤不应该在中途中断,如果不知道哪里可以中断请至少在完成当前的二级目录内容后再结束。本文最高的目录等级为二级目录。

开启通讯服务

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。

此服务配置的目的是为了方便主机和服务器之间的文件交换,如果不需要在远端环境实现可以不用配置此步骤,因为在VirtualBox中若安装了VirtualBox的增强插件是可以实现拖动传输文件的(不过有时候会抽风,为了方便舒适还是建议使用上),如果在Windows主系统上使用可以跳过此步骤,如果在服务器上一般已经安装过了,只需要稍微确认一下就好。

打开Linux终端

打开Linux虚拟机后按住Ctrl+Alt+T打开终端,我们在这里输入Shell命令。

检查vsftpd软件

vsftpd软件是Linux环境下非常优秀的一款FTP软件,我们在Linux环境下就使用这个软件进行FTP服务。

在终端中输入指令查看vsftpd是否安装:

vsftpd -v

如果有输出软件版本则表明已经安装vsftpd,否则用如下指令进行安装:

sudo apt install vsftpd

安装完成后再次输入查看指令即可确定FTP是否安装成功,成功后效果如下:

在这里插入图片描述

修改vsftpg配置文件

使用如下指令对vsftpg进行修改,为了方便小白读者图片展示以记事本展示。

# 如果你会使用vim
sudo vim /etc/vsftpd.conf
# 不会使用vim则使用记事本进行编辑
sudo gedit /etc/vsftpd.conf

如果没有意外的话,第31行的write_enable=YES在最前面应该有一个#,表示其被注释掉了,我们把#删掉,同时查看local_enable=YES是否有被注释,如果有也删掉#,最终结果如下。

在这里插入图片描述

保存后关闭界面,并输入如下指令重启FTP服务:

sudo /etc/init.d/vsftpd restart

确认网络连接

如果要实现FTP连接那么至少需要两台计算机(也可以说是你的主机和虚拟机)的网络能够正常通信,我们可以使用ping工具来确认。首先在Linux中输入:

ifconfig

然后下面会显示你的网络信息,找到你的IP地址,看不懂最好百度一下,因为不同版本的显示内容可能不一样。在知道Linux虚拟机的IP地址后,回到Windows环境下,点击Win+R快捷打开cmd进入控制台.

输入:

ping [上述IPv4地址]

一般情况下会发生四次请求超时,这种情况下需要对VirtualBox进行配置(一般情况下只要成功了一次就算是可以通信的,而且如果一次通信成功后再次去ping一般就可以非常顺利地ping通了,如果能顺利ping通则可以跳过此部分)。

我们回到Linux虚拟机中,在终端输入如下指令关机:

poweroff

回到VirtualBox主界面,然后点击你的虚拟机,选择设置-网络。如果不出意外的话你的网卡1的连接方式为网络地址转换(NAT)模式,这种模式下虚拟机可以访问宿主机但是宿主机不能访问虚拟机,具体可以参考这篇博客《VirtualBox虚拟机几种网络连接方式介绍》,我们需要对其进行修改,不过考虑到VirtualBox可以设置多个网卡,所以我就没有改这一个,直接新增一个网卡2,将其连接方式设置为桥接网卡,其它配置不变,然后点击OK保存。

在这里插入图片描述

然后我们再次启动虚拟机并检测ip,可以发现你多了一个新网卡,我们再次用这个网卡进行ping测试,可以发现可以ping通了。

配置静态ip

虽然我们用新网卡实现了两机互联,但是虚拟机此时为自动ip状态,每次打开虚拟机时IP地址都可能发生改变,我们需要防止这一情况的发生,所以需要配置静态IP,配置方法可以有通过文件配置和通过桌面端配置,为了方便我们就使用桌面端配置了,使用文件配置可以参考这个博客《Ubuntu20.04配置静态ip》,配置内容参考我在桌面端图形界面配置的方法(如果是其它版本的Linux请自行百度)。

点击屏幕右上角,选择任意网卡进入配置界面。

在这里插入图片描述

选择新增的第二个网卡,点击其后方的齿轮进入设置,然后配置IPv4,将其连接方式设置为手动,并填写地址、子网掩码、网关信息(这些信息在前面的详细信息都有,直接照抄过来,其实就等价于把本次自动连接生成的IP信息手动保存下来未来一直使用),至于DNS可以不用管,最后点击应用保存即可。

在这里插入图片描述

配置完成后最好再ping一次确保万无一失。

你可能还想尝试在虚拟机中ping通宿主机,但是会发现无法ping通,这是因为Windows自带了防火墙阻止了它,实在强迫症想ping一下关闭公共防火墙即可,不过并没有太大必要。

宿主机上安装FTP软件

事实上Windows自带了FTP可以直接使用,不过操作很麻烦还有界面有点丑,我们选用正点原子推荐的FileZilla软件,当然其它软件也是可以的,重点是要用FTP功能即可。

进入FileZilla中文官网选择下载-客户端,选择Windows平台并根据你的系统选择版本,安装版和绿色版的区别在于绿色版是zip直接解压使用的,比较好清理,但是这将是个常用软件,直接下载安装版就行了。

一路安装后,点击安装好的filezilla.exe运行,即进入软件界面。

在这里插入图片描述

点击顶部的文件-站点管理器,进入站点管理器界面。

在这里插入图片描述

在站点管理器中点击左侧我的站点,然后下方新建站点,修改站点名字(任意),在右方常规选项中,选择协议为FTP,并输入主机地址(即第二网卡的IP地址),登录类型为正常,用户和密码就是你自己的账户名和密码,其它不变即可。然后再字符集选项中勾选强制UTF-8,因为一般中文Windows的默认编码是GBK,而Linux中一般默认编码是UTF-8,强制UTF-8不会出现乱码(一般情况是这样,如果你修改了这个还出现乱码可以尝试再换回来或者选择自定义字符集)。

在这里插入图片描述

在这里插入图片描述

一切完成后就可以点击连接了,如果连接成功则可以看到右边远程站点有你Linux系统的文件了,可以尝试把虚拟机和宿主机的文件相互拖动到对方文件夹下,可以实现文件的复制传输。

完成NFS和SSH服务的配置

使用NFS服务可以把服务器的共享目录挂载到本地端的文件系统中,在本地端系统中使用远程服务器可以像普通磁盘分区一样,非常便利,正点原子的指南中解释这是为了后期开发Linux驱动所进行的配置,根据这个百度上也就是前面对NFS的定义这个东西存在的目的应该为了让开发板直接连接到服务器?感觉如果要进行嵌入式Linux开发可以配置这一部分,如果不用的话应该也无所谓,不过因为我也不是很懂,如果你们在同样不明白的情况下建议还是配置上。至于Windows环境下搭建的话,感觉应该不需要这个东西,网上我也没看到类似嵌入式Windows下挂在NFS的例子。

至于SSH则是现在电脑连接服务器终端的一种非常常用的方法了,如果是在虚拟机上进行也可以不配置也能用,毕竟都可以直接操作桌面平台了,但是如果出于学习目的那还是配置上。

通过如下命令安装NFS服务:

sudo apt install nfs-kernel-server rpcbind

完成后在用户根目录下新建文件夹linux用于存放未来工程内容,并在linux文件夹中新建nfs文件夹用于NFS服务:

mkdir -p ~/linux/nfs	
# 这里地址其实可以改,改了后后面的配置文件也相应修改即可,这里-p的作用是递归新建

然后配置nfs的配置文件

# 如果会用vim
sudo vi /etc/exports
# 如果不会用vim
sudo gedit /etc/exports

在最后添加内容:

/home/[账户名]/[刚才新建的linux文件夹相对于账户的地址]/nfs *(rw,sync,no_root_squash)

完成以上配置后保存,然后重启NFS服务:

sudo /etc/init.d/nfs-kernel-server restart

然后配置SSH:

sudo apt install openssh-server

直接安装即可,ssh配置文件在/etc/ssh/sshd_config中,不过使用默认配置即可。

安装交叉工具链

好了,现在我们才算正式进入正题,实现上面所有步骤的原因仅在于我们需要一个良好的通信让我们在Windows下写的代码能传输到服务器,但是仅仅传输到服务器显然不够,要让它真正变成能够运行的程序还需要通过交叉工具链将代码编译成机器码。

平时我们在电脑上编程的时候,可以实现一机编程、编译、调试、运行,通常我们使用IDE进行实现。比如说C语言编程的时候我们通常使用CodeBlocks或VisualStudio这种IDE环境,而Java编程的时候使用Eclipse、IDEA这些IDE。但是在这些IDE出现前他们是怎么编译的呢?学过Java的朋友可能知道,我们用javac命令在命令行中编译Java程序,然后用Java命令去运行它。而如果使用过GCC的朋友应该也知道我们可以通过调用gcc -o main main.c这类的指令去编译程序,甚至使用makefile实现更加高级复杂的编译过程。gcc指令和Java中的javac指令其实就是通过命令行去调用了一个编译程序,但是很显然我们不会在本身就很缺少rom和ram的单片机中安装运行除了使用除了我们所需功能外的其它程序,这时候我们就需要使用交叉工具链了。简单来说它就是在有充足资源的设备中提供了一个代编译环境,为资源不足的设备编译他们所需要的程序,然后代理机(安装了交叉编译工具链的设备)通过通讯设备将程序传输(也就是烧录)到被代理机中(一般就是嵌入式设备中)。一般交叉工具链也被称为交叉编译器,但是交叉编译器其实只是交叉工具链的一个部分,不过为了方便,在一般情况下若没有特指则可以互相代称。

虽然交叉工具链的核心定义在于其交叉,即在一个设备中编译、链接另一个设备的程序,但是一般情况下,交叉工具链都专指嵌入式编程中所需的工具链。上面部分如果不是很懂的话可以看一下这两个文章:《c语言程序的编译过程》《【编译原理】交叉工具链详解》,如果想更加深入一点可以看这个博客《交叉编译详解》

以下内容为找到交叉工具链的过程,可以跳过,直接到达下载页面,不过还是建议按照这个步骤走一遍,以免未来网址发生改变。这个步骤也可能发生改变,但是仍然可以作为参考存在。

因为我需要针对HT32F52352这个Cortex-M0架构的单片机进行编程,所以我们需要找到一个针对这个系列单片机的编译器,通过搜索我们找到arm开发者网(我直译的名字),找到它的Open Source Software(直译为开源软件),找到它的GNU Toolchain(就是GNU工具链的意思),有两个选项,中间有介绍,我们的芯片是Cortex-M0,所以选Arm GNU embedded toolchain(ARM GNU嵌入式工具链)。

在这里插入图片描述

新界面里面写了该工具链支持的内核型号,我们选择Downloads进入下载页面

在这里插入图片描述

根据你的服务器芯片和系统选择对应的软件,我选择的这个x86-64 linux的,一般选择一个major版本下载即可,如果你在Windows平台下安装则直接下载Windows的。

在这里插入图片描述

下载结束后我们会得到一个后缀为.tar.bz2的压缩包,如果是Windows下可以选择下载exe安装版,然后我们登录FTP,把这个文件发到虚拟机(服务器)上,建议选用一个专门的文件夹,参考《STM32高级开发(5)-gcc-arm-none-eabi》这个博客的方法,我在我的用户文件夹下新建了一个library文件夹,然后传过去,不过与他不同的是我们的library只是一个中转站。

在这里插入图片描述

根据正点原子的指南,我们再创建一个arm文件夹再/usr/local/arm下:

sudo mkdir /usr/local/arm

然后将压缩包拷贝进去:

sudo cp ~/library/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2  /usr/local/arm/

去到arm文件夹:

cd /usr/local/arm

通过如下指令解压压缩包:

tar jxvf FileName.tar.bz2

输入文件名的时候可以用tab快捷填充比较方便。

在这里插入图片描述

这时候arm文件夹多了一个文件夹,我们用ls命令可以查看:

在这里插入图片描述

文件夹就是这个蓝色的部分,我们用鼠标把它框选然后复制,接着输入指令:

sudo gedit /etc/profile

如果你的vim经过调试可以连接外部剪贴板也可以用vim,详情可以参考我之前的博客《如何在vim中使用系统剪贴板》,然后我们在最后空几行(空几行无所谓,主要是好看),输入以下内容:

export PATH=$PATH:/usr/local/arm/gcc-arm-none-eabi-10-2020-q4-major/bin

下面是我写的内容,其中橘色框选的部分就是我们刚才复制的文件夹名。

在这里插入图片描述

保存后关闭,然后输入以下指令更新系统路径:

source /etc/profile

输入上面指令后我们的界面颜色可能发生变化,不过不用担心,也不要乱动,仍然按照我的后面步骤来。我后面的截图都是在我安装了之后截图的,所以系统颜色可能与你有所不同,不过并不影响命令执行。

然后我们安装一下其他库,输入指令:

sudo apt install lsb-core lib32stdc++6

上述其实安装了两个软件,是根据正点原子的方案来的,而另一个博客方案则只安装了lsb-core而没有安装后面的lib32stdc++6,猜测后面这个应该和Linux驱动开发有关,因为里面带了个c++,可能是C++的库。

然后我们验证一下我们的安装配置是否成功,输入指令:

arm-	# 不要点回车

然后点击tab,看看是否自动补全为:arm-none-eabi-。

在这里插入图片描述

我们再点两下tab可以看到后面还可以填些什么。

在这里插入图片描述

通过不同的结尾可以调用不同的功能,不过我们最常用的还是arm-none-eabi-gcc,所以我们查看一下它的版本,输入:

arm-none-eabi-gcc -v

在这里插入图片描述

最下面写了当前的版本号,如果是和其他人合作请使用相同的版本最好,不过如果是用的服务器那就没啥影响了,反正都是公用的。

然后我们通过以下指令重启电脑:

reboot

然后重启后,我们输入下述指令查看一下我们的PATH配置好没:

echo $PATH

如果能看到我们在arm文件夹下那个path就没问题。

如果你用的Windows,上述步骤应该没啥用,直接把exe文件安装好即可,不过具体我也不确定会不会有其它问题,如果遇到问题百度就行,可以参考一下这个博客:《基于GNU ARM Eclipse的集成环境搭建》

然后我们确定一下你是否安装了make工具,输入以下指令:

make -v

在这里插入图片描述

理论上这是默认安装的,如果没有安装,则输入以下指令安装:

sudo apt install make

安装编辑器

编辑器可以是任意的编辑器都可,一般情况我们在Windows下编程然后发送到服务器去编译,一般现代比较常用的编辑器有Atom、VSCode等,不过我比较推荐VSCode(全称Visual Studio Code,不过我们一般用缩写),非常好用。

关于VSCode的安装就直接百度然后安装就好了,实在担心可以百度安装教程,另外如果你需要的话可以在虚拟机中安装一个VSCode,毕竟用gedit太丑了而用vim又太麻烦,不过如果你想要完全按照服务器的方法来,可以不安装。

然后我们需要安装几个插件,直接参考正点原子的方案好了:

在这里插入图片描述

在这里插入图片描述

不过里面的主题我推荐Atom One Light Theme,默认豆沙绿色护眼屏幕,另外还可以自己配置自己喜欢的主题。

完成上述安装后我们可能在右下角中发现一直有三个报错:

在这里插入图片描述

这是那个Advanced Lint的支持文件,需要安装几个软件,我们可以把它关闭,首先去插件栏中找到Advanced Lint插件,点击那个齿轮,然后选择扩展设置:

在这里插入图片描述

然后找到报错的那几个东西,把他们在Enable的勾选中取消勾即可,以Clang举例,另外因为版本更新后面可能会出现更多类似报错,全部勾掉就行:

在这里插入图片描述

不过按照正点原子的意思那个CppCheck可能有点用,我们把它留下来,然后安装一下软件,可以再次点击插件图标,然后在介绍页面有CppCheck地址,我在这里列出来,如果未来发生改变了请以插件介绍为准“CppCheck下载地址”,建议用迅雷下比较快:

选择好安装地址,然后其它全部默认设置即可,一路安装,然后把安装目录添加到环境变量Path中即可,不知道的可以百度环境变量配置,或者参考Java配置应该可以懂,其它报错也可以用这种方式来改正,不过需要注意的是其中flexelint好像是收费的,可以不安装。

完成以上工作后重启VSCode就可以看到报错消失了。

安装串口终端

正点原子推荐的软件有SecureCRT、Putty和MobaXterm,都拥有SSH和串口的功能,但是其中SecureCRT虽然功能强大,但是本文的目的就是为了支持正版和开源,最终在后两个软件中确定了MobaXterm,可以参考这个博客《MobaXterm的是有用方法—集串口,SSH远程登录和FTP传输三合一工具》了解一下这个软件,还有这篇文章《全能终端神器——MobaXterm》对它的详细介绍。

然后,我们百度MobaXterm找到它的官网,进入下载页面下载免费版即可,因为这个感觉可能会很常用,我直接下载的安装版,当然也可以下载绿色免安装版本,总之就是缺个安装步骤。

直接安装,没有什么奇怪的选项,然后我们就获得了MobaXterm软件,至于MobaXterm的详细用法可以直接参考上面的两个文章即可。

安装OpenOCD

现在我们已经基本上可以完成线上编程、编译、文件传输了,但是还有一个东西非常重要,那就是烧录程序了,这个时候我们需要用到OpenOCD,这是一个开源项目,由Dominic Rath在大学期间(2005年)发起的项目(人家的大学生活),旨在提供嵌入式设备的调试、系统编程、边界扫描功能。它的作用说简单点就是驱动我们平常使用的JTAG仿真器,可能有人买过ST-Link、JLink之类的仿真器,但是市面上卖的那些几十块钱的一般都是盗版的,而正版的特别贵。如果使用OpenOCD的话则不会有这个问题了,基于OpenOCD项目ARM官方推出了DAPLink这款开源仿真器,作用和ST-Link、JLink差不多,但是功能还更加丰富且可定制,并且价格便宜(可以自己做)还不用买盗版。

因为我们烧录是在Windows下进行的所以直接下载Windows版本的就行,关于OpenOCD的安装可以直接百度OpenOCD进入官网下载页,然后随便下载一个,下载后它的格式为.7z的压缩包。将其解压到一个文件夹,然后进入其中。注意,路径请保证全英文,否则会出现一些意想不到的错误。

按住Shift+鼠标右键,右键弹出窗中选择用Powershell打开。

在这里插入图片描述

在Powershell界面输入指令:

.\bin\openocd --help

在这里插入图片描述

如果能出来这个界面,就说明你的系统安装好了,剩下的步骤就和你的芯片、仿真器型号有关了,请根据自己所需自行搜索。因为OpenOCD里暂时没有直接对应合泰的芯片而且他们给了烧录器,再加上我暂时还没搞懂这个OpenOCD的原理,所以就不做演示了,如果使用STM32的芯片可以参考这个博客:《基于OpenOCD 的 STM32CubeIDE 开发烧录调试环境搭建 DAPLINK/STLINK》

测试一下

现在我们可以测试一下你上面的环境配置好了没,重要的是其中的编译环境,其它的也不是很重要,因为其实只要你能想办法把工程搞到你的装了编译环境的系统里,那么效果都是相同的。

我们使用了Foresights大佬在GitHub上的工程,首先你需要新建一个工程文件夹,以后你所有工程都放在那,使用mkdir指令即可。

我们用cd指令进入这个工程文件夹,然后使用如下指令确认安装了git:

git --version

如果发现没有安装git就使用如下命令进行安装:

sudo apt install git

如果安装了就使用如下指令将GitHub的工程克隆过来:

 git clone https://github.com/zhengyangliu/simple-gcc-stm32-project.git

然后进入该工程文件夹,并查看文件夹里面的东西有些啥:

ls

我们发现其中有makefile,那么说明这个文件可以直接编译,使用make指令即可

make

你会发现弹出很多东西,这说明我们的工程被编译了,再次ls一下,你可以发现文件夹里多出了一些新的东西,这说明了你的环境已经安装成功了。之后把这个里面的.hex文件烧录到你的单片机中即可,这个工程是基于STM32F10系列的,准确讲是针对正点原子的stm32f1战舰开发板V1版本的,如果你是使用的其相同芯片的开发板,可以把这个里面的程序部分改一改就可以当作一个模板来使用。

结语

然后到这里,我们的配置基本上就完成了,不过想要正式进行开发还需要学习更多,可以参考正点原子的书或者其它的博客,遇到什么问题百度或者在一些网站、群聊里问问其他大佬就好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值