Upgrade to Pro — share decks privately, control downloads, hide ads and more …

人類には難しいZynqで組み込みRust

717f16e7d3120b665ab6c0da4d397140?s=47 kadu-v
April 26, 2022

 人類には難しいZynqで組み込みRust

717f16e7d3120b665ab6c0da4d397140?s=128

kadu-v

April 26, 2022
Tweet

Transcript

  1. Copyright © 2022 Nefrock.Inc. All Rights Reserved. 人類には難しいZynqで組込みRust 株式会社ネフロック(@nefrock_inc )

    @kadu-v ✖
  2. Copyright © 2022 Nefrock.Inc. All Rights Reserved. 自己紹介 • 名前:

    池守和槻 (GitHub: kadu-v) • 所属: 東京工業大学 情報理工学院 数理・計算科学系 増原研究室 修士二年 • 研究: 型システムについて研究 ⇒組み込み開発は素人 • 2021/09~ネフロックでインターン
  3. Copyright © 2022 Nefrock.Inc. All Rights Reserved. • リアルタイム音声合成AIチップの 開発(NEDO採択事業)

    • WAVのAIによるリアルタイム演算 • AIの重みをボード起動時になるべ く早くFPGAに受け渡したい 背景 自社開発 K26子ボード Cortex-R5上のベアメタルプログラム から重みを受け渡す (Cortex-A9Cortex-A53はLinuxの動作 に用いる)
  4. Copyright © 2022 Nefrock.Inc. All Rights Reserved. Cortex-R5ベアメタルアプリケーションの概要 Cortex-R5 DMA

    Controller SD FPGA DDR Memory ①重みとバイアス の読み込み ②重みとバイアス の書き込み ③コントローラへ のDMAの発行 ④PLへ重みとバイアス をDMA Processing System Programmable Logic
  5. Copyright © 2022 Nefrock.Inc. All Rights Reserved. 従来のC/C++による組み込み開発 • 以下の課題がある

    ☹ ポインタ操作によるバグ ☹ マクロの安全性不足 ☹ モダンな言語機能の不足による開発効率の低下 ☹ エコシステムの不足 安全で効率的な開発のためには相当な経験が必要 FPGAとCPUが一体化しているZynqではなおさら…
  6. Copyright © 2022 Nefrock.Inc. All Rights Reserved. 安全かつ効率的な組み込み開発 Rustの言語機能で実現可能ではないか? •

    Rustの機能 • 強力な型システムによるメモリ安全 • 明示的なunsafe ➢ 型シグネチャに現れない危険性を明示化 • モダンな言語機能 (ADT, ジェネリクス…) • エコシステムの充実 (rustup, cargo, …) 安全性 効率性 ⟹ RustでCortex-R5アプリケーションを実装
  7. Copyright © 2022 Nefrock.Inc. All Rights Reserved. Rust開発の方針毎のメリット・デメリット • Pure

    Rustなので,Rustの型シス テムの恩恵をフルで受ける フルスクラッチで実装 FFIでドライバを再利用 • Xilinxが提供する確かなドライバ • 既存のXilinxの資産を流用できる ので,開発コストが低い • Xilinxの仕様書を理解して,作成 するのはコストが非常に高い • 各アーキテクチャ向けのビルド プロセスを完全に理解する必要 がある • FFIはunsafeコードなので,安全 性をプログラマが保証する必要 がある メリット メリット デメリット デメリット
  8. Copyright © 2022 Nefrock.Inc. All Rights Reserved. Rust開発の方針毎のメリット・デメリット • Pure

    Rustなので,Rustの型シス テムの恩恵をフルで受ける フルスクラッチで実装 FFIでドライバを再利用 • Xilinxが提供する確かなドライバ • 既存のXilinxの資産を流用できる ので,開発コストが低い • Xilinxの仕様書を理解して,作成 するのはコストが非常に高い • 各アーキテクチャ向けのビルド プロセスを完全に理解する必要 がある • FFIはunsafeコードなので,安全 性をプログラマが保証する必要 がある メリット メリット デメリット デメリット 今回はこちらの 方針で実装 x
  9. Copyright © 2022 Nefrock.Inc. All Rights Reserved. C/C++コードのRustバインドの作成 C header

    file Raw Rust bindings Safe Rust bindings bindgen によるRust バインドの自動生成 ➢ FFIで呼ばれる関数の安全性はRustの型システムでは保 証できない 安全なシグネチャの関数で生のバインドをラップする ➢ 安全性をコンパイラが担保してくれる
  10. 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コントローラの設定を読み込む関数
  11. 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; }
  12. 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チェック • 返り値を列挙型に変更 ⟹ 安全かつエラーハンドリングを容易にする
  13. 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に公開しています 詳しくはまとめで!!
  14. Copyright © 2022 Nefrock.Inc. All Rights Reserved. ビルドの全体像 バイナリ Rust

    コード Xilinx ドライバ 静的ライブラリ リンカ rustc Rust バインド C/C++ヘッダファイル xsct (Xilinx Software Command-Line tool) XSA ファイル bindgen アプリケーション embeddedsw-rs
  15. Copyright © 2022 Nefrock.Inc. All Rights Reserved. Demo:Hello Rust World

    UARTでHello fpgaxを出力するプログラムを作成してみます.
  16. Copyright © 2022 Nefrock.Inc. All Rights Reserved. 開発苦労話 (1) ➢

    当初はZynqで組み込みRustができるのかわからず,手探り状態が続い た.(私が組み込み開発の素人だったのも大きな要因) ➢ フィンランドのタンペレ大学の博士研究員の方がPYNQでの事例をブロ グに挙げているが,詳細は書かれていない. ➢ 日本語だと@ryuz88(https://github.com/ryuz)さんがRustでのRTOSな どを公開している. Zynqで組み込みRustをしている人の情報がほとんどない
  17. Copyright © 2022 Nefrock.Inc. All Rights Reserved. 開発苦労話 (2) C/C++の関数形式マクロはRustバインドでは自動生成されない

    ➢ C/C++の関数形式のマクロを用いてドライバが提供されている • Rustの関数として,自分で再実装する必要があった
  18. 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の 切り替えを可能に
  19. Copyright © 2022 Nefrock.Inc. All Rights Reserved. まとめ • 安全かつ効率的な組み込み開発に向けて,

    ➢ Zynqでの組み込みRustが可能なことを実証 ➢ C/C++にくらべてより安全なライブラリ embeddedsw-rsを作成 ➢ cargoでの開発環境の構築
  20. Copyright © 2022 Nefrock.Inc. All Rights Reserved. まとめ • 安全かつ効率的な組み込み開発に向けて,

    ➢ Zynqでの組み込みRustが可能なことを実証 ➢ C/C++にくらべてより安全なライブラリ embeddedsw-rsを作成 ➢ cargoでの開発環境の構築 embeddedsw-rsはGitHubで公開しています PR待ってます!! ☆もお願いします!! https://github.com/nefrock/embeddedsw-rs