はじめに
- 以前からRustのFFIに興味があったのと将来的には組み込みRustアプリプラットフォーム的なもの(https://zenn.dev/lowlvengineer/scraps/1cdd84cc98d923)を作りたくてその前準備のためにやってみた。
環境その他
- 構築した環境は以下のリポジトリに格納した。 https://github.com/Embeded-ojisan/FreeRTOS_and_Rust
- 使ったツールとそのversion
- bindgen(0.59.1)
- cc、ctyなど
- ターゲットとしてはlm3s6965evb(QEMU)を採用する。
- 採用した理由は以下である。
- QEMUを使用できる。
- FreeRTOS側にサンプルアプリが存在するため。
- 今後、Rustアプリを書く際に参考に。
概要
- 今後、Rustアプリを書く際に参考に。
- 採用した理由は以下である。
- RTOS上でのRust開発環境を構築するための大まかな手順は以下である。
- 上記の手順の中でハマりやすい部分に絞ってこれから解説する。
bindgenによりC言語のヘッダーからRustのコードを生成
- bindgenとは
- ハマりどころ①:別々にヘッダーのコードを生成するとコンフリクトが起きることも。
https://github.com/Embeded-ojisan/FreeRTOS_and_Rust/blob/main/freertos/FreeRTOSheader.h
- ハマりどころ②:そのまま動かすとstdが入り込む。
- 上記のようになっているためno_std環境で使用するためにはひと手間必要です。
- 調べると
--use-core
しろと出てくるが最近のbindgenはそうしてもstd::os:rawを追加する。 - そのため、
--ctypes-prefix cty
も追加する必要がある。
https://x.com/ciniml/status/1138258449068781571
https://github.com/Embeded-ojisan/FreeRTOS_and_Rust/blob/main/scripts/bindgen.sh
- 作成したバインディングは使う場所でinclude!マクロ等を使って紐づけを行う。
https://github.com/Embeded-ojisan/FreeRTOS_and_Rust/blob/main/src/main.rs#L4-L8
RTOSとRustアプリのビルド設定
- ここでC言語で書かれたFreeRTOSとRustのコードを繋ぐのがcc(https://docs.rs/cc/latest/cc/)というcrateである。
- 以下で記載されているccはbuild.rs内でC/C++のコードをコンパイルするのに便利なものである。
- これを使ってFreeRTOSのコードをビルドする手続きをbuild.rsに記載することでいい感じにRust側とリンクしてくれる。
https://github.com/Embeded-ojisan/FreeRTOS_and_Rust/blob/main/build.rs
- クロスコンパイルさせたい場合も特別な設定は必要なく
.cargo/config.toml
内の設定を読んで実行してくれる。
https://github.com/Embeded-ojisan/FreeRTOS_and_Rust/blob/main/.cargo/config.toml