Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
人類には難しいZynqで組み込みRust
kadu-v
April 26, 2022
Programming
0
550
人類には難しいZynqで組み込みRust
kadu-v
April 26, 2022
Tweet
Share
Other Decks in Programming
See All in Programming
模組化的Swift架構(二) DDD速成
haifengkao
0
330
CUDA高速化セミナーvol.1 ~画像処理アルゴリズムの高速化~
fixstars
3
170
Meet Swift Regex
usamik26
0
240
Value and Record Types
hschwentner
0
540
GitHubのユーザー名を変更した後のあれこれ
tahia910
0
120
Angular‘s Future without NgModules: Architectures with Standalone Components @enterJS
manfredsteyer
PRO
0
170
IE Graduation Certificate
jxck
6
4.7k
GDG Seoul IO Extended 2022 - Android Compose
taehwandev
0
270
Vite でお手軽 Vue.js の環境構築
azuki
1
170
IE Graduation (IE の功績を讃える)
jxck
20
12k
GitHub Actions を導入した経緯
tamago3keran
1
420
heyにおけるCI/CDの現状と課題
fufuhu
1
540
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
638
52k
Designing with Data
zakiwarfel
91
3.9k
Statistics for Hackers
jakevdp
781
210k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
39
13k
Pencils Down: Stop Designing & Start Developing
hursman
112
9.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
19
1.2k
In The Pink: A Labor of Love
frogandcode
131
21k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
Fireside Chat
paigeccino
11
1.3k
Raft: Consensus for Rubyists
vanstee
126
5.4k
Designing for Performance
lara
597
63k
Designing the Hi-DPI Web
ddemaree
272
32k
Transcript
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 人類には難しいZynqで組込みRust 株式会社ネフロック(@nefrock_inc )
@kadu-v ✖
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 自己紹介 • 名前:
池守和槻 (GitHub: kadu-v) • 所属: 東京工業大学 情報理工学院 数理・計算科学系 増原研究室 修士二年 • 研究: 型システムについて研究 ⇒組み込み開発は素人 • 2021/09~ネフロックでインターン
Copyright © 2022 Nefrock.Inc. All Rights Reserved. • リアルタイム音声合成AIチップの 開発(NEDO採択事業)
• WAVのAIによるリアルタイム演算 • AIの重みをボード起動時になるべ く早くFPGAに受け渡したい 背景 自社開発 K26子ボード Cortex-R5上のベアメタルプログラム から重みを受け渡す (Cortex-A9Cortex-A53はLinuxの動作 に用いる)
Copyright © 2022 Nefrock.Inc. All Rights Reserved. Cortex-R5ベアメタルアプリケーションの概要 Cortex-R5 DMA
Controller SD FPGA DDR Memory ①重みとバイアス の読み込み ②重みとバイアス の書き込み ③コントローラへ のDMAの発行 ④PLへ重みとバイアス をDMA Processing System Programmable Logic
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 従来のC/C++による組み込み開発 • 以下の課題がある
☹ ポインタ操作によるバグ ☹ マクロの安全性不足 ☹ モダンな言語機能の不足による開発効率の低下 ☹ エコシステムの不足 安全で効率的な開発のためには相当な経験が必要 FPGAとCPUが一体化しているZynqではなおさら…
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 安全かつ効率的な組み込み開発 Rustの言語機能で実現可能ではないか? •
Rustの機能 • 強力な型システムによるメモリ安全 • 明示的なunsafe ➢ 型シグネチャに現れない危険性を明示化 • モダンな言語機能 (ADT, ジェネリクス…) • エコシステムの充実 (rustup, cargo, …) 安全性 効率性 ⟹ RustでCortex-R5アプリケーションを実装
Copyright © 2022 Nefrock.Inc. All Rights Reserved. Rust開発の方針毎のメリット・デメリット • Pure
Rustなので,Rustの型シス テムの恩恵をフルで受ける フルスクラッチで実装 FFIでドライバを再利用 • Xilinxが提供する確かなドライバ • 既存のXilinxの資産を流用できる ので,開発コストが低い • Xilinxの仕様書を理解して,作成 するのはコストが非常に高い • 各アーキテクチャ向けのビルド プロセスを完全に理解する必要 がある • FFIはunsafeコードなので,安全 性をプログラマが保証する必要 がある メリット メリット デメリット デメリット
Copyright © 2022 Nefrock.Inc. All Rights Reserved. Rust開発の方針毎のメリット・デメリット • Pure
Rustなので,Rustの型シス テムの恩恵をフルで受ける フルスクラッチで実装 FFIでドライバを再利用 • Xilinxが提供する確かなドライバ • 既存のXilinxの資産を流用できる ので,開発コストが低い • Xilinxの仕様書を理解して,作成 するのはコストが非常に高い • 各アーキテクチャ向けのビルド プロセスを完全に理解する必要 がある • FFIはunsafeコードなので,安全 性をプログラマが保証する必要 がある メリット メリット デメリット デメリット 今回はこちらの 方針で実装 x
Copyright © 2022 Nefrock.Inc. All Rights Reserved. C/C++コードのRustバインドの作成 C header
file Raw Rust bindings Safe Rust bindings bindgen によるRust バインドの自動生成 ➢ FFIで呼ばれる関数の安全性はRustの型システムでは保 証できない 安全なシグネチャの関数で生のバインドをラップする ➢ 安全性をコンパイラが担保してくれる
Copyright © 2022 Nefrock.Inc. All Rights Reserved. AXI DMAバインドの作成例 C
header file Raw Rust bindings Safe Rust bindings XAxiDma_Config *XAxiDma_LookupConfig(u32 DeviceId); • DMAコントローラの設定を読み込む関数
Copyright © 2022 Nefrock.Inc. All Rights Reserved. AXI DMAバインドの作成例 C
header file Raw Rust bindings Safe Rust bindings XAxiDma_Config *XAxiDma_LookupConfig(u32 DeviceId); • 生ポインタが使われている ⟹そのままユーザに公開するのは危険 extern "C" { pub fn XAxiDma_LookupConfig( DeviceId: u32_, ) -> *mut XAxiDma_Config; }
Copyright © 2022 Nefrock.Inc. All Rights Reserved. AXI DMAバインドの作成例 C
header file Raw Rust bindings Safe Rust bindings pub fn lookup_config(id: u32) -> Result<Self, DmaError> { let ptr = unsafe { esys::XAxiDma_LookupConfig(id) }; if ptr.is_null() { Err(DmaError::ConfigInit) } else { Ok(Self { config: ptr }) } } extern "C" { pub fn XAxiDma_LookupConfig( DeviceId: u32_, ) -> *mut XAxiDma_Config; } XAxiDma_Config *XAxiDma_LookupConfig(u32 DeviceId); • nullチェック • 返り値を列挙型に変更 ⟹ 安全かつエラーハンドリングを容易にする
Copyright © 2022 Nefrock.Inc. All Rights Reserved. embeddedsw-rsクレート • Xilinxのベアメタルアプリケーション用のドライバ群
embeddedswのRustバインドクレート(ライブラリ) • Rustの型システムにより,C/C++よりも安全性が高い • C/C++,Rustコードをcargoを使用して一括でビルド可能 • 実装済みのモジュール ➢ xil_printf.rs, xscugic.rs, xaxidma.rs, ff.rs, xalloc.rs GitHubに公開しています 詳しくはまとめで!!
Copyright © 2022 Nefrock.Inc. All Rights Reserved. ビルドの全体像 バイナリ Rust
コード Xilinx ドライバ 静的ライブラリ リンカ rustc Rust バインド C/C++ヘッダファイル xsct (Xilinx Software Command-Line tool) XSA ファイル bindgen アプリケーション embeddedsw-rs
Copyright © 2022 Nefrock.Inc. All Rights Reserved. Demo:Hello Rust World
UARTでHello fpgaxを出力するプログラムを作成してみます.
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 開発苦労話 (1) ➢
当初はZynqで組み込みRustができるのかわからず,手探り状態が続い た.(私が組み込み開発の素人だったのも大きな要因) ➢ フィンランドのタンペレ大学の博士研究員の方がPYNQでの事例をブロ グに挙げているが,詳細は書かれていない. ➢ 日本語だと@ryuz88(https://github.com/ryuz)さんがRustでのRTOSな どを公開している. Zynqで組み込みRustをしている人の情報がほとんどない
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 開発苦労話 (2) C/C++の関数形式マクロはRustバインドでは自動生成されない
➢ C/C++の関数形式のマクロを用いてドライバが提供されている • Rustの関数として,自分で再実装する必要があった
Copyright © 2022 Nefrock.Inc. All Rights Reserved. 今後の課題 • ライブラリの拡充
• xil_printf.rs, xaxidma.rs, xcugic.rs, xalloc.rsのみ実装済 • ビルド時間の短縮 • 毎回のビルドでxsctを用いて,C/C++のソースコード 全体を再ビルドしてしまう • Cortex-A53ベアメタルアプリケーションへの対応 • featureフラグを使用して,Cortex-R5とCortex-A53の 切り替えを可能に
Copyright © 2022 Nefrock.Inc. All Rights Reserved. まとめ • 安全かつ効率的な組み込み開発に向けて,
➢ Zynqでの組み込みRustが可能なことを実証 ➢ C/C++にくらべてより安全なライブラリ embeddedsw-rsを作成 ➢ cargoでの開発環境の構築
Copyright © 2022 Nefrock.Inc. All Rights Reserved. まとめ • 安全かつ効率的な組み込み開発に向けて,
➢ Zynqでの組み込みRustが可能なことを実証 ➢ C/C++にくらべてより安全なライブラリ embeddedsw-rsを作成 ➢ cargoでの開発環境の構築 embeddedsw-rsはGitHubで公開しています PR待ってます!! ☆もお願いします!! https://github.com/nefrock/embeddedsw-rs