Go List

[Infineon] 緣起今生:英飛凌車規 MCU 全系支援 Rust 語言開發
2024-04-15

來源:英飛凌汽車電子生態圈

作者:英飛凌 Isaac, Sue

引言:

2023 年 3 月 7 日,英飛凌宣佈其 32 位元微控制器 AURIX™ 系列、TRAVEO™ T2G 系列和 PSoC™ MCU 系列支援 Rust 語言,英飛凌成為全球領先正式支持 Rust 的半導體公司。

那麼什麼是 Rust,為什麼要關注它?在本系列博文中,我們將探討 Rust 語言及其在嵌入式系統開發中的潛力,以及英飛凌為創建嵌入式 Rust 生態系統所做的努力。

英飛凌 Isaac

RUST 誕生背景

隨著軟體功能的日趨強大,軟體發展工作量隨之劇增,軟體發展團隊也不斷嘗試改進軟體的開發方法,旨在保證軟體功能,品質的情況下,減少成本,加快開發速度。

要實現上述目標,關鍵在於工作量 —— 在軟體發展中盡可能減少工作量。

軟體發展相關的工作量包括功能需求定義,功能需求的實現和測試,非功能需求,以及修復開發過程中引入的錯誤的工作量。

站在軟體發展者的角度,在實現軟體完整功能的情況下,如何減少開發的總工作量,唯一能夠減少的部分就是用於修正錯誤的工作量。

對軟體發展而言,一旦發現錯誤,就必須加以修正,以保證軟體產品品質。因此,要在不影響產品品質的前提下減少工作量,唯一的解決辦法就是防止開發過程中引入軟體錯誤。

在已知的軟體錯誤中,記憶體安全是軟體行業中最常見的錯誤類別[1][2]。然而,嵌入式軟體行業的標準語言 C 和 C++ 是非記憶體安全程式設計語言,這意味著嵌入式系統很容易出現這類錯誤。

減少這類錯誤的方法之一是在軟體測試、審查和驗證方面投入人力物力,而另一種思路是用記憶體安全語言取代現有語言[3]

雖然許多記憶體安全語言(如 Python、Java)已在軟體行業得到廣泛應用,但它們並不適合嵌入式系統。這是因為嵌入式系統對佔用空間、堆疊使用和性能有嚴格的限制(這是 C 和 C++ 的優勢)。

Rust 就是在這樣的背景下誕生的,它同時實現了高效性和記憶體安全。

Rust 是什麼

Rust 語言在 2006 年作為 Mozilla 員工 Graydon Hoare 的私人專案出現,而 Mozilla 於 2009 年開始贊助這個項目。第一個有版本號的 Rust 編譯器於 2012 年 1 月發佈。Rust 1.0 是第一個穩定版本,於 2015 年 5 月 15 日發佈[4]


Figure 1. Rust Logo

Rust 是一種在科技界大受歡迎的語言,Rust 已經連續七年(2016,2017,2018,2019,2020, 2021, 2022)在 Stack Overflow 開發者調查的“最受喜愛程式設計語言”評選專案中折取桂冠[5]

微軟用 Rust 重寫它的一些核心 windowns 庫,在 Android 13 中,21% 的新原生代碼使用了 Rust,此外,除 C 語言外,Rust 是唯一一種支援編寫 Linux 內核元件的語言,並被廣泛用於後端軟體、基礎設施和微服務。


Figure 2. rust-gentle-intro[6]

Rust 是一種系統程式設計語言,旨在成為無垃圾回收的記憶體安全語言。

Rust 使用了包含特定規則的“所有權”機制來管理記憶體,允許編譯器在編譯過程中執行檢查工作,而不會產生任何的運行時開銷。Rust 中的每一個值都有一個對應的變數作為它的所有者;在同一時間內,值有且僅有一個所有者;當所有者離開自己的作用域時,它持有的值就會被釋放掉。

Rust 使用“借用規則”實現對值進行可變和不可變引用:一個值可以有一個不可變引用或多個可變引用,但不能同時有兩個引用。編譯器中一個名為“借用檢查器”的特定部分會對此進行檢查。

Rust 中的生命週期規則:Rust 的每個引用都有自己的生命週期,它對應著引用保持有效性的作用域。生命週期最主要的目標在於避免懸垂引用,進而避免程式引用到非預期的資料。[7][8]

Cargo 是 Rust 的套裝軟體管理器[9],套裝軟體被稱為板條箱(Crate),cargo 有一個命令:cargo build,它能自動解決專案依賴關係。另外,使用 cargo test 命令能觸發單元測試,使用 cargo doc 命令還能生成文檔網頁。cargo 的文檔列出了 30 多條不同的命令,用於支援套裝軟體處理、構建文檔和測試。此外,cargo 還可用於安裝其他 Rust 二進位檔案,如工具 svd2rust。

嵌入式系統中的 Rust


Figure 3. Embedded Rust Architecture

Embedded Rust 的結構可以分為上述 5 層,如上圖所示,從下往上的順序,最底層是 MCU 硬體層,有各個資源,外設,由不同的晶片決定;第 2 層是 PAC,可以理解為晶片的標頭檔,裡面是各個寄存器的資訊;第 3 層是在 PAC 的基礎上對寄存器進行操作一些調度函數,裡面對寄存器進行直接操作;第 4 層是硬體抽象層,這一層的意義是從晶片強相關的驅動函數上抽象出來,提供一個通用介面,這個通用介面由最上層的軟體驅動層、軟體應用層去調用,實現對晶片資源的調度。

在 Embedded Rust 中,使用 svd2rust 工具將晶片資源的描述檔 SVD 檔轉化為 PAC,該介面具有良好的可讀性,便於審查和維護。此外,它還能防止出現錯誤,因為如果設置的值對該欄位無效,代碼將無法編譯。

RUST 與 C 語言的關係

Rust 對硬體的記憶體需求,堆疊使用,運行效率可以和 C 相媲美,具體的細節差異會和編譯優化等級,應用等有些許差異。

此外,Rust 有一個令人振奮的點,它可以和 C 語言共同使用。

Rust 和 C 代碼間的互用性始終取決於兩種語言間的資料轉換。為了實現互用性,在 stdlib 中,有兩個專用模組,叫做 std::ffi 和 std::os::raw 。

std::ffi 提供了一些工具去轉換更複雜的類型,比如 Strings,將 &str 和 String 映射成更容易和安全處理的 C 類型。

std::os::raw 處理底層的基本類型,這些類型可以被編譯器隱式地轉換,因為 Rust 和 C 之間的記憶體佈局足夠相似或相同[10]

Rust 是一種現代系統程式設計語言,可用于網路應用程式和裸機嵌入式系統。不過 Rust 的生態和函式程式庫資源等比較有限,而和 C 之間的互通性可以讓 Rust 更加便捷的應用到現有的軟體中,更快的投入使用。

因此,我們將長期生活在 Rust 和 C 語言的混合環境中。儘管 Rust 聲稱記憶體安全(這一點已經得到證實),但是 Rust 和 C 代碼的結合可能會導致安全的 Rust 生成的程式被不安全的 C 實現所違反的情況。為了確保 Rust 的安全性,有必要在 C 和 Rust 之間找到一個合理的分界點。

儘管如此,事實證明 Rust 是在嵌入式系統中替代 C 和 C++ 的合適候選語言,尤其是在新代碼開發方面。除記憶體安全外,Rust 語言的其他方面,如強大的類型系統和錯誤處理,也為 Rust 帶來了卓越的可讀性和可維護性。這提高了防錯能力,從而在不增加開發階段額外成本的情況下實現更安全的代碼。

英飛凌產品支援 Embedded Rust

軟體安全對汽車市場至關重要,Rust 程式設計語言內置記憶體安全軟體發展支援,是設計關鍵任務汽車軟體的重要推動力。英飛凌科技公司為在嵌入式領域創建 Rust 生態系統邁出了第一步。首先推出的是市場領先的 AURIX™ TC3xx 和 TRAVEO™ T2G 汽車 MCU。TRAVEO™ 使用官方 Rust 工具鏈和 Arm Cortex-M 目標編譯器,而英飛凌的工具合作夥伴 HighTec EDV-Systeme 則為 AURIX™ 開發了專用 Rust 編譯器。

Figure 4. AURIX™ and TRAVEO™ T2G

AURIX™ TC3xx 和 TRAVEO™ T2G 微控制器產品系列為功能安全和網路安全提供了廣泛的集成硬體功能。對 Rust 的支援是對這些硬體功能在軟體方面的補充。英飛凌為 AURIX™ 和 TRAVEO™ 提供了外設訪問板條(PAC),以實現對微控制器外設的本地訪問。

HighTec Rust 編譯器專為 AURIX™ TC3xx 和 TC4x 微控制器量身定制,利用先進的開源 LLVM 技術,為具有安全、可靠、高性能和快速部署要求的應用提供全套 Rust 語言特性,包括記憶體安全、併發性和互通性。

總結

在英飛凌的支援下, Rust 在嵌入式系統中的應用將變得更加廣泛,在與 Rust FOSS 社區合作的同時,規範 Rust 在行業中的使用。最後,Rust 的日益普及令人印象深刻,而英飛凌的嵌入式 Rust 生態系統無疑將説明 Rust 在業界得到更廣泛的應用。我們將進一步挖掘這一創新語言的潛力,並見證嵌入式 Rust 生態系統的發展。

今後,我們將推出更多博文探討 Rust,分享更多 Rust for MCU 的精彩資訊。

REFERENCES

[1]G. Thomas, “A proactive approach to more secure code”, available at https://msrc.microsoft.com/blog/2019/07/a-proactive-approach-to-more-secure-code/, accessed on 26.02.2023 13:38 CST

[2]J. Blessing, M. A. Specter, D. J. Weitzner, “You Really Shouldn't Roll Your Own Crypto: An Empirical Study of Vulnerabilities in Cryptographic Libraries”, arXiv, 2021

[3]Tiago Manczak, “Evaluation of Rust for Embedded Security Systems” Embedded World 2023

[4]https://blog.csdn.net/weixin_50964512/article/details/130138973 accessed on 26.01.2024 14:20 CST.

[5]https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages accessed on 26.01.2024 14:20 CST.

[6]https://stevedonovan.github.io/rust-gentle-intro/ accessed on 26.01.2024 14:20 CST.

[7]https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html accessed on 26.01.2024 14:20 CST.

[8]https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html accessed on 28.01.2024 15:20 CST.

[9]https://doc.rust-lang.org/cargo/index.html accessed on 26.01.2024 14:20 CST.

[10]https://xxchang.github.io/book/interoperability/index.html 29.01.2024 15:20 CST.

掃描二維碼,關注英飛凌汽車電子生態圈尋找更多應用或產品資訊

更多資訊請參考:www.infineon.com

追蹤英飛凌動態:Twitter - Facebook - LinkedIn

更多威健資訊請參考:www.weikeng.com.tw

追蹤威健動態: Facebook - LinkedIn