rust嵌入式开发零基础入门教程(二)

本教程的第二部分,我们将深入理解 Rust 语言的核心概念——所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)。这些是 Rust 内存安全的基础,也是初学者理解 Rust 最关键的部分。理解它们后,我们还将探讨如何准备一块实际的开发板,为真正点亮 LED 做准备。


4. Rust 核心概念:所有权、借用和生命周期

Rust 最大的特点就是它的内存安全模型,它在编译时而不是运行时进行内存管理,从而避免了 C/C++ 中常见的内存错误,如空指针引用、数据竞争等。这主要通过三个核心概念实现:所有权、借用和生命周期

4.1 所有权 (Ownership)

所有权是 Rust 的核心特性。 每个值在 Rust 中都有一个所有者 (owner)

  • 规则 1: 每个值都有且只有一个所有者。

  • 规则 2: 当所有者超出其作用域 (scope) 时,值会被丢弃 (dropped),其内存也会被自动回收。

示例:

fn main() {let s1 = String::from("hello"); // s1 拥有 "hello" 这个字符串数据let s2 = s1; // 这里发生了“移动”(move),s1 的所有权被转移给了 s2// println!("{}", s1); // 错误!s1 已经不再拥有数据了,会报错:value borrowed here after moveprintln!("{}", s2); // 正确,s2 现在是数据的所有者
} // s2 超出作用域,"hello" 内存被释放

在嵌入式开发中,这意味着你不再需要手动调用 free()delete,也不用担心忘记释放内存而导致内存泄漏。Rust 编译器会在编译时替你处理好这一切。

4.2 借用 (Borrowing)

如果你不想转移所有权,但又需要使用某个值,该怎么办?这就是借用的作用。你可以通过引用 (&) 来借用一个值,而不是转移它的所有权。

  • 规则 1: 在任意给定时间,你只能拥有一个可变引用 (&mut T) 或任意数量的不可变引用 (&T)。

  • 规则 2: 引用必须总是有效的。

示例:

fn main() {let mut s = String::from("hello"); // s 是可变的 String// 不可变借用:可以有多个let r1 = &s; // r1 借用了 slet r2 = &s; // r2 也借用了 sprintln!("{} and {}", r1, r2); // 正确,可以同时使用多个不可变引用// s 和 r1, r2 不再被使用后,这些不可变借用结束// 可变借用:只能有一个let r3 = &mut s; // r3 可变地借用了 sr3.push_str(", world!"); // 可以通过 r3 修改 s 的值println!("{}", r3); // 正确// println!("{}", s); // 错误!当 r3 还在活跃时,不能再使用 s,因为可变借用是独占的。// 如果这里需要使用 s,r3 必须先不再被使用或超出作用域。
}

在嵌入式开发中,借用规则对于硬件寄存器访问和**共享资源(如外设)**的管理至关重要。它能防止你在同一时间对同一个寄存器进行不安全的并发修改,或者在读取的同时又尝试写入。

4.3 生命周期 (Lifetimes)

生命周期是 Rust 编译器用来确保所有借用都是有效的机制。 它们表示引用能够保持有效的作用域。

  • 规则: 引用的生命周期不能超过其所引用值的生命周期。

示例:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() {x} else {y}
}fn main() {let string1 = String::from("abcd");let string2 = "xyz"; // 字面量 'static 生命周期// 这里,longest 函数返回的引用,其生命周期会是 string1 和 string2 中较短的那个。// 'a 标注确保了编译器在编译时检查引用的有效性。let result = longest(&string1, &string2);println!("The longest string is {}", result);
}

在嵌入式开发中,生命周期通常在处理外设驱动程序裸机内存区域时显得尤为重要。例如,如果你有一个引用指向某个外设寄存器,生命周期会确保这个引用在寄存器被释放或重置之前一直是有效的,从而避免访问已经不存在的内存。


5. 准备你的实际开发板

现在你对 Rust 的核心概念有了基本理解,是时候准备一块真实的微控制器板,让你的 Rust 代码在硬件上跑起来了!

5.1 选择一块开发板

对于初学者,我强烈推荐使用一个内置调试器的开发板,例如:

  • STM32 Nucleo 系列: (推荐,价格适中,资料丰富,有内置 ST-Link 调试器)

    • 例如:STM32F401RE Nucleo-64STM32F411RE Nucleo-64。它们通常基于 Cortex-M4 处理器。

  • STM32 Discovery 系列: 功能更强大,也通常内置调试器。

  • Microbit (V2): 尽管它内置调试器(DAPLink),但其 Cortex-M4F 处理器相对较小,且生态系统更偏向教育。

  • Raspberry Pi Pico: 基于 RP2040 (双 Cortex-M0+),价格非常便宜,内置调试(DAPLink)支持,生态也发展迅速。

购买建议: 如果你还没有开发板,**一块带有 ST-Link 或 DAPLink 调试器的 STM32 Nucleo/Discovery 板是一个非常好的起点。**它们可以直接通过 USB 连接到电脑进行烧录和调试,无需额外购买调试器。

5.2 安装板级工具和驱动

一旦你有了开发板,你需要安装一些工具和驱动程序,以便你的电脑能与开发板通信。

  1. 安装板级驱动:

    • ST-Link 驱动 (针对 STM32 Nucleo/Discovery): 访问 STMicroelectronics 官网,搜索并下载安装 ST-Link 驱动

      • Windows 用户通常需要安装驱动。

      • Linux 和 macOS 通常自带 libusb,但可能需要安装额外的 udev 规则来允许非 root 用户访问 USB 设备(具体请搜索 "ST-Link udev rules Linux")。

    • DAPLink / J-Link 驱动 (如果你使用 Microbit V2 或其他): DAPLink 通常是免驱动的,因为它模拟了一个 USB 大容量存储设备。J-Link 需要安装 SEGGER 提供的驱动。

  2. 安装 openocd (开放片上调试器): openocd 是一个用于调试和烧录微控制器的开源工具。

    • Linux (Debian/Ubuntu): sudo apt install openocd

    • macOS (Homebrew): brew install openocd

    • Windows: 从 OpenOCD 的 GitHub 页面或官方下载渠道获取预编译的二进制文件,并将其路径添加到系统环境变量 PATH 中。

  3. 验证 openocd 安装: 将你的开发板通过 USB 线连接到电脑,然后在终端中运行:

    openocd --version
    

    如果显示版本号,说明安装成功。要测试它是否能识别你的板子,你可以尝试运行针对你板子的配置命令(例如:openocd -f interface/stlink.cfg -f target/stm32f4x.cfg,具体配置取决于你的板子型号)。

5.3 烧录和调试工具的额外配置 (可选但推荐)

第一部分 我们安装了 probe-run,它是一个方便的工具,可以结合 openocdGDB 来直接烧录和运行 Rust 嵌入式程序。

确保 .cargo/config.toml 文件中配置了 runner。如果你使用了 cortex-m-quickstart 模板,这个文件通常已经配置好了,类似这样:

Ini, TOML

# .cargo/config.toml
[build]
target = "thumbv7em-none-eabihf" # 或者你的目标[target.thumbv7em-none-eabihf] # 或者你的目标
runner = "probe-run --chip STM32F401RETx" # 替换为你的芯片型号# 例如:STM32F411RETx, nRF52840 etc.

如何找到你的芯片型号? 通常印在微控制器芯片本体上,或者查看开发板的说明书。例如,STM32F401RE Nucleo-64 板上是 STM32F401RET6。你只需要提供前缀,例如 STM32F401RETx


下一步

现在,你已经理解了 Rust 的核心内存安全概念,并且准备好了你的实际开发板和必要的工具。

第三部分,我们将编写一个真正的嵌入式 "Hello, LED!" 程序,并将其烧录到你的开发板上,亲眼看到 Rust 代码在硬件上运行的效果!

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

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

相关文章

【黑产大数据】2025年上半年互联网黑灰产趋势年度总结

2025年上半年&#xff0c;互联网黑灰产攻击持续演化&#xff0c;呈现出更隐蔽、更智能、更产业化的趋势。黑灰产从业人员数量继续增长&#xff0c;攻击资源、技术与作案场景全面升级。整体来看&#xff0c;2025年上半年黑灰产行业发生的几大事件&#xff0c;也时刻印证了黑灰产…

低代码/无代码平台如何重塑开发生态

低代码/无代码平台通过降低技术门槛、提升开发效率、推动业务和IT深度融合重塑开发生态。 具体而言&#xff0c;低代码/无代码平台极大降低了应用开发的技术门槛&#xff0c;使得非专业人员也能轻松构建业务应用。此外&#xff0c;它们通过可视化的开发模式&#xff0c;大幅提升…

ICA学习(2)

1.公式推导1.1两个问题ICA算法会带来2个不确定性&#xff1a;幅值不确定性和顺序不确定性。1.2 推导观测数据 x 是盲源 s 的线性混合&#xff1a;x As (1)此时&#xff0c;W矩阵是未知的&#xff0c;ICA算法的目的便是找到一个最优的矩阵W&#xff0c;实现对矩阵…

【愚公系列】《MIoT.VC》002-构建基本仿真工作站(布局一个基本工作站)

💎【行业认证权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域…

网络协议相关

OSI七层模型包含物理层、数据链路层、网络层、传输层、会话层、表示层和应用层;TCP/IP四层模型将其简化为网络接口层、网络层、传输层和应用层;映射关系:例如OSI的物理层和数据链路层对应TCP/IP的网络接口层&#xff0c;主要处理MAC地址寻址和物理介质传输。协议模型对比两者的…

【CNN】LeNet网络架构

1.MLP多层感知机MLP&#xff08;Multilayer Perceptron&#xff09;&#xff0c;也是人工神经网络&#xff08;ANN&#xff0c;Artificial Neural Network&#xff09;&#xff0c;是一种全连接多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种前馈神经网络…

VSCODE 禁用git 功能

第一步&#xff0c;打开设置第二步&#xff0c;搜 git:Enabled

Spring Boot05-热部署

一、Spring Boot 启动热部署Spring Boot 启动“热部署&#xff08;Hot Deployment&#xff09;”&#xff0c;可以让你在不重启项目的情况下快速看到代码变更的效果&#xff08;特别是前后端调试阶段&#xff09;。1-1、什么是热部署&#xff1f;热部署是指&#xff1a;修改 Ja…

网站域名备案和服务器有关系吗

域名备案的那些事儿域名备案&#xff0c;简单来说&#xff0c;就是把你的网站信息登记到相关管理部门那里。这就好比你开个小店&#xff0c;得去工商局登记一下&#xff0c;让人家知道你在干啥。根据我国相关规定&#xff0c;凡是使用大陆境内服务器提供服务的网站&#xff0c;…

2025华为ODB卷-推荐多样性200分-三语言题解

📌 华为OD机试真题精选 2025B卷合集 推荐多样性200分 问题描述 A先生正在设计一个推荐系统,需要考虑多样性,要求从多个列表中选择元素。系统一次性需要返回 N N N 屏数据(窗口数量),每屏展示 K K

ZeroMQ源码深度剖析:网络机制与性能优化实战

目录1 发布订阅过滤的高效实现2 ZeroMQ的核心优势3 常见Socket类型及应用4 异步连接实现机制5 断线重连机制6 高水位线&#xff08;HWM&#xff09;深度解析7 消息丢失与错误处理8 消息帧&#xff08;Frame&#xff09;高级特性9 高效性实现原理10 无锁消息队列设计11 零拷贝实…

[数据库]Neo4j图数据库搭建快速入门

[数据库]图数据库基础入门 概念 图数据库是一种使用图结构&#xff08;节点、边和属性&#xff09;进行数据存储和查询的数据库管理系统。与传统的关系型数据库不同&#xff0c;图数据库专注于实体之间的关系&#xff0c;特别适合处理高度互联的数据。常见的图数据库包括&#…

本地数据库有数据,web页面无信息显示,可能是pymysql的版本问题【pymysql连接本地数据库新旧版本的区别】

pymysql连接本地数据库新旧版本的区别新版本老版本python web下的settings文件 新版本 的pymysql 连接本地数据库&#xff1a; mysql_conn pymysql.connect(hostself.conn_infos["HOST"],userself.conn_infos["USER"],passwordself.conn_infos["PAS…

【Linux-云原生-笔记】Haproxy相关

一、概念HAProxy&#xff08;High Availability Proxy&#xff09;是一款开源的高性能 TCP/HTTP 负载均衡器 和 反向代理 软件&#xff0c;被广泛应用于构建高可用、高并发的现代网络架构。核心功能&#xff1a;负载均衡&#xff08;Load Balancing&#xff09;支持四层&#x…

智慧能源合同解决方案

01 能源行业合同管理核心痛点 1&#xff09;长期风险沉淀与动态环境失配&#xff1a;合同稳定性的根本矛盾 超长周期下的风险累积&#xff1a;20~30年的购售电协议&#xff08;PPA&#xff09;、EPC合同需覆盖技术迭代&#xff08;如光伏组件衰减率&#xff09;、政策转向&am…

MeterSphere平台,接口自动化脚本编写常用操作

文章目录1. 前置准备2. 项目环境设置3. 创建接口3.1 创建接口API3.2 测试接口API3.3 设置接口case4. 场景接口自动化4.1 创建自动化场景4.2 场景化操作说明4.2.1 设置脚本场景变量4.2.2 接口列表导入4.2.3 场景导入4.2.4 自定义请求4.2.5 事务控制器4.2.6 等待控制器4.2.7 循环…

C 语言介绍

C语言是由Dennis Ritchie开发的&#xff0c;用于创建与硬件设备&#xff08;例如驱动程序&#xff0c;内核等&#xff09;直接交互的系统应用程序。C编程被认为是其他编程语言的基础&#xff0c;这就是为什么它被称为母语。C是一种功能强大的通用编程语言。它可以用于开发操作系…

AI产品经理面试宝典第48天:产品设计与用户体验优化策略

1. 用户体验分析与产品设计逻辑 1.1 问:如何通过用户反馈优化AI产品体验? 答: 建立反馈闭环机制:通过应用内评分、用户访谈、行为埋点三维度收集数据,例如某语音助手产品通过NLP分析用户纠错语句,发现"误唤醒"问题占比37%; 优先级排序模型:采用Kano模型量化…

基于springboot的在线教育系统(源码+论文)

一、开发环境 本在线教育系统主要采用以下技术栈进行开发&#xff1a; B/S结构&#xff1a;基于浏览器/服务器模式&#xff0c;便于用户通过互联网访问系统&#xff0c;无需安装客户端软件。Spring Boot框架&#xff1a;简化了新Spring应用的初始搭建及开发过程&#xff0c;提…

Ubuntu 系统上部署禅道

在 Ubuntu 系统上部署禅道可以按照以下步骤进行&#xff0c;以下是基于禅道开源版的部署流程&#xff1a; 1. 安装必要依赖 首先安装禅道运行所需的环境&#xff08;以 Ubuntu 20.04/22.04 为例&#xff09;&#xff1a; bash # 更新系统包 sudo apt update && sudo…