Rust嵌入式开发环境搭建指南(基于Stm32+Vscode)

Rust嵌入式开发环境搭建指南(基于Stm32+Vscode)

部分目录如下所示:
在这里插入图片描述

目录

  • 简介
  • Rust开发环境安装
  • STM32开发工具链安装
  • VSCode环境配置
  • VSCode插件安装
  • 调试器配置
  • 项目创建与配置
  • 常见问题与解决方案

简介

本文档旨在指导开发者如何搭建基于Rust语言的STM32嵌入式开发环境。相比传统的C/C++开发方式,Rust提供了更强的内存安全保障和现代化的语言特性,非常适合嵌入式系统开发。本指南将详细介绍从环境搭建到项目配置的全过程,特别关注VSCode作为IDE的配置以及STLink和DAPLink调试器的使用。

Rust开发环境安装

1. 安装Rust工具链

作用:Rust工具链是进行Rust开发的基础环境,包含以下核心组件:

  • rustc:Rust编译器,负责将Rust代码编译成可执行文件或库
  • cargo:Rust的包管理器和构建系统,用于管理依赖、编译项目、运行测试等
  • rustup:Rust工具链管理器,用于安装和更新Rust组件,管理不同版本的Rust

使用rustup安装Rust工具链:

# Windows PowerShell
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# 或者直接下载rustup-init.exe安装(推荐)

安装过程中选择默认配置即可。安装完成后,可以通过以下命令验证安装:


#检查版本
rustc --version
cargo --version#升级到最新版本
rustup upgrade stable

2. 安装Rust嵌入式开发组件

作用:嵌入式开发需要特定的工具和目标支持,这些组件使Rust能够为ARM Cortex-M系列微控制器生成代码。

# 添加Rust交叉编译目标
rustup target add thumbv6m-none-eabi    # Cortex-M0和Cortex-M0+
rustup target add thumbv7m-none-eabi    # Cortex-M3
rustup target add thumbv7em-none-eabi   # Cortex-M4和Cortex-M7(无FPU)
rustup target add thumbv7em-none-eabihf # Cortex-M4F和Cortex-M7F(带FPU)# 安装cargo-binutils工具
cargo install cargo-binutils
rustup component add llvm-tools-preview# 安装cargo-embed工具(用于烧录和调试)
cargo install cargo-embed# 安装probe-rs工具(用于与调试器交互)
cargo install probe-rs --features cli

各组件作用

  • 交叉编译目标:根据STM32芯片的Cortex-M核心类型选择适当的目标,使Rust能够生成适合特定ARM架构的代码
  • cargo-binutils:提供二进制工具集,用于检查和操作编译后的二进制文件,如查看大小、反汇编等
  • llvm-tools-preview:提供LLVM工具链支持,cargo-binutils依赖此组件
  • cargo-embed:用于将编译好的程序烧录到目标设备,并提供RTT调试功能
  • probe-rs:现代化的调试器后端,支持多种调试探针(如STLink、DAPLink等),提供烧录和调试功能

解决rustup-init.exe下载安装缓慢和Cargo下载慢的问题

Rust官网:https://rustup.rs/ 打开这个链接下载。如下下载慢可以使用下面镜像。实际下载速度还可以。

1. rustup-init.exe下载缓慢

可以通过以下国内镜像站点直接下载rustup-init.exe:

  • 清华大学镜像:https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe
  • 其他镜像等

下载完成后直接运行安装程序。

2.rustup-init.exe安装缓慢,永久设置国内镜像源(推荐)

为了避免每次都需要设置临时环境变量,建议将镜像源设置为系统环境变量,这样可以永久解决下载慢的问题。

方法一:通过Windows图形界面设置(推荐)

  1. 按下Win键 输入"编辑系统环境变量"

  2. 分别添加以下两个环境变量:

    • 变量名:RUSTUP_DIST_SERVER
    • 变量值:https://mirrors.aliyun.com/rustup
    • 变量名:RUSTUP_UPDATE_ROOT
      变量值:https://mirrors.aliyun.com/rustup/rustup

在这里插入图片描述

方法二:通过PowerShell命令行永久设置

以管理员身份运行PowerShell,然后执行以下命令:

# 设置系统环境变量(需要管理员权限)
[Environment]::SetEnvironmentVariable("RUSTUP_DIST_SERVER", "https://mirrors.aliyun.com/rustup", "Machine")
[Environment]::SetEnvironmentVariable("RUSTUP_UPDATE_ROOT", "https://mirrors.aliyun.com/rustup/rustup", "Machine")# 验证环境变量是否设置成功
[Environment]::GetEnvironmentVariable("RUSTUP_DIST_SERVER", "Machine")
[Environment]::GetEnvironmentVariable("RUSTUP_UPDATE_ROOT", "Machine")#删除系统环境变量 (需要管理员权限):
[Environment]::SetEnvironmentVariable("RUSTUP_DIST_SERVER", $null, "Machine")
[Environment]::SetEnvironmentVariable("RUSTUP_UPDATE_ROOT", $null, "Machine")

设置完成后,重新打开命令提示符或PowerShell窗口,然后执行Rust安装命令,,或者直接运行rustup-init.exe,下载速度将会显著提升:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
3. rustup-init.exe安装缓慢,使用国内镜像源(临时设置)

rustup-init.exe安装时会下载相关工具不使用镜像会很慢,在rustup-init.exe 程序文件夹下使用 PowerShell设置临时环境变量:

#使用 PowerShell设置临时环境变量
$env:RUSTUP_DIST_SERVER="https://mirrors.aliyun.com/rustup"
$env:RUSTUP_UPDATE_ROOT="https://mirrors.aliyun.com/rustup/rustup"

常用的国内Rust镜像源:

  • 阿里云镜像:https://mirrors.aliyun.com/rustup
  • 清华大学镜像:https://mirrors.tuna.tsinghua.edu.cn/rustup
  • 上海交通大学镜像:https://mirrors.sjtug.sjtu.edu.cn/rust-static
4. 配置Cargo国内镜像源

rustup-init.exe安装完成后,为了加速后续的包下载,建议配置Cargo使用国内镜像源。

Windows系统配置步骤

  1. 在用户目录下创建或编辑 .cargo 文件夹(通常位于 C:\Users\用户名\.cargo
  2. 在该文件夹中创建 config.toml(推荐)config(老版本) 文件(无扩展名或.toml扩展名均可,新版本Cargo需要.toml扩展名的文件)
  3. 添加以下配置内容(下面阿里云和清华验证了可用,也可以是其他的源):
# 阿里云镜像(推荐)
#[source.crates-io]
#replace-with = 'aliyun'#[source.aliyun]
#registry = "https://mirrors.aliyun.com/crates.io-index" #不可用# 如果上面的地址无效,可以尝试使用:
#registry = "sparse+https://mirrors.aliyun.com/crates.io-index/" #可用# 清华大学镜像(备选)
[source.crates-io]
replace-with = 'tuna' #可用
# 
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"  #可用
# 或推荐使用:
# registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/" #未验证# 上海交通大学镜像(备选)
# [source.crates-io]
# replace-with = 'sjtu' #未验证
# 
# [source.sjtu]
# registry = "https://mirrors.sjtug.sjtu.edu.cn/crates.io-index" #未验证
# 或推荐使用:
# registry = "sparse+https://mirrors.sjtug.sjtu.edu.cn/crates.io-index/"#未验证

通过命令行快速创建配置

# PowerShell创建配置目录和文件
mkdir -Force "$HOME\.cargo"
Set-Content -Path "$HOME\.cargo\config" -Value @"
[source.crates-io]
replace-with = 'aliyun'[source.aliyun]
registry = "https://mirrors.aliyun.com/crates.io-index"
# 或使用 sparse 协议(推荐)
# registry = "sparse+https://mirrors.aliyun.com/crates.io-index/"
"@

验证配置是否生效

配置完成后,可以通过以下命令测试下载速度是否提升:

# 尝试安装一个小型包测试下载速度
cargo install cargo-edit# 如果需要卸载cargo-edit,可以使用命令
cargo uninstall cargo-edit

如果下载速度明显提升,说明镜像配置已经生效。

#运行以下命令列出所有通过 cargo install 安装的工具及其版本:
cargo install --list#在输出列表中查找 cargo-edit 条目,例如:
cargo-edit v0.12.0:cargo-addcargo-rmcargo-upgrade

如下所示列出了cargo-edit的版本:

在这里插入图片描述

STM32开发工具链安装

1. 安装ARM GCC工具链

作用:ARM GCC工具链是用于ARM架构处理器的编译工具集,包含以下核心组件:

  • arm-none-eabi-gcc:针对ARM架构的C/C++编译器,用于将C/C++代码编译为ARM指令集
  • arm-none-eabi-ld:链接器,用于将多个目标文件链接成一个可执行文件
  • arm-none-eabi-as:汇编器,将汇编代码转换为机器码
  • arm-none-eabi-gdb:调试器,用于调试ARM目标设备上运行的程序
  • arm-none-eabi-objcopy:用于转换二进制格式,如将ELF文件转换为HEX或BIN格式

使用场景:虽然Rust有自己的编译器,但在嵌入式开发中,ARM GCC工具链仍然

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898365.shtml

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

相关文章

动态规划合集——动态规划基本原理

动态规划合集——动态规划基本原理 动态规划原理1258:【例9.2】数字金字塔 动态规划原理深度优先搜索记忆化搜索动态规划(顺推)动态规划原理题解分析 滚动数组优化动态规划(逆推) 动态规划原理 从数塔问题出发理解动态…

如何让节卡机器人精准对点?

如何让节卡机器人精准对点? JAKA Zu 软件主界面主要由功能栏、开关栏、菜单栏构成。 菜单栏:控制柜管理,机器人管理与软件管理组成。主要功能为对控制柜关机、APP 设置、机器人本体设 置、控制柜设置、连接机器人和机器人显示等功能。 开关…

自动化测试工具-Playwright介绍和快速实例

Playwright 是什么 Playwright 是由 Microsoft 开发的开源自动化测试工具,专为现代 Web 应用设计。它支持 Chromium、Firefox 和 WebKit 内核的浏览器,能够跨平台(Windows、macOS、Linux)运行,提供强大的浏览器自动化能力,适用于测试、爬虫和监控等场景。 Playwright的…

软考程序员考试知识点汇总

软考程序员考试(初级资格)主要考察计算机基础理论、编程能力及软件开发相关知识。以下是核心知识点总结及备考建议: 一、计算机基础 数制与编码 二进制、八进制、十进制、十六进制转换原码、反码、补码表示(整数与浮点数&#xf…

实时视频分析的破局之道:蓝耘 MaaS 如何与海螺 AI 视频实现高效协同

一、蓝耘 MaaS 平台:AI 模型全生命周期管理的智能引擎 蓝耘 MaaS(Model-as-a-Service)平台是由蓝耘科技推出的 AI 模型全生命周期管理平台,专注于为企业和开发者提供从模型训练、推理到部署的一站式解决方案。依托云原生架构、高…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy(抽象策略类)​ Context(环境类 / 上下文类)​ ConcreteStrategy(具体策略类)​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

【算法day14】三数之和

三数之和 https://leetcode.cn/problems/3sum/description/ 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。…

优化器/模型参数/超参数

参数(Parameters) vs. 超参数(Hyperparameters) 1.1 参数(Parameters) 定义:模型中需要学习的变量,例如神经网络中的权重(Weight)和偏置(Bias&a…

10、STL中的unordered_map使用方法

一、了解 1、unordered_map(哈希) unordered_map是借用哈希表实现的关联容器。 访问键值对O(1),最坏情况O(n),例如哈希冲突严重时。【n是一个哈希桶的元素数量】 unordered_map特性 键值对存储&#xff…

C++ 头文件说明

如果一个程序足够大,代码功能很多,可以想象,不可能把代码写在一个cpp文件里。我们需要模块化,这样的好处很多,方便分工合作,可读性提高,调用也方便。 这个要怎么做呢? 很简单直接当…

Lambda 表达式的语法:

在 Java 中,Lambda 表达式(也称为匿名方法)是一种简洁的表示方法接口(Functional Interface)实现的方式。它是 Java 8 引入的特性,目的是提高代码的简洁性和可读性。 Lambda 表达式的语法: La…

C#零基础入门篇(18. 文件操作指南)

## 一、文件操作基础 在C#中,文件操作主要通过System.IO命名空间中的类来实现,例如File、FileStream、FileInfo等。 ## 二、常用文件操作方法 ### (一)文件读取 1. **使用File.ReadAllText方法读取文件内容为字符串** …

每日一题--内存池

内存池(Memory Pool)是一种高效的内存管理技术,通过预先分配并自主管理内存块,减少频繁申请/释放内存的系统开销,提升程序性能。它是高性能编程(如游戏引擎、数据库、网络服务器)中的核心优化手…

【Linux系统】Linux进程终止的N种方式

Linux系列 文章目录 Linux系列前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕结果异常3.4 程序异常退出 总结 前言 进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束…

正则表达式引擎深入探讨

正则表达式引擎(Regular Expression Engine)是正则表达式得以“活起来”的核心。它是一个精密的软件组件,负责接收正则表达式和输入文本,解析模式并执行匹配或替换操作,最终输出结果——可能是简单的“是否匹配”&…

java面试题,什么是动态代理?、动态代理和静态代理有什么区别?说一下反射机制?JDK Proxy 和 CGLib 有什么区别?动态代理的底层

什么是动态代理? 动态代理是在程序运行期,动态的创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。 在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解…

【工具类】Java的 LocalDate 获取本月第一天和最后一天

博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

嵌入式开发之STM32学习笔记day06

基于STM32F103C8T6的开发实践——从入门到精通01 1. 引言 STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器,广泛应用于嵌入式系统中。STM32F103C8T6是其中非常受欢迎的一款,凭借其强大的性能、丰富的外设接口和低廉的价格…

学习使用 Git 和 GitHub 开发项目的教程推荐

Git 和 GitHub 是现代软件开发中不可或缺的工具,无论你是个人开发者还是团队成员,掌握它们都能极大提升效率。本文精选了一系列优质教程资源,涵盖从基本 Git 命令到进阶多人协作的内容。这些教程既有文字形式,也有视频或交互式资源…

golang中的接口

1.简介 在go中的接口是以一种类型,一种抽象的类型。接口(interface)是一组函数method的集合,go中的接口不能包含任何变量。在go中接口中的所有方法都没有方法体,接口定义了一个对象的行为规范,只定义规范不实现。接口体现了程序的多态和高内聚低耦合的思想。go中的接口也是…