Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
人類には難しいZynqで組み込みRust
Search
kadu-v
April 26, 2022
Programming
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
人類には難しいZynqで組み込みRust
kadu-v
April 26, 2022
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
470
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
280
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
520
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
180
Intent as Code
shoppingjaws
6
1k
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
250
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.3k
Family mrubyの進捗
kishima
1
130
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
190
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
380
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
580
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
First, design no harm
axbom
PRO
2
1.3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.9k
Designing for Timeless Needs
cassininazir
1
480
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
Ethics towards AI in product and experience design
skipperchong
2
380
Designing for Performance
lara
611
70k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
700
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
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