Open FPGA 系列 - UART
上一章我們打通了 FPGA 的開源工具鏈,接下來我們就能測試一下 icesugar-pro 有的介面,
首先實作 FPGA 還是需要有輸入輸出,否則也只是弄出一個無法互動的程式,而最簡單的輸出入介面,就當屬 UART 了。
icesugar-pro 的 github 上,也附上了一個 UART 的範例
,
會不斷對你的電腦輸出 “0” 到 “9”(然後這段 code 還有 bug XD),這篇我們就來寫一個有 tx, rx 的 UART 模組吧。
上一章我們打通了 FPGA 的開源工具鏈,接下來我們就能測試一下 icesugar-pro 有的介面,
首先實作 FPGA 還是需要有輸入輸出,否則也只是弄出一個無法互動的程式,而最簡單的輸出入介面,就當屬 UART 了。
icesugar-pro 的 github 上,也附上了一個 UART 的範例
,
會不斷對你的電腦輸出 “0” 到 “9”(然後這段 code 還有 bug XD),這篇我們就來寫一個有 tx, rx 的 UART 模組吧。
故事是這樣子的,今年的 COSCUP 投了一個 System Software 的 session , 然後該議程軌的主持人自行提供了投稿獎勵,以下 Facebook 原文:
為了鼓勵各位同學投稿、以及體驗知識有價的參與感,在跟Jserv老師討論後,我們將提供兩位 有償 徵稿名額給這邊的同學。
投稿後有獲得錄取的前兩位同學,將會獲得新台幣 2,500 元的獎勵金,以及可以配製成RISC-V核心、運行Linux的FPGA開發板乙張!
獎勵金的部分我就回絕了,畢竟有薪人士拿這個錢道義上說不過去,留給比我有才的許多學生講者比較好。
不過 FPGA 我評估之後就收下了,畢竟 FPGA 難買,之前實驗室玩的 DE2
都要破萬元(然後它竟然停產了),然後有些 project 只用軟體寫實在沒 fu,一直想弄一塊 FPGA 來玩,於是就接受了 FPGA。
人生第二次參加 COSCUP ,上一次已經是在 2019 年的時候,當年的實體活動心得在此 , 因為 2019-2020 太懶沒弄出什麼可以看的點子,2020 好像又因為什麼因素(八成是疫情)連實體活動都沒去, 今年也是因為疫情,整個活動直接變成線上的了。
...故事是這樣子的,雖然在上上篇的 Context Switch
我們曾經預告過因為 static 的問題,
可能要停更一段時間,但後來沒停更,static 問題很快就用 spin 提供的 no_std Mutex 解決了。
不過,no_std Mutex 雖然解決 static 不用手爆 constructor 的問題,同時卻產生了另一個問題:stack overflow。
因為呼叫 static variable constructor 會用到 os process 的 stack,static variable size 一大,os process 的 stack 就會被吃乾抹淨。
所以問題來了,我們必須要儘可能的縮小 static variable 的尺寸,像上篇把 process 的 context 全塞在裡面是不可能的
(為了讓 code 動起來我把 process 數量降到剩 2 個),因此下一步就很清楚了,必須挑戰作業系統裡一大難題:記憶體管理。
故事是這樣子的,上一篇我們使用 unsafe 來操作 global variable,並用這個做到 cooperative multitask, 很不幸的這個方法是不行的,包括幾個問題:
稍微搜尋一下之後,果然找到一個可行的方案,用社群提供的 crate spin
,
可以在 #[no_std]
的狀況下提供 Mutex(有關如何實作 Rust Mutex,'
可以參見這篇文章
)
首先先預告一下,這篇有可能會是本系列連續更新的最後一篇,更新完這篇之後我要去閉關念書(看 code)一段時間,原因我等等會說明。
上一篇我們提到在 rust 裡面實作實際對應實體暫存器的程式碼,同時也確定這些程式碼可以真的提供無額外成本的虛擬化, 這篇順著 mini-arm-os 的腳步,來實作 Context Switch;timer 的設定我們先跳過,畢竟這篇還不會實作到 timer interrupt 觸發 context switch。
...上一回我們看到我們用 rust 寫了一些底層的 code,當然,這個寫法並不好看,有沒有更漂亮的寫法呢? 這篇參考了 rust cortex-m 的寫法, 以及強者我同學在 Google 大殺四方的小新大大分享的文 A guide to better embedded C++ 。
...上一篇我們成功讓 assembly 執行一個 jump 跳進 Rust 函式,但這樣其實一點用也沒有,畢竟只會 loop 的作業系統並不是一個很好的作業系統; 這篇我們就參考一下 xv6 的開機流程,然後試著用 Rust 重新實作。
...故事是這樣子的,大概六月中的時候,小弟因緣際會空出一些時間,因為武肺持續三級警戒只能待在家裡,除了打混摸魚之外順便看了一下別人寫的翻譯文
embedonomicon
,翻完之後看看 rust cortex-m
都被人做走了
,那有什麼東西可以玩的呢?
有一天晚上上床的時候就想到了,剛好最近在想看一下 MIT 教學用的作業系統 xv6,看看究竟可以用的作業系統是怎麼實作的,
而 xv6 本來是針對 x86 處理器,最近才被移植到新的 riscv 處理器上,
也有人把 xv6 用 rust 重新實作
,那我是不是能如下圖,填上這個表格最後一個空格呢?
C | Rust | |
---|---|---|
x86 | xv6 legacy | xv6-rust |
Riscv | xv6-riscv | 404 Not Found |
這應該是裸機程式的最後一篇了,回顧一下第一篇 所說,到現代幾個進化的點,
前三點我們已經看過了
最後就是用 library 啦,在前面的篇章都沒提到這個,為什麼?
...