vscode + cmake + ninja+ gcc 搭建MCU开发环境

article/2025/8/13 15:40:04

vscode + cmake + ninja+ gcc 搭建MCU开发环境

文章目录

  • vscode + cmake + ninja+ gcc 搭建MCU开发环境
    • 1. 前言
    • 2. 工具安装及介绍
      • 2.1 gcc
        • 2.1.1 gcc 介绍
        • 2.1.2 gcc 下载及安装
      • 2.2 ninja
        • 2.2.1 ninja 介绍
        • 2.2 ninja 安装
      • 2.3 cmake
        • 2.3.1 cmake 介绍
        • 2.3.2 cmake 安装
      • 2.4 VScode
    • 3. 上手体验
    • 4. 总结

1. 前言

接触过 MCU 开发的同学基本上对于 Keil、IAR 这一类的集成IDE 软件并不陌生。

使用这类软件好处当然显而易见:快速上手,一键编译,一键下载,一键仿真运行等等,大家只需将注意力焦注于如何编写好用且优雅的功能代码即可,至于代码是如何编译,如何生成bin文件完全不用关系。

那么使用这类软件有什么坏处吗?为什么需要去研究另外一些编译方式呢?直接用不香吗?这样做肯定是有原因的!使用上述IDE存在如下问题:

  1. 正版需要License!尽管网上破解教程一大把,破解也很简单,甚至清楚的人都知道,这个破解软件大概率还是官方提供的~,因此个人使用没有问题,但是如果你是公司使用,公司小规模的时候没人管你,等你业务做大了,公司体量做大了,就开始有人来查水表了,毕竟这个时候由于项目周期、进度等等一系列因素,临时换炮肯定来不及,那购买License的概率就大幅提高了

  2. 不具备跨平台属性,此类 IDE 基本都是只有 windows 版本,但是作为嵌入式开发的,又有几个人能避免 linux 这个开发环境的? 类似 CI 这种通常部署在 linux 环境上,不可避免代码要在 linux 上能编起来,甚至能在 linux 上直接开发

  3. “效率较低",当然这需要打一个双引号,因为这是相对的,开发软件发展至今,传统的这种 IDE 相对于近几年发展出来的主力,类似于VScode 这类开发软件,传统IDE界面过于朴素,复杂代码跳转等都不是很方便,且Vscode 支持大量插件,甚至AI辅助编码,开发的时候该选哪个不用多说了

那么本文将详细描述如何采用 vscode + cmake + ninja + gcc 搭建 MCU 的开发环境,学习一下另外一种开发 MCU 的新方式!

2. 工具安装及介绍

2.1 gcc

2.1.1 gcc 介绍

准确来说应该是 gcc-arm-none-eabi

使用 keil 的时候,keilarm 公司开发的一款集成上位机图形化编辑软件,点击某些按钮之后,其底下也就是执行对应的指令,调用相关编译器进行编译罢了,而 keil 调用的编译器叫做 armcc,这是 arm 自家开发的,不开源,因此需要征收 license 费用。gccarmcc 一样是一种编译器,干同样的是,但是 gcc 开源,因此可以免费使用。

gcc 是一种编译器,主要用来编译,比如 linux 系统也是使用 gcc 进行编译。gcc 会根据不同的处理器架构有不同的 gcc 版本,我们需要根据可执行程序执行所在的cpu架构平台选择对应版本的 gcc

举个例子:在 linux 上编译出用于在 linux 上执行的可执行程序使用 gcc 版本 与 在 linux 上编译出用于在 mcu 上执行的可执行程序的 gcc 版本就不一样,不同的 gcc 版本对应可执行程序所运行的 cpu 处理器架构的不同。

上述讲到的是,我们需要根据可执行程序(即编译产物)执行所在的cpu平台架构选择对应版本的 gcc,但是在 我们的电脑上可以下载每一个版本的 gcc ,并进行编译,只是编译出来的产物需要放到对应的cpu架构平台才能执行而已!【补充:当然需要根据电脑的系统(Windows or Linux or MAC)选择下载对应系统版本的】

同样的,对于 mcu 这类处理器不具备运行 gcc 进行编译的能力,因此需要借助电脑先对源码执行编译,生产可以在 mcu 平台执行的可执行程序,也即 bin 文件,之后再将此 bin 文件下载传输到 mcu 内运行。因此对应可以编译出在mcu平台运行的可执行程序的编译器叫做 交叉编译器此编译器在windows 或 Linux 或 Mac 上运行,进行代码编译,产物在 mcu 上运行。

2.1.2 gcc 下载及安装

gcc 可从官网上直接下载:gcc-arm-none-eabi-10.3-2021.10-win32.zip

在这里插入图片描述选择自己对应的系统版本的 gcc 即可,像windows 如果下载的是可执行程序,直接安装就行,如果下载的是 zip,解压后将解压之后的 bin 文件夹目录下的路径【注意是arm-none-eabi-gcc所在的路径】 添加到系统环境变量,linux、mac同理,关于如何添加环境变量可自行上网查阅。

安装成功之后,重新打开一个命令行窗口或 bash,执行 arm-none-eabi-gcc --version 可以查看到对应版本则说明安装成功。

在这里插入图片描述

⚠️ 不同 gcc 版本编译出来的bin文件大小和内容会有些许差异,因此多人协同开发时,建议采用同一版本!⚠️

2.2 ninja

2.2.1 ninja 介绍

ninja 是 google 公司开发的一款构建系统,一款小巧的专注于编译速度而生从构建系统!
在这里插入图片描述
为什么 Google 要开发这么个东西呢?因为 make 太慢了!

对于小型系统体验不到,当工程比较大的时候,你执行下 make 指令,重新构建+编译等个半小时,你能受得了?因此 Google 的大佬开发了 ninja,它功能和 make 一样,但是比 make 快,它的优点就是:快!

2.2 ninja 安装

ninja 在 github 上直接开源,下载地址:ninja-github
在这里插入图片描述
根据自己的电脑系统选择对应的平台的压缩包即可。

下载完成之后解压到某个目录,之后将对应目录添加到环境变量,同样怎么添加环境变量自行上网查阅。

在这里插入图片描述

环境变量添加好之后,重新打开一个新的命令行终端或者bash,执行 ninja --version 查看是否安装成功。

在这里插入图片描述

2.3 cmake

2.3.1 cmake 介绍

make 工具需要依赖 makefile 文件进行构建,而 ninja 同样也依赖 build.ninja 文件。

makefile 的语法已经比较晦涩了,感兴趣可以看我之前写过的一篇博文 《Makefile入门到精通》,虽然晦涩难懂,但是多啃啃还是能啃下去,而 ninja 语法那就是天书,人家设计的时候可能也本没想着让大家去自行书写吧,反正我是没写过~

在这里插入图片描述

聪明的大佬们总会想办法给自己偷懒减负,因此写个软件直接生成这复杂的 build.ninja 描述文件不就好了,语法再弄的简单点,容易学一点,剩下的就剩解bug了~,因此就是 cmake 的主场了。

cmake 依赖于 CMakeLists.txt 文件,简单的功能比较好懂的,它不仅能直接生成 makefile,之后调用make进行编译;也能生成 build.ninja 之后调用 ninja 进行编译。且 cmake 工具同样具备跨平台属性!

具体cmake的语法在这就不多叙述了,感兴趣可以自行上网查阅,嗯,你必须感兴趣的…

2.3.2 cmake 安装

直接去官网下载最新版即可:cmake

在这里插入图片描述
同样根据自己系统进行选择,下载源文件和或者安装镜像都行,同样的,下载安装镜像的时候勾选自动添加到环境变量下载源文件,解压之后记得添加对应目录到环境变量!

安装好之后,重新打开一个命令行窗口或bash窗口,执行 cmake --version 确认是否ok
在这里插入图片描述

2.4 VScode

这个太有名气了吧,自行上网安装就好了!新手的话记得上网搜下 Vscode 推荐的插件,没有插件的 vscode 就是毛胚房,有了插件你可以是豪宅~

3. 上手体验

至此,工具都装好了,怎么也得来试试好不好用感受下吧!那么直接上手一种最为快速的体验感受感受吧!

最为快速的那还的是 stm32 搭配 cubemx 了,过气的 stm32 依然是最佳的选择,下载安装 stm32 CubeMX,根据电脑系统自行选择了!

毕竟 cubemx 可以直接生成 cmake 版本工程,暂时可以免去写 cmake 文件了!

在这里插入图片描述
tips:最新版本强制登陆了,有点离谱~

安装好之后,随便选择一款 MCU,简单配个时钟,配个SWD调试口就差不多了,当然手上有开发板那就根据开发板的来了!

在这里插入图片描述
在这里插入图片描述

生成工程的时候选择使用 cmake!!!

在这里插入图片描述

之后使用 vscode 打开生成好的工程文件夹,如下图所示:
在这里插入图片描述

在 vscode 内打开终端,推荐 git bash 终端,linux风格比较好用!

  1. 执行 cmake -B out -GNinja 调用 cmake 生成 ninja 构建系统

    • -B:指定生成目录为当前目录下的 out 目录
    • -GNinja:指定生成 ninja 版本构建系统
      在这里插入图片描述
  2. 执行 ninja -C out 进行编译

    • -C: 指定编译执行目录
      在这里插入图片描述
  3. 对于最新版本的 CubeMx 生成的 cmake 版本工程,使用老版本 gcc 编译的时候会报错:non constant or forward reference address expression for section .ARM.extab

    • 这是由于 gcc 版本太老了,cubemx匹配的 gcc 太新了导致,修改下 ld 链接脚本文件,去掉所有的 (READONLY) 字段即可
      在这里插入图片描述
  4. 编译完成之后,在 out 目录下可以看到 test.elf 文件,此文件即为编译产物,如果生成文件需要 .bin 或者 .hex 文件,需要修改下 CMakeLists.txt,以后再补充吧,axf文件也可以使用 ozone 这类软件下载了,或者调用 arm-none-eabi-gcc 自行生成一下也可以,命令自行AI~
    在这里插入图片描述

4. 总结

以上便是使用 vscode + cmake + ninja + gcc 搭建完整的 mcu 开发环境的全部步骤了,体验完应该可以开始淘汰传统的 IDE 了,当然对于如何完善cmake,以及生成的 bin 文件后续怎么烧录,怎么仿真这些本文还未涉及,后续再补充啦,关注专栏后续不断更新!


http://www.hkcw.cn/article/bhaChFmPXv.shtml

相关文章

GNSS终端授时之四:高精度的PTP授时

我们在GNSS终端的授时之三:NTP网络授时中介绍了NTP网络授时的基本原理。我们知道了NTP授时的精度跟网络环境相关,即使在局域网中NTP授时的精度也只能到ms级别。如果广域网,经过多级交换机,路由器,由于传输路径和延时的…

Amazon Augmented AI:人类智慧与AI协作,破解机器学习审核难题

在人工智能日益渗透业务核心的今天,你是否遭遇过这样的困境:自动化AI处理海量数据时,面对模糊、复杂或高风险的场景频频“卡壳”?人工审核团队则被低效、重复的任务压得喘不过气?Amazon Augmented AI (A2I) 的诞生&…

OS10.【Linux】yum命令

目录 1.安装软件的几种方法 直接编译源代码,得到可执行程序 使用软件包管理器 2.yum yum list命令 参数解释 yum install命令 yum remove命令 下载链接存放的位置 扩展yum源 实验:安装sl小火车命令 sl命令的选项 方法1:man sl 方法2:读源代码 3.更新yum源 查看…

网络协议的原理及应用层

网络协议 网络协议目的为了减少通信成本,所有的网络问题都是传输距离变长的问题。 协议的概念:用计算机语言来发出不同的信号,信号代表不同的含义,这就是通信双方的共识,便就是协议。 协议分层(语言层和…

【计算机网络】第3章:传输层—可靠数据传输的原理

目录 一、PPT 二、总结 (一)可靠数据传输原理 关键机制 1. 序号机制 (Sequence Numbers) 2. 确认机制 (Acknowledgements - ACKs) 3. 重传机制 (Retransmission) 4. 校验和 (Checksum) 5. 流量控制 (Flow Control) 协议实现的核心:滑…

RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加:就是在一张图片上放上自己想要的图片,如LOGO,时间等。有点像之前提到的OSD原理一样。例如:下图一张图片,在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…

Java流【全】

IO流分类 AA、根据数据流动的方向:输入流和输出流 如:打开一个新的记事本并输入一些内容,而这些内容是在内存里面的,没有存储到磁盘中,当点击保存之后,数据才会从内存流向磁盘;当双击打开磁盘文件的时候,数据才会从磁盘流向内存【数据存储有一个特点:内存一旦断电数…

大模型登《情报学报》!大模型驱动的学术文本挖掘!

武汉大学信息管理学院、武汉大学信息检索与知识挖掘研究所的陆伟、刘寅鹏、石湘、刘家伟、程齐凯、黄永和汪磊共同研究的《大模型驱动的学术文本挖掘——推理端指令策略构建及能力评测》在《情报学报》中发表。论文以学术文本挖掘任务为切入点,构建涵盖文本分类、信…

UI 设计|提高审美|极简扁平过时吗?

​在做UI界面时,极简扁平一直是个稳妥又高适配的选择。它没有复杂的质感和装饰,更强调清晰、直接和功能导向,能快速搭建出干净、有秩序的界面,适合大多数场景落地。 但是也确实有太多太相似的极简导致确实辨识度,这中…

哈尔滨工业大学提出ADSUNet—红外暗弱小目标邻帧检测新框架

ADSUNet: Accumulation-Difference-Based Siamese U-Net for inter-frame Infrared Dim and Small Target Detection 作者单位:哈尔滨工业大学空间光学工程研究中心 引用: Liuwei Zhang, Yuyang Xi, Zhipeng Wang, Wang Zhang, Fanjiao Tan, Qingyu Hou, ADSUNet: A…

#14 【Kaggle】 Drawing with LLMs 金牌方案赏析

用大模型画svg的比赛结束了,本来还是银牌的,shake down成了铜牌… 痛定思痛,瞻仰一下第一名的金牌解决方案。 🍕 比赛简单介绍 给定一段描述图像的文本提示,你的任务是生成可缩放矢量图形(SVG)代码,将其尽可能准确地渲染为一幅图像。 本次竞赛旨在构建既实用又可复用…

多任务——进程

1.进程的介绍 1. 进程的基本概念 在 Python 中,进程是操作系统分配资源和调度的基本单位,代表一个独立的程序执行实例。Python 的 multiprocessing 模块支持多进程编程,允许在单个程序中并行运行多个进程。每个进程拥有: 独立的…

Baklib加速企业AI数据治理实践

企业知识中台构建路径 在数字化转型进程中,企业需通过知识中台实现知识资产的系统性整合与价值释放。Baklib作为典型解决方案,以智能化技术为支撑,通过标准化数据接口打通CRM、ERP等异构系统,构建全域知识图谱。其核心实施路径包…

设计模式——状态设计模式(行为型)

摘要 状态设计模式是一种行为型设计模式,核心在于允许对象在内部状态改变时改变行为。它通过状态对象封装不同行为,使状态切换灵活清晰。该模式包含环境类、抽象状态类和具体状态类等角色,具有避免大量分支判断、符合单一职责和开闭原则等特…

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性,搜索schema,agg,表达式搜索映射,本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…

【项目记录】登录认证(上)

前面已经实现了部门管理、员工管理的基本功能,但并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以这次的主题就是登录认证。最终要实现的效果是: 如果用户名密码错误,不允许登录系统。 如…

Redis:安装与常用命令

🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 🔥 安装 Redis 使⽤apt安装 apt install redis -y⽀持远程连接 修改 /etc/redis/redis.conf 修改 bind 127.0.0.1 为 bind 0.0.0.0 修改 protected-mode yes 为 protected-mo…

16-前端Web实战(Tlias案例-部门管理)

在前面的课程中,我们学习了Vue工程化的基础内容、TS、ElementPlus,那接下来呢,我们要通过一个案例,加强大家对于Vue项目的理解,并掌握Vue项目的开发。 这个案例呢,就是我们之前所做的Tlias智能学习辅助系统…

MagicAnimate 论文解读:引入时间一致性的视频人物动画生成方法

1. 前言/动机 问题:现有动画生成方法缺乏对时间信息的建模,常常出现时间一致性差的问题 描述: 现有的动画生成方法通常采用帧变形(frame-warping)技术,将参考图像变形以匹配目标动作。尽管这类方法能生成较…

C语言基础(09)【数组的概念 与一维数组】

数组 数组的概念 什么是数组 数组是相同类型、有序数据的集合。 数组的特征 数组中的数据称之为数组的元素(数组中的每一个匿名变量空间,是同构的)数组中的元素存放在内存空间建立。 衍生概念:下标(索引) 下标或者索引代表…