<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 汽車(chē)電子 > 設計應用 > 緣起今生:英飛凌車(chē)規MCU全系支持Rust 語(yǔ)言開(kāi)發(fā)

緣起今生:英飛凌車(chē)規MCU全系支持Rust 語(yǔ)言開(kāi)發(fā)

作者: 時(shí)間:2025-01-13 來(lái)源:英飛凌 收藏

引言

本文引用地址:http://dyxdggzs.com/article/202501/466294.htm

2023年3月7日,宣布其32位微控制器AURIX?系列、TRAVEO? T2G系列 和 PSoC? 系列支持 Rust語(yǔ)言,成為全球領(lǐng)先正式支持 的半導體公司。

那么什么是 Rust,為什么要關(guān)注它?在本系列博文中,我們將探討 語(yǔ)言及其在嵌入式系統開(kāi)發(fā)中的潛力,以及為創(chuàng )建嵌入式 生態(tài)系統所做的努力。

英飛凌  Isaac

RUST 誕生背景

隨著(zhù)軟件功能的日趨強大,軟件開(kāi)發(fā)工作量隨之劇增,軟件開(kāi)發(fā)團隊也不斷嘗試改進(jìn)軟件的開(kāi)發(fā)方法,旨在保證軟件功能,質(zhì)量的情況下,減少成本,加快開(kāi)發(fā)速度。

要實(shí)現上述目標,關(guān)鍵在于工作量——在軟件開(kāi)發(fā)中盡可能減少工作量。

軟件開(kāi)發(fā)相關(guān)的工作量包括功能需求定義,功能需求的實(shí)現和測試,非功能需求,以及修復開(kāi)發(fā)過(guò)程中引入的錯誤的工作量。

站在軟件開(kāi)發(fā)者的角度,在實(shí)現軟件完整功能的情況下,如何減少開(kāi)發(fā)的總工作量,唯一能夠減少的部分就是用于修正錯誤的工作量。

對軟件開(kāi)發(fā)而言,一旦發(fā)現錯誤,就必須加以修正,以保證軟件產(chǎn)品質(zhì)量。因此,要在不影響產(chǎn)品質(zhì)量的前提下減少工作量,唯一的解決辦法就是防止開(kāi)發(fā)過(guò)程中引入軟件錯誤。

在已知的軟件錯誤中,內存安全是軟件行業(yè)中最常見(jiàn)的錯誤類(lèi)別 [1][2] 。然而,嵌入式軟件行業(yè)的標準語(yǔ)言 C 和 C++ 是非內存安全編程語(yǔ)言,這意味著(zhù)嵌入式系統很容易出現這類(lèi)錯誤。

減少這類(lèi)錯誤的方法之一是在軟件測試、審查和驗證方面投入人力物力,而另一種思路是用內存安全語(yǔ)言取代現有語(yǔ)言 [3] 。

雖然許多內存安全語(yǔ)言(如 Python、Java)已在軟件行業(yè)得到廣泛應用,但它們并不適合嵌入式系統。這是因為嵌入式系統對占用空間、堆棧使用和性能有嚴格的限制(這是C和C++的優(yōu)勢)。

Rust就是在這樣的背景下誕生的,它同時(shí)實(shí)現了高效性和內存安全。

Rust 是什么

Rust語(yǔ)言在2006年作為 Mozilla 員工 Graydon Hoare 的私人項目出現,而 Mozilla 于 2009 年開(kāi)始贊助這個(gè)項目。第一個(gè)有版本號的 Rust 編譯器于2012 年 1 月發(fā)布。Rust 1.0 是第一個(gè)穩定版本,于 2015年5月15日發(fā)布 [4] 。

Figure 1. Rust Logo

Rust是一種在科技界大受歡迎的語(yǔ)言,Rust已經(jīng)連續七年(2016,2017,2018,2019,2020, 2021, 2022)在Stack Overflow開(kāi)發(fā)者調查的“最受喜愛(ài)編程語(yǔ)言”評選項目中折取桂冠 [5] 。

微軟用Rust重寫(xiě)它的一些核心windowns庫,在 Android 13 中,21% 的新原生代碼使用了 Rust,此外,除 C 語(yǔ)言外,Rust 是唯一一種支持編寫(xiě) Linux 內核組件的語(yǔ)言,并被廣泛用于后端軟件、基礎設施和微服務(wù)。

Figure 2. rust-gentle-intro [6]

Rust是一種系統編程語(yǔ)言,旨在成為無(wú)垃圾回收的內存安全語(yǔ)言。

Rust使用了包含特定規則的“所有權”機制來(lái)管理內存,允許編譯器在編譯過(guò)程中執行檢查工作,而不會(huì )產(chǎn)生任何的運行時(shí)開(kāi)銷(xiāo)。Rust中的每一個(gè)值都有一個(gè)對應的變量作為它的所有者;在同一時(shí)間內,值有且僅有一個(gè)所有者;當所有者離開(kāi)自己的作用域時(shí),它持有的值就會(huì )被釋放掉。

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

Rust中的生命周期規則:Rust的每個(gè)引用都有自己的生命周期,它對應著(zhù)引用保持有效性的作用域。生命周期最主要的目標在于避免懸垂引用,進(jìn)而避免程序引用到非預期的數據。 [7][8]

Cargo 是 Rust 的軟件包管理器 [9] ,軟件包被稱(chēng)為板條箱(Crate),cargo 有一個(gè)命令:cargo build,它能自動(dòng)解決項目依賴(lài)關(guān)系。另外,使用 cargo test 命令能觸發(fā)單元測試,使用 cargo doc 命令還能生成文檔網(wǎng)頁(yè)。cargo 的文檔列出了 30 多條不同的命令,用于支持軟件包處理、構建文檔和測試。此外,cargo 還可用于安裝其他 Rust 二進(jìn)制文件,如工具 svd2rust。

嵌入式系統中的 Rust

Figure 3. Embedded Rust Architecture

Embedded Rust 的結構可以分為上述5層,如上圖所示,從下往上的順序,最底層是硬件層,有各個(gè)資源,外設,由不同的芯片決定;第2層是PAC,可以理解為芯片的頭文件,里面是各個(gè)寄存器的信息;第3層是在PAC的基礎上對寄存器進(jìn)行操作一些調度函數,里面對寄存器進(jìn)行直接操作;第4層是硬件抽象層,這一層的意義是從芯片強相關(guān)的驅動(dòng)函數上抽象出來(lái),提供一個(gè)通用接口,這個(gè)通用接口由最上層的軟件驅動(dòng)層、軟件應用層去調用,實(shí)現對芯片資源的調度。

在Embedded Rust中,使用svd2rust工具將芯片資源的描述文件SVD文件轉化為PAC,該接口具有良好的可讀性,便于審查和維護。此外,它還能防止出現錯誤,因為如果設置的值對該字段無(wú)效,代碼將無(wú)法編譯。

RUST 與 C 語(yǔ)言的關(guān)系

Rust對硬件的內存需求,堆棧使用,運行效率可以和C相媲美,具體的細節差異會(huì )和編譯優(yōu)化等級,應用等有些許差異。

此外,Rust有一個(gè)令人振奮的點(diǎn),它可以和C語(yǔ)言共同使用。

Rust和C代碼間的互用性始終取決于兩種語(yǔ)言間的數據轉換。為了實(shí)現互用性,在stdlib中,有兩個(gè)專(zhuān)用模塊,叫做std::ffi和std::os::raw 。

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

std::os::raw處理底層的基本類(lèi)型,這些類(lèi)型可以被編譯器隱式地轉換,因為Rust和C之間的內存布局足夠相似或相同 [10] 。

Rust 是一種現代系統編程語(yǔ)言,可用于網(wǎng)絡(luò )應用程序和裸機嵌入式系統。不過(guò)Rust的生態(tài)和函數庫資源等比較有限,而和C之間的互通性可以讓Rust更加便捷的應用到現有的軟件中,更快的投入使用。

因此,我們將長(cháng)期生活在 Rust 和 C 語(yǔ)言的混合環(huán)境中。盡管 Rust 聲稱(chēng)內存安全(這一點(diǎn)已經(jīng)得到證實(shí)),但是Rust 和 C 代碼的結合可能會(huì )導致安全的 Rust 生成的程序被不安全的 C 實(shí)現所違反的情況。為了確保 Rust 的安全性,有必要在 C 和 Rust 之間找到一個(gè)合理的分界點(diǎn)。

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

英飛凌產(chǎn)品支持Embedded Rust

軟件安全對汽車(chē)市場(chǎng)至關(guān)重要,Rust 編程語(yǔ)言?xún)戎脙却姘踩浖_(kāi)發(fā)支持,是設計關(guān)鍵任務(wù)汽車(chē)軟件的重要推動(dòng)力。英飛凌科技公司為在嵌入式領(lǐng)域創(chuàng )建 Rust 生態(tài)系統邁出了第一步。首先推出的是市場(chǎng)領(lǐng)先的 AURIX? TC3xx 和 TRAVEO? T2G 汽車(chē) 。TRAVEO? 使用官方 Rust 工具鏈和 Arm Cortex-M 目標編譯器,而英飛凌的工具合作伙伴 HighTec EDV-Systeme 則為 AURIX? 開(kāi)發(fā)了專(zhuān)用 Rust 編譯器。

Figure 4. AURIX? and TRAVEO? T2G

AURIX? TC3xx 和 TRAVEO? T2G 微控制器產(chǎn)品系列為功能安全和網(wǎng)絡(luò )安全提供了廣泛的集成硬件功能。對 Rust 的支持是對這些硬件功能在軟件方面的補充。英飛凌為 AURIX? 和 TRAVEO? 提供了外設訪(fǎng)問(wèn)板條 (PAC),以實(shí)現對微控制器外設的本地訪(fǎng)問(wèn)。

HighTec Rust 編譯器專(zhuān)為 AURIX? TC3xx 和 TC4x 微控制器量身定制,利用先進(jìn)的開(kāi)源 LLVM 技術(shù),為具有安全、可靠、高性能和快速部署要求的應用提供全套 Rust 語(yǔ)言特性,包括內存安全、并發(fā)性和互操作性。

總結

在英飛凌的支持下, Rust 在嵌入式系統中的應用將變得更加廣泛,在與 Rust FOSS 社區合作的同時(shí),規范 Rust 在行業(yè)中的使用。最后,Rust 的日益普及令人印象深刻,而英飛凌的嵌入式 Rust 生態(tài)系統無(wú)疑將幫助 Rust 在業(yè)界得到更廣泛的應用。我們將進(jìn)一步挖掘這一創(chuàng )新語(yǔ)言的潛力,并見(jiàn)證嵌入式 Rust 生態(tài)系統的發(fā)展。

今后,我們將推出更多博文探討 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.



關(guān)鍵詞: 英飛凌 MCU Rust

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>