在 2021 年要如何開發 Rust 裸機程式:函式庫

這應該是裸機程式的最後一篇了,回顧一下第一篇所說,到現代幾個進化的點,

  1. Rustup
  2. cargo config
  3. rlibc
  4. 用 library

前三點我們已經看過了

  1. 用 rustup 來安裝 target,雖然我後來想了一下,覺得這並不是 rust 勝過 C 而是 LLVM 勝過 gcc,rust 只是站在 LLVM 的肩膀上所以看得更遠而已。
  2. cargo config 就如前文所述,利用 .cargo/config 來設定編譯目標,以及連結時的 linker script ,只要套用不同的 config 就能對不同目標編譯。
  3. rlibc 可能比較隱晦一點,但 rlibc 要提供的 memset/memcpy/memmove ,在 core::ptr 裡面已經提供了核心的實作了,所以不需要再引入 rlibc。

最後就是用 library 啦,在前面的篇章都沒提到這個,為什麼?

...

在 2021 年要如何開發 Rust 裸機程式:.bss 和 .data

現在的 main 程式現在只能使用 stack variable,還不能使用 static 變數,因為我們在 linker 內只放了 .text 區段, static 變數 所用的 .data(已初始化)、.bss(未初始化) 都還沒準備。

...

在 2021 年要如何開發 Rust 裸機程式:分離核心與 exception handler

我們的最小程式現在能進到 reset_handler 了,但重要的是能進到使用者寫的 main 函式,不然這個 kernel 也沒用。 我們先把我們的 main.rs 改成 lib.rs,rt 編成 library 之後,類似 FreeRTOS 的感覺,再搭配使用者寫的 main.rs 編成完整的執行檔; 使用者寫的 main.rs 可以呼叫 kernel 提供的服務函式。

...

在 2021 年要如何開發 Rust 裸機程式:reset handler

我們的目標先訂在 arm cortex m3 的處理器, m3 處理器參考 arm 官方的開發文件, 在 arm 處理器一上電的時候,會從記憶體位址 0x0 的地方讀取兩個值:

  1. 0x0 是初始的 stack pointer value。
  2. 0x4 是 reset exception handler。
...

在 2021 年要如何開發 Rust 裸機程式:設定與空殼

其實標題應該要寫成「在 2021 裡用 Rust 開發裸機程式是種怎樣的體驗」

故事是這樣子的,很久很久以前我曾經寫過一篇文, 胡亂攪了一陣,弄出一個只是會動的 Rust 嵌入式系統,時隔這麼久,Rust 的生態也完全不一樣了,最近因為剛好比較閒就花了點時間再看看, 結果找到別人連書都寫好了呢w (看書中的 rustc 成書年代應該是 2018 年左右)。

這篇大概會是照著上面這本書的操作記錄,不知道會整理成多少篇,讓我們拭目以待。

...

筆記整理 FreeRTOS Context Switch

故事是這樣子的,很早以前大概 2014/2015 的時候,就曾經因為傳說中的 jserv 大大的關係,聽聞傳說中的 FreeRTOS,然後也有不深入地小玩了一下。
最近又因為到前公司戀戀科技的專案,竟然又接觸到(已經被 Amazon 收購的) FreeRTOS ,花了點時間把 FreeRTOS 移植到某個新的 ARM 平台, 在移植的時候也稍微仔細的 trace 了 FreeRTOS 的程式碼,順便就寫了點筆記,整理一下貼上來。

...

使用 Rust 開發 WebAssembly 程式 - 3 Gameboy

在我們看過兩個官方文件的範例之後,可以開始寫點真正的 code 了,如之前所言,我們要把 gameboy 移植到 WebAssembly 上面, 這篇文可以說明這到底有多簡單,我覺得已經很接近所謂的 “Code Once, Run Anywhere” 了。

...

使用 Rust 開發 WebAssembly 程式 - 2 Game of Life

game of life 來展示 Rust 跟 WebAssembly 的開發真的是個很好的例子, 可以充分展現 javascript 和 wasm 間如何傳遞資料,這篇我認為會是學習開發 Rust/WebAssembly 的精華所在。

...

使用 Rust 開發 WebAssembly 程式 - 1 Hello World

故事是這樣子的,很早之前寫了 Rust/Amethyst 系列文, 最後把這個系列文拿去投稿了 2020 年的 MOPCON, 在投稿的時候,為了跟以網路為主題的 MOPCON 有所連結,我刻意的在最後一部分加上 rust/webassembly 的介紹, 但其實也沒有介紹得很深入,比較像為了騙被接受所以加進去的內容。
為了贖罪,就來寫幾篇文深入介紹一下 rust 開發 WebAssembly 程式。

先附一張最後的成果圖,沒錯,把之前開發的 Rust Gameboy emulator 移植到 WebAssembly 讓它在瀏覽器裡面執行。 wasm gameboy tetris

...

Rust Gameboy Emulator Sprite/Joypad

故事是這樣子的,距離我上一篇 2020/12/20 發的 rust gameboy emulator 技術文之後, 已經過了兩個月了,中間除了整理積存已久的天能舊文(還有過年),感覺 blog 已經荒廢了QQ。

其實不是的,中間也花了很多時間在 debug 我的 rust gameboy emulator,只是堪稱進度緩慢,主要的原因在於雖然 emulator 可以運作, 卻缺乏 debug 的機制,即使到目前為止,debug 方式仍不脫用肉眼去掃執行的 log,這樣 debug 的效率極度糟糕而且我還不知道要怎麼改進。
理想上是要弄一個 debug 的介面,可以像 gdb 一樣停在某個記憶體位置,然後印出當下的暫存器內容等等,不過即便我做出來, 當做我參考答案的其他實作也不會有同樣的東西可用,所以後來我放棄實作這個部分。

即便如此,在這兩個月還是完成了不少事情,也在 github 上得到一位 justapig9020 大大 (呃…只是一隻豬9020 大大)的幫助,幫我實作了不少東西,像是加上 clap-rs,放大畫面的選項等等。

...