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存在如下问题:

  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.pswp.cn/pingmian/83356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九(1). 引用作为函数参数的使用

引用作为参数使用 在 C 中,引用作为函数参数是一种高效且灵活的参数传递方式,它避免了拷贝开销,同时允许函数直接操作原始数据。 以下是关于引用作为参数的详细使用指南和最佳实践: 1. 引用作为参数的基本用法 (1) 普通引用&…

Linux多路TTS混音播放:让多个语音同时清晰可听

Linux多路TTS混音播放:让多个语音同时清晰可听 为什么需要多路混音播放?技术原理概述第一步:配置ALSA dmix混音插件为什么需要dmix?具体配置步骤第二步:生成TTS语音文件为什么需要格式转换?Python生成脚本第三步:实现多路同时播放播放器设计原理Python实现代码多路同时播…

Spring AI 1.0 GA 深度解析:构建企业级AI应用的全栈实践指南

目录 Spring AI 1.0 核心架构解析统一接口与多模型支持检索增强生成(RAG)全流程实战对话记忆与工具调用进阶模型评估与可观测性体系企业级应用案例与最佳实践未来演进与技术展望1. Spring AI 1.0 核心架构解析 1.1 技术架构演进 #mermaid-svg-ymTZMAaxOwd4OAMu {font-family…

Docker 安装 Redis 容器

系列文章目录 文章目录 系列文章目录前言1 获取redis镜像2 创建和部署redis容器3 查看redis是否启动成功4 使用Redis客户端验证连接总结 前言 搭建环境: ubuntu22.04.05 docker redis: 7.0.10 测试环境: windows: win11 Redis测试客户端:Ti…

学习vue3阶段性复习(插槽,Pinia,生命周期)

目录 插槽(匿名插槽,具名插槽) 插槽概述 匿名插槽 具名插槽 Pinia(统一管理,共享数据) pinia概述 安装和使用Pinia 1 使用命令下载Pinia 2 再main.js中导入,注册到vue框架中 3使用pinia 持久化存储插件 1 第一步&…

嵌入式Linux 期末复习指南(上)

鉴于互联网上针对本科目相关复习视频及资料过少, 撰写本篇期末复习指南用作期末复习知识点扫盲,以应对本科期末考试及格之用。 由于任课老师并透露考试范围或任何有关试卷的相关信息,本篇指南基于教材、上机实验报告及作者经验编写&#xff0…

VScode ios 模拟器安装cocoapods

使用 Homebrew 安装(推荐) 如果你有 Homebrew,直接用它安装更稳定: brew install cocoapods

Python趣学篇:用Pygame打造绚烂流星雨动画

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》 目录 一、项目简介与效果展示二、技术栈与核…

可视化大屏通用模板Axure原型设计案例

本文将介绍一款基于Axure设计的可视化大屏通用模板,适用于城市、网络安全、园区、交通、社区、工业、医疗、能源等多个领域。 模板概述 这款Axure可视化大屏通用模板集成了多种数据展示模块和组件,旨在为用户提供一个灵活、可定制的数据展示平台。无论…

20250530-C#知识:万物之父Object

C#知识:万物之父Object Object类(即object)是所有类的基类,这里面的方法还是需要好好了解一下。 1、Object类 是顶级父类,其他类默认都是Object类的子类(自定义类也会默认继承Object类)可以用O…

苹果应用开发详细教程(2025最新版)

苹果应用开发详细教程(2025最新版) 第一阶段:开发环境搭建 硬件准备 Mac电脑(macOS Monterey 12或更高版本)iPhone/iPad(真机调试建议iOS 16+)软件安装 # 通过App Store安装Xcode xcode-select --installXcode 15+(包含Swift 5.9编译器)安装CocoaPods(依赖管理工具)…

flutter项目迁移空安全

重中之重 备份好项目文件,甚至连已经加载好的flutter库也可以备份。环境包升级 2.1 不要直接换成flutter:3.0以上的版本,这样做既有基本的库兼容问题,又有空安全下的语法问题(整个项目中需要增加 late、?、!的语法错误,一片报错的…

架构师面试题整理

以下是从提供的HTML代码中提取的所有class"title-txt"的文本内容,已排除重复项并按顺序整理: 缓存专题 实战解决大规模缓存击穿导致线上数据库压力暴增面试常问的缓存穿透是怎么回事基于DCL机制解决突发性热点缓存并发重建问题实战Redis分布…

pytest 中 fixture 与类继承交互导致的问题

文章目录 问题分析将属性绑定到 **类** 上使用 scopefunction 解决方法为什么有两个不同的对象核心原因:fixture 的执行上下文scopefunction 的情况scopeclass 的情况 为什么 pytest 要这样做?这是 pytest 的设计局限 总结 本文探讨 Pytest 中 fixture 作…

uniapp+ts模拟popup弹出框(下拉框)

效果图&#xff08;未展开的样子&#xff09;&#xff1a; 效果图&#xff08;展开的样子&#xff09;&#xff1a; 子组件代码&#xff1a; <!--* Date: 2024-04-26 14:30:00* LastEditTime: 2025-05-29 09:01:06* Description: 技术服务 --> <template><view …

中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南

目录 背景‌一、环境规划与依赖准备‌1. 服务器规划(3节点集群)2. 系统与依赖‌3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置‌1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置‌4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…

谷粒商城-分布式微服务项目-高级篇[三]

十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址&#xff1a; 支付宝开放平台 15.1.2 下载支付宝官方 demo&#xff0c;进行配置和测试 开发者文档&#xff1a;支付宝开放平台文档中心 电脑网站支付文档&#xff1a;小程序文…

DeepSeek 赋能低空经济:无人机智能调度的破局之道

目录 一、引言二、DeepSeek 技术探秘2.1 DeepSeek 技术核心要点2.2 与传统技术对比优势 三、低空经济无人机调度挑战剖析3.1 飞行控制困境3.2 数据处理难题3.3 系统集成阻碍 四、DeepSeek 应用方案与成果4.1 智能调度与路径规划4.2 自主飞行与协同控制4.3 通信与数据链优化4.4 …

【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s

Kubernetes v1.24集群安装配置步骤总结 一、环境准备 &#xff08;一&#xff09;系统要求 运行兼容deb/rpm的Linux操作系统&#xff08;如Ubuntu或CentOS&#xff09;的计算机&#xff0c;1台或多台。每台机器内存2GB以上&#xff0c;内存不足会限制应用运行。控制平面节点…

计算机视觉NeRF

NeRF与3DGS学习 NeRF计算机视觉的问题NeRF定义神经辐射场场景表示基于辐射场的体渲染分层采样优化神经辐射场 基础知识初始化SFM基础矩阵 & 本质矩阵 & 单应矩阵从已经估得的本质矩阵E&#xff0c;恢复出相机的运动R,tSVD 分解 NeRF NeRF资源 计算机视觉的问题 计算…