vscode + cmake + ninja+ gcc 搭建MCU开发环境
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存在如下问题:
-
正版需要License!尽管网上破解教程一大把,破解也很简单,甚至清楚的人都知道,这个破解软件大概率还是官方提供的~,因此个人使用没有问题,但是如果你是公司使用,公司小规模的时候没人管你,等你业务做大了,公司体量做大了,就开始有人来查水表了,毕竟这个时候由于项目周期、进度等等一系列因素,临时换炮肯定来不及,那购买License的概率就大幅提高了
-
不具备跨平台属性,此类 IDE 基本都是只有 windows 版本,但是作为嵌入式开发的,又有几个人能避免 linux 这个开发环境的? 类似 CI 这种通常部署在 linux 环境上,不可避免代码要在 linux 上能编起来,甚至能在 linux 上直接开发
-
“效率较低",当然这需要打一个双引号,因为这是相对的,开发软件发展至今,传统的这种 IDE 相对于近几年发展出来的主力,类似于VScode 这类开发软件,传统IDE界面过于朴素,复杂代码跳转等都不是很方便,且Vscode 支持大量插件,甚至AI辅助编码,开发的时候该选哪个不用多说了
那么本文将详细描述如何采用 vscode + cmake + ninja + gcc 搭建 MCU 的开发环境,学习一下另外一种开发 MCU 的新方式!
2. 工具安装及介绍
2.1 gcc
2.1.1 gcc 介绍
准确来说应该是 gcc-arm-none-eabi
。
使用 keil
的时候,keil
是 arm
公司开发的一款集成上位机图形化编辑软件,点击某些按钮之后,其底下也就是执行对应的指令,调用相关编译器进行编译罢了,而 keil 调用的编译器叫做 armcc
,这是 arm 自家开发的,不开源,因此需要征收 license
费用。gcc
和 armcc
一样是一种编译器,干同样的是,但是 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风格比较好用!
-
执行
cmake -B out -GNinja
调用 cmake 生成 ninja 构建系统-B
:指定生成目录为当前目录下的 out 目录-GNinja
:指定生成 ninja 版本构建系统
-
执行
ninja -C out
进行编译-C
: 指定编译执行目录
-
对于最新版本的 CubeMx 生成的 cmake 版本工程,使用老版本 gcc 编译的时候会报错:
non constant or forward reference address expression for section .ARM.extab
- 这是由于 gcc 版本太老了,cubemx匹配的 gcc 太新了导致,修改下
ld
链接脚本文件,去掉所有的(READONLY)
字段即可
- 这是由于 gcc 版本太老了,cubemx匹配的 gcc 太新了导致,修改下
-
编译完成之后,在 out 目录下可以看到
test.elf
文件,此文件即为编译产物,如果生成文件需要.bin
或者.hex
文件,需要修改下CMakeLists.txt
,以后再补充吧,axf文件也可以使用 ozone 这类软件下载了,或者调用arm-none-eabi-gcc
自行生成一下也可以,命令自行AI~
4. 总结
以上便是使用 vscode + cmake + ninja + gcc 搭建完整的 mcu 开发环境的全部步骤了,体验完应该可以开始淘汰传统的 IDE 了,当然对于如何完善cmake,以及生成的 bin 文件后续怎么烧录,怎么仿真这些本文还未涉及,后续再补充啦,关注专栏后续不断更新!
相关文章:

vscode + cmake + ninja+ gcc 搭建MCU开发环境
vscode cmake ninja gcc 搭建MCU开发环境 文章目录 vscode cmake ninja gcc 搭建MCU开发环境1. 前言2. 工具安装及介绍2.1 gcc2.1.1 gcc 介绍2.1.2 gcc 下载及安装 2.2 ninja2.2.1 ninja 介绍2.2 ninja 安装 2.3 cmake2.3.1 cmake 介绍2.3.2 cmake 安装 2.4 VScode 3. 上手…...

三种经典算法优化无线传感器网络(WSN)覆盖(SSA-WSN、PSO-WSN、GWO-WSN),MATLAB代码实现
三种经典算法优化无线传感器网络(WSN)覆盖(SSA-WSN、PSO-WSN、GWO-WSN),MATLAB代码实现 目录 三种经典算法优化无线传感器网络(WSN)覆盖(SSA-WSN、PSO-WSN、GWO-WSN),MATLAB代码实现效果一览基本介绍程序设…...

JVM 核心组件深度解析:堆、方法区、执行引擎与本地方法接口
一、JVM 堆内存:对象的生存与消亡之地 作为 Java 虚拟机中最大的内存区域,堆内存是所有对象实例的 “出生地” 与 “安息所”。从程序运行的角度看,所有通过new关键字创建的对象都在堆中分配内存,其生命周期完全由垃圾回收机制&am…...

OpenCV4.4.0下载及初步配置(Win11)
目录 OpenCV4.4.0工具下载安装环境变量系统配置 OpenCV4.4.0 工具 系统:Windows 11 下载 OpenCV全版本百度网盘链接:: https://pan.baidu.com/s/15qTzucC6ela3bErdZ285oA?pwdjxuy 提取码: jxuy找到 opencv-4.0.0-vc14_vc15 下载得到 安装 运行op…...
【iOS(swift)笔记-13】App版本不升级时本地数据库sqlite更新逻辑一
App版本不升级时,又想即时更新本地数据库怎么办? 办法一:直接从服务器下载最新的sqlite数据库替换掉本地的 具体逻辑 1、首先本地数据库里一定要有一个字段(名字自己取) 比如dbVersion,可用数字&#x…...
Flink CDC将MySQL数据同步到数据湖
此项目可以理解为MySQL数据迁移,由Flink Stream监听MySQL的Binlog日志写入Kafka,在Kafka消费端将消息写入Doris或其他外部对象存储。 涉及的环境与版本 组件版本flink1.20.1flink-cdc3.4.0kafka2.13-4.0.0Dragonwell17 引入相关依赖 <?xml versio…...

使用Mathematica观察多形式根的分布随参数的变化
有两种方式观察多项式的根随着参数变化:(1)直接制作一个小的动态视频;(2)绘制所有根形成的痕迹(locus)。 制作动态视频: (*Arg-plane plotting routine with plotting …...

【C++高级主题】转换与多个基类
目录 一、多重继承的虚函数表结构:每个基类一个虚表 1.1 单继承与多重继承的虚表差异 1.2 代码示例:多重继承的虚函数覆盖 1.3 虚表结构示意图 二、指针与引用的类型转换:地址调整的底层逻辑 2.1 派生类指针转基类指针的地址偏移 2.2 …...
C++.双指针算法(1.1目录修正)
C.双指针算法 1. 双指针算法概述1.1 双指针算法的定义1.2 双指针算法的应用场景1.2.1 数组中的两数之和问题1.2.2 链表中的环检测问题1.2.3 滑动窗口问题1.2.4 有序数组的合并问题 2. 双指针算法的实现基础2.1 指针的基本概念2.2 指针的运算操作 3. 双指针算法的常见类型及示例…...

『uniapp』添加桌面长按快捷操作 shortcuts(详细图文注释)
目录 手机环境适配说明安卓效果图代码 iOS(暂未实测,没有水果开发者)总结 欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 手机环境适配说明 个别手机系统可能需要进行特别的权限设置,否则会无法使用 桌面快捷方式: 已知的有…...

【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步
目录 一、什么是 LLM?语言的天才,思维的起点 ✅ 特点小结: 二、什么是 Agent?智能的执行者,自主的决策者 ✅ 特点小结: 三、LLM 与 Agent 的关系:是工具,更是大脑 四、案例实战…...
【看到哪里写到哪里】C的指针-3(函数指针)
//定义四个函数 加减乘数 int add(int a, int b) {return a b; } int subtract(int a, int b) {return a - b; } int multiply(int a, int b) {return a * b; } int divide(int a, int b) {if (b 0){printf("Error: devision by ZERO!");return 0;}return a / b; }…...

麦克风和电脑内播放声音实时识别转文字软件FunASR整合包V5下载
我基于FunASR制作的实时语音识别转文字软件当前更新到V5版本。软件可以实时识别麦克风声音和电脑内播放声音转为文字。 FunASR软件介绍 FunASR 是一款基础语音识别工具包和开源 SOTA 预训练模型,支持语音识别、语音活动检测、文本后处理等。 我使用FunASR制作了一…...

PyTorch——卷积层(3)
conv_arithmetic/README.md at master vdumoulin/conv_arithmetic GitHub out_channel1 out_channel2...
(面试)OkHttp实现原理
OkHttp 是一个高效的 HTTP 客户端,被广泛应用于 Android 和 Java 应用中。它提供了许多强大的特性,例如连接池、透明的 GZIP 压缩、HTTP/2 支持等。理解 OkHttp 的实现原理有助于更好地使用和调试它。 以下是 OkHttp 的一些核心实现原理: 1…...

从 PyTorch 到 TensorFlow Lite:模型训练与推理
一、方案介绍 研发阶段:利用 PyTorch 的动态图特性进行快速原型验证,快速迭代模型设计。 灵活性与易用性:PyTorch 是一个非常灵活且易于使用的深度学习框架,特别适合研究和实验。其动态计算图特性使得模型的构建和调试变得更加直…...
C++ 17 正则表达式
正则表达式不是C语言的一部分,这里仅做简单的介绍。 将这项技术引进,在 』的讨论 正则表达式描述了一种字符串匹配的模式。一般使用正则表达式主要是实现下面三个需求: 1,检查一个串是否包含某种形式的子串; 2,将匹配的子串替换&a…...

【存储基础】存储设备和服务器的关系和区别
文章目录 1. 存储设备和服务器的区别2. 客户端访问数据路径场景1:经过服务器处理场景2:客户端直连 3. 服务器作为"中转站"的作用 刚开始接触存储的时候,以为数据都是存放在服务器上的,服务器和存储设备是一个东西&#…...
kernel内核和driver驱动的区别
“kernel”和“driver”虽然都跟操作系统和硬件有关,但它们指的是不同的东西。 1. Kernel(内核) 定义:操作系统的核心组件,是操作系统中负责管理系统资源和硬件的最底层软件。 职责: 管理CPU调度ÿ…...

5.29打卡
浙大疏锦行 DAY 38 Dataset和Dataloader类 知识点回顾: 1. Dataset类的__getitem__和__len__方法(本质是python的特殊方法) 2. Dataloader类 3. minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图…...

【黑马程序员uniapp】项目配置、请求函数封装
黑马程序员前端项目uniapp小兔鲜儿微信小程序项目视频教程,基于Vue3TsPiniauni-app的最新组合技术栈开发的电商业务全流程_哔哩哔哩_bilibili 参考 有代码,还有app、h5页面、小程序的演示 小兔鲜儿-vue3ts-uniapp-一套代码多端部署: 小兔鲜儿-vue3ts-un…...
ios tableview吸顶
由于项目需要实现一个上滑吸顶的效果,网上也看到有很多种方式实现,但是如果加上下拉刷新的功能会导致界面异常,还有第三方库实现方式库,太繁琐了,下面是我的实现方式,效果如下: tablevie滑动吸顶…...

PyTorch——DataLoader的使用
batch_size, drop_last 的用法 shuffle shuffleTrue 各批次训练的图像不一样 shuffleFalse 在第156step顺序一致...
【Python 进阶2】抽象方法和实例调用方法
抽象方法和实例调用方法 对比表格: 特性抽象方法 (forward)实例调用方法 (call)定义方式abc.abstractmethod 装饰器特殊方法名 __call__调用方式不能直接调用,必须通过子类实现可以直接调用对象:controller(attn, ...)实现要求必须由子类实…...
第1章:走进Golang
第1章:走进Golang 一、Golang简介 Go语言(又称Golang)是由Google的Robert Griesemer、Rob Pike及Ken Thompson开发的一种开源编程语言。它诞生于2007年,2009年11月正式开源。Go语言的设计初衷是为了在不损失应用程序性能的情况下…...

Predixy的docker化
概述 当前已有一套redis cluster的集群,但是fs中的hiredis只能配置单实例redis。 AI了一下方案,可以使用redis的proxy组件来实现从hiredis到redis cluster的互通。 代码地址:https://github.com/joyieldInc/predixy Predixy特性介绍&…...

C++ 之 多态 【虚函数表、多态的原理、动态绑定与静态绑定】
目录 前言 1.多态的原理 1.1虚函数表 1.2派生类中的虚表 1.3虚函数、虚表存放位置 1.4多态的原理 1.5多态条件的思考 2.动态绑定与静态绑定 3.单继承和虚继承中的虚函数表 3.1单继承中的虚函数表 3.2多继承(非菱形继承)中的虚函数表 4.问答题 前言 需要声明的&#x…...

【JavaWeb】Maven、Servlet、cookie/session
目录 5. Maven6. Servlet6.1 Servlet 简介6.2 HelloServlet6.3 Servlet原理6.4 Mapping( **<font style"color:rgb(44, 44, 54);">映射 ** )问题6.5 ServletContext6.6 HttpServletResponse<font style"color:rgb(232, 62, 140);background-color:rgb(…...
[蓝桥杯]阶乘求值【省模拟赛】
问题描述 给定 nn,求 n!n! 除以 10000000071000000007 的余数。 其中 n!n! 表示 nn 的阶乘,值为从 11 连乘到 nn 的积,即 n!123…nn!123…n。 输入格式 输入一行包含一个整数 nn。 输出格式 输出一行,包含一个整数ÿ…...
鸿蒙OSUniApp微服务架构实践:从设计到鸿蒙部署#三方框架 #Uniapp
UniApp微服务架构实践:从设计到鸿蒙部署 引言 在最近的一个大型跨平台项目中,我们面临着一个有趣的挑战:如何在UniApp框架下构建一个可扩展的微服务架构,并确保其在包括鸿蒙在内的多个操作系统上流畅运行。本文将分享我们的实践…...