由于keil软件版权在商务或者说生产环境中比较贵,而使用破解版在这种情况下可能被追究侵权,所以我开始尝试将嵌入式项目转移到完全开源的vscode环境中做,恰好stm官方实际上也在大力推出他们自己的环境,但这里有一个问题出现,如果后续使用乐鑫等厂家的板子可能又需要面对环境搭建的问题,所以不如一开始就绕过这些平台直接搭建。本文记录的方法是完全基于vscode环境,不依赖keil编译,直接使用最基础的编译进行嵌入式项目的编译。做的过程中涉及到了不少编译的概念,在这里做一些总结给日后的自己看。不能保证理解正确,谨慎参考,欢迎交流。

        同样的在学习过程中很大程序依靠了deepseek的帮助。

1、vscode支持环境搭建

        首先要保证vscode可以编译c文件,这样一来几个c文件编译插件是必不可少的,这几个在vscode中就可以实现。

        其次要确保环境中的几个基本工具:GCC + CMake + Make + OpenOCD

1.1 GCC 

        vscode本质上就是一个编辑器,本身不具备编译c代码的能力,所以需要一些编译工具,也就是所谓的编译器。

        GCC是指GNU编译器套装(GNU Complier Collection),负责将c和c++源代码翻译为计算机能看懂的二进制机器码。对于windows,linux、arm等不同的平台会需要不同的GCC工具,它们本质上都是GCC——底层都是同一个编译器框架,但连接的库和启动代码是不同的,编译完成后生成的二进制文件格式也是不同的,这些格式分别适合在不同的平台上运行。

        下边的表格是一些实际的GNU工具,这些编译器没有标准的中文名,一般被叫做xxx编译器,很多时候都是直接叫英文。

MinGW-w64 Windows 下的 GCC 移植版 .exe
mingw64 就是指 MinGW-w64 的 64 位版本 .exe
arm-none-eabi-gcc ARM 裸机嵌入式 GCC 交叉编译器 .elf / .bin / .hex

        配置环境的过程中我同时装了mingw64和arm-none-eabi-gcc这两个编译器,具体用哪个则在编写项目的makefile文件中具体指定,简单来讲如果希望编译出.exe文件,那么就在makefile文件中选择前者,如果希望要用于arm的二进制文件,就在makefile文件中选择后者。

        为了方便理解,可以做一些同类型类比,gcc是一种编译器,除了gcc之外,还有一些其他编译器,例如Clang,这个是LLVM项目的前端,也是macOS默认编译器。再比如MSVC,这个也是一种编译器,微软出品,集成在visual Studio里,这两种都是pc用编译器,常见的免费c编译软件dev-c++用的编译器是MinGW-w64,也就是基于gcc的windowns的移植版。而在嵌入式领域,常用的编译器有IAR C/C++ Compiler(商业编译器,要钱,功能强大),keil C51/MDK-ARM(ARM官方出的编译器常用于stm32等芯片,输出二进制文件为.bin,要钱),TI CCS(德州仪器的编译器)以及SDCC编译器(开源)。

        获取方法:直接去下载就可以

        安装方法:下载下来是这个样子的:

       就是两个文件夹,解压放好,然后将文件夹中bin文件路径添加到系统环境变量中的path中接好了。

检验方法:在cmd中输入arm-none-eabi-gcc --version 、gcc --version,有版本号即可。

当然这里搞完有一个小地方,就是vscode中有个叫做Embedded IDE的插件,里面有一个设定,网上有教程是直接使用keil的编译器做编译的,但这里还是免不得要受版权限制,考虑已经到这一步不如彻底甩掉keil那么就直接在这里配置为gcc,如下图,我直接把keil的路径删除了。

1.2 Cmake

        这个工具主要用于大型的项目,想象这样一个场景,某项目先是使用了windows下的gcc编程并做了仿真,接着又在arm上进行了验证,最后要将项目部署到linux系统中运行,这个过程涉及并跨越了三个系统,编程者如果需要合并这些源代码就需要同时掌握三个平台的工程文件,这样有些麻烦,所以就出现了Cmake工具,编程者只需要掌握CMake工具中的CMakeList.txt文件的写法,并且在这个文件中描述清楚项目的结构、源文件和相应的依赖,cmake工具就会自动生成诸如makefile文件等适用于不同平台的工程文件。

        讲到这里需要提及makefile文件,在配置过程中我发现在vscode中,无论是多文件的c项目,还是stm32项目中都需要配置一个makefile文件,这是什么原因?首先要明确一点:makefile文件本质上是给Make工具用的。linux自带make所以在linux上编程必然需要一个makefile文件,而windows上则可以通过MinGW得到一个mingw32-make,这样就也需要一个makefile文件了。而ARM项目相对复杂,可能涉及到汇编和C语言的互相配合,还涉及交叉编译(就是在一个平台上编译出用于其他平台的文件,与之相对的叫做本地编译),例如arm-none-eabi-gcc就是一个交叉编译器,其编译过程需要自己进行硬件管理分配,所以必须有一个脚本语言来管理,脚本语言可以是makefile和make。

        当然,初期的时候很少出现需要这种程度的跨平台项目,所以在初期是不大需要这个工具的。

        获取方法: https://cmake.org/download/   直接下载即可。

        安装方法:下载下来是这样的,双击安装

        检验方法:在cmd中输入cmake --version,有版本号即可。

1.3 Make

        make是一个执行器,负责按照写好的makefile文件去调用gcc执行编译行为,我在这里将整个计算机编译c代码的过程类比为一个翻译公司,gcc是一线的翻译员,直接负责将c语言源代码从文字转化为二进制文件,make是监工,负责按照工作流程表调用指挥某个gcc来完成这项翻译工作,makefile文件就是这张工作流程表,makefile文件可以由编程者自己写,也可以由编程者调用Cmake工具生成,这个过程中,编程者就是公司的老板,而Cmake工具起到类似老板特助的作用,当然小公司(小项目)就不需要什么特助了。

        这里需要提到的一点是,之前我在linux上编译过c文件,当c文件只有一个main.c源文件的时候,编译非常简单,指令如下,在命令行界面中输入,回车即可:

gcc main.c -o main.exe

        但当编译一个多个源文件构成的系统时,命令就会变得复杂,下边的指令是编译一个包含两个源文件的工程。

gcc main.c func.c -o program.exe

        当文件进一步变多,例如一个stm32工程,命令可能会变成这样:

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -T stm32f407.ld main.c uart.c spi.c startup.s system.c -o firmware.elf

        这种程度的编译就非常麻烦了,所以需要使用Make工具实现自动编译,这个功能其实就相当于dev-c++、或者keil或者任何一个图形化编译器中的那个编译按钮。

        获取方法:前面配置ming32-make的时候会带一个叫做mingw32-make.exe的文件,这个就是make,本质上就是一个.exe小程序。下图就是mingw32-make中的对应程序

        安装方法:把mingw-32配置好就可以了,后续的嵌入式用的编译器中没有make工具,编译的时候用的就是mingw32-make(文件夹)中的mingw32-make.exe程序。

        检验方法:在cmd中输入mingw32-make --version,有版本号即可。

1.4 OpenOCD

        当完成上面提到的所有编译步骤之后,就获得了单片机需要的二进制文件,这个文件需要烧写进arm芯片中,OpenOCD就有这个功能,但这并不是OpenOCD工具的主要用途,因为STM32CubeProgrammer这个软件的使用体验要比OpenOCD好得多,有完善的图形界面,但OpenOCD可以进行单步调试,vs code‘里的Cortex - Debug插件必须结合OpenOCD才能实现单步调试、查看寄存器、看到变量动态变化的功能。简单来讲通过STM32CubeProgrammer将程序写入单片机,如果程序运行有问题,才需要在vscode中通过Cortex - Debug调用OpenOCD进入单步调试来排查问题。

        上述提到了三个工具,STM32CubeProgrammer,Cortex - Debug,和OpenOCD.

        获取方法:STM32CubeProgrammer,在st官网直接下载,然后一路下一步的安装

                          Cortex - Debug  ,在vscode里边直接安装

                          OpenOCD  ,  直接开源网站下载,https://sourceforge.net/projects/openocd/

        安装方法:OpenOCD将下载到的文件解压到一个文件夹(推荐D盘根根目录,或者单独做一个文件夹,不要出现中文或者空格),解压。打开bin文件,然后复制bin文件所在路径加入到系统环境变量中的Path中。

2、vscode内部相关插件

        IDE概念:IDE全称是 Integrated Development Environment,也就是集成开发环境。常见IDE包括keil,其中集成了编译、烧录、断点调试等等功能,vs code不能算这种意义上的IDE,其本质是一个文本编辑器,类似于txt,当然比起txt,vs code的界面好看的多,同时更加开放,有更多的接口可以安装各种插件以适应不同语言的编译。下面提到的就是各种插件

2.1  CMake Tools

        这个是专门处理  CMakeLists.txt 工程的,和上面的cmake配套,云不到cmake的时候没啥用

2.2     Embedded IDE

        这个东西是个IDE,类似在vs code里边弄一个keil,但问题是设定中难免会用到keil的编译器,但是如果用keil的东西的话还是涉及版权问题,所以我在这用了gcc,这个插件安好后有个小界面,通过点击选择各项配置可以直接生成全套文件和基础makefile,同时具有烧录配置。其实就是开源版keil,但是相对黑箱,且他也有一套专属的工程配置,本质上是用了他人规定好的结构。所以如果将上一个章节中的工具链配齐的话这个插件也可以不要,它们功能重复了。我个人感觉不要这些插件会更加灵活。

2.3   Makefile Tools

        这个插件是为手写的或者教简单的单个makefile工程预备的,安装了这个后vs code页面下边会出现一个小齿轮,点一下就执行mingw32-make指令,其实就是这个指令的图形化界面,个人感觉意义不大,装不装都行,而且很多次连这个图标都不出现,需要手动搜索命令麻烦的厉害。

        后续具体如何不依赖插件建立一个嵌入式工程的部分放在下一个文档中,主要因为这一篇实在不想写了。

更多推荐