PL に RTOS(リアルタイムOS)機能を実装し、RPU(Cortex-R5) を試してみるサンプルです。
コンセプトを記載したブログはこちらです。
ITRON風のAPIを、PLのメモリ空間にメモリマップドレジスタとして配置して、タスクスケジューラの機能を実装しています。
PLでの実装により
- タスク数Nに関わらず各種優先度比較に関わる処理が O(1) で完了する
- PLで処理した分 Cortex-R5 の TCM の RTOS での消費を抑えられる
- イベントフラグなどをPLの別の回路から直接セット要求できる
などが特徴となっています。
現時点では割り込み処理はタスクスイッチのみに利用し、いわゆる割り込み処理はPLからイベントフラグなどで直接的に起動したタスクで行う前提としております。
また、PS部からの操作でしかないので APU(Cortex-A53) から set_flg や sig_sem() したりしてプロセッサ間で通信することもおそらく可能と思います。
RPUのTCMに収まるような小規模なリアルタイム制御など、タスク数が少ない範囲ではある程度実用になるのではないかと思い、実験中です。
なお、今回 RPU 側のソフトには Rust を用いております。
ZynqMP 環境でAPU(Cortex-R5)上で、Ubuntuや、Debianなどが動く状態になっており、Rust インストール済みの想定です。
また、APUからRPUを認識できるようになっている想定です。
なお、ビルドもAPUで行ってしまう想定ですが、コンパイル自体はPCなどの別環境でも可能です。
vivado2022.2 を用いております。
認定Ubuntu 環境にて試しております。
image : iot-limerick-kria-classic-desktop-2204-x06-20220614-78.img
Description : Ubuntu 22.04.2 LTS
kernel : 5.15.0-1018-xilinx-zynqmp
https://www.rust-lang.org/ja/tools/install に従ってインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install gcc-arm-none-eabi
sudo apt install libnewlib-arm-none-eabi
rustup update
rustup target add armv7r-none-eabi
cargo install cargo-binutils
rustup component add llvm-tools-preview
app ディレクトリに手 make から cargo などを呼び出す仕組みにしています。
ビルドは
make
実行は
make run
停止は
make stop
となり、食事する哲学者の問題の動作をUART 側に出力するサンプルとして実装しております。