低レイヤ日記

ゆるっと低レイヤ周りを深堀するブログです

FreeRTOS(RTOS)上でRustアプリを作る環境構築法まとめ

はじめに

https://github.com/Embeded-ojisan/FreeRTOS_and_Rust/blob/21511e03628abde896f7b31477856e7dcecba9d7/Cargo.toml

  • ターゲットとしてはlm3s6965evb(QEMU)を採用する。
    • 採用した理由は以下である。
      • QEMUを使用できる。
      • FreeRTOS側にサンプルアプリが存在するため。
        • 今後、Rustアプリを書く際に参考に。

          概要

  • RTOS上でのRust開発環境を構築するための大まかな手順は以下である。
  • 上記の手順の中でハマりやすい部分に絞ってこれから解説する。

bindgenによりC言語のヘッダーからRustのコードを生成

  • bindgenとは
  • ハマりどころ①:別々にヘッダーのコードを生成するとコンフリクトが起きることも。
    • FreeRTOSにはtask.hやlist.hなど複数のヘッダーファイルが存在する。その各々をRustのバインディングに変換してもいいのでは?と思うがうまくいかない。
    • 基本的にbindgenはヘッダーの中身を機械的バインディングに変換する。そのため、ライブラリ共通の型定義などを各ヘッダーが展開する形式だと、各々の内容が機械的に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アプリのビルド設定

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

参考資料