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
英文地址,請注明出處:http://en.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…