語法和基本概念
Rust 的基本語法的入門并不難,如常見的基礎(chǔ)變量定義、表達(dá)式、判斷邏輯、循環(huán)邏輯、函數(shù)等基礎(chǔ)語法基本上與其他語言相似,看過一兩個代碼后就能習(xí)慣 Rust 的語法。因此基礎(chǔ)語法并不會有太多障礙。熟悉基礎(chǔ)語法后就能編寫一些簡單命令工具、數(shù)據(jù)處理工具等,甚至基于一些開源GUI框架編寫一些GUI應(yīng)用。
對于 Rust 高級的知識,如范型、異步、生命周期等概念則需要去深入理解。Rust 的學(xué)習(xí)曲線因人而異,不同背景的人對于 Rust 語言的一些概念理解接受速度不同。比如
- C 語言背景,對堆、棧、生命周期的概念理解可能比較快,但對范型、范式編程、異步Future、零成本抽象等概念理解就稍微難。
- 對于Java:對 trait,范型、錯誤處理、并發(fā)編程的理解比較快,而對堆棧概念理解較弱
- 對于Python來說,模塊化編程、類概念有優(yōu)勢。
陳天老師有個總結(jié) Rust 學(xué)習(xí)曲線圖,可以看出 Rust 從入門到精通需要經(jīng)過三個奔潰時刻,在學(xué)習(xí)的過程中會發(fā)現(xiàn)對 Rust 的掌握不深,不要擔(dān)心,在嵌入式 Rust 開發(fā)中,通常不會要求完全掌握這些 Rust 技能,在日常學(xué)習(xí)中,通過與編譯器不斷斗爭中,會慢慢加深對這些概念的理解,直至豁然開朗。
Rust 學(xué)習(xí)之路
單片機外設(shè)使用
在熟悉 Rust 基礎(chǔ)語法后,理解一些常用庫的的使用、常用開源 crate 的功能后,就可以開始入門單片機的外設(shè)開發(fā)。
由于目前嵌入式 Rust的生態(tài)并不太豐富,大多數(shù)的芯片公司僅提供傳統(tǒng)的 C 版本的外設(shè)庫,可喜的是,目前仍然有一些常見的單片機已經(jīng)提供了 Rust 的外設(shè)庫,如 STM32
、ESP32
、GD32
、NRF52XX
等。如果你喜歡的單片機沒有提供 Rust 外設(shè)庫,也不用擔(dān)心,可以自己編寫一些外設(shè)庫,甚至也能使用寄存器級別的開發(fā)(請放心,哪怕是寄存器級別的開發(fā),也能保證一定安全和高效, 比同等級別的 C 寄存器級的開發(fā)簡單更多)。
個人建議可以從已經(jīng)支持的 Rust 外設(shè)庫的單片機入門,如NRF52840
、STM32
、rp2040
等。通過調(diào)用廠商提供的外設(shè)庫接口,快速熟悉 Rust 的編程風(fēng)格、API風(fēng)格,感受與 C 嵌入式編程的差異。
在拿到單片機開發(fā)板后,快速根據(jù)庫文檔搭建編譯和下載環(huán)境,然后打印hello world
、點亮 led 燈。這些 Rust 例程跑起來的難度也許比C的例程更加低, 還算比較新手友好。在這個階段的學(xué)習(xí)中,你會發(fā)現(xiàn) Rust 外設(shè)驅(qū)動庫的實現(xiàn)方式與C相差非常大,甚至你有很多疑問,不太明白為什么驅(qū)動要這樣設(shè)計,不明白不用太焦慮, 這一階段你只要能了解外設(shè)接口怎么使用即可,能讓各個外設(shè)正常的工作起來。
在下一個階段中,你需要去了解pac
(外設(shè)訪問控制接口)的使用,制作原理、可以嘗試自己利用 svd2rust
工具自己制作一個單片機的 pac crate。然后自己嘗試通過 pac
crate 接口來讀寫芯片的寄存器。然后可以了解單片機是怎么從復(fù)位后運行到 Rust 的 main函數(shù),具體你需要去閱讀 cortex-m-rt
和 cortex-m
。你會發(fā)現(xiàn) Rust 的啟動過程竟然與C如此相似,但讓一個單片機能運行起來更加簡單。如果你很細(xì)心,你會繼續(xù)探究 build.rs
代碼的功能和編寫邏輯,發(fā)現(xiàn) Rust 工具的奧秘,從而能基于這些知識來開啟下一個階段。
在第三個階段中,你可以嘗試自己去編寫一些芯片的 Rust 外設(shè)驅(qū)動庫,如果國產(chǎn)的一些芯片,先模仿NRF52840
、ESP32
、STM32
等芯片的庫,再次感受驅(qū)動設(shè)計的思想。開始可以基于一些簡單的芯片,如 Cortex-M0
內(nèi)核的芯片,方便快速完成整個芯片驅(qū)動庫的編寫。最后將你編寫的Rust 外設(shè)庫開源出去,通過大家的意見、不斷改善和優(yōu)化,
生態(tài)
很多人對 Rust 嵌入式的生態(tài)持較悲觀的態(tài)度,認(rèn)為 Rust 目前沒有太多的輪子,需要自己去造。然后我個人在兩年的 Rust 嵌入式開發(fā)中感受到,目前 Rust 的生態(tài)已經(jīng)足夠大部分的工程實踐了。在crate.io
上有大量優(yōu)秀的開源 crate 能被工程中所使用。一些單片機的外設(shè)庫、傳感器驅(qū)動庫、LCD驅(qū)動、圖形顯示框架、IIC/SPI/UART 通信驅(qū)動、操作系統(tǒng)等都有比較好的開源 crate, 且質(zhì)量還不錯, 加上 Rust 官方對嵌入式的支持,開放了一些抽象庫,讓驅(qū)動移植變得非常簡單便捷,例如傳感器庫能輕松的在不同單片機中使用。
另外對于書籍文檔類資源,Rust 嵌入式也開始有很多詳細(xì)的公開資料,如ESP32 的 rust 資料非常詳細(xì),足以支撐 Rust 嵌入式的學(xué)習(xí)和開發(fā)了。
總結(jié)
對于這些挑戰(zhàn),其實跨越他們并不困難,一定要有信心去面對,同時也要適當(dāng)放下困難、不要力圖一下理解某些概念,要講究循序而漸進(jìn),自然豁然而開朗。
附錄
svd2rust
awesome-embedded-rust
cortex_m_quickstart
Embedded Rust on Espressif