はじめに
秋葉原ロボット部では、2024年の秋から冬にかけて、RTOSのZpheyrRTOSを種々のボードで動作させる活動が行われていました。
RISC-Vのサポートもされていますので、種々のボードで動きそうです。
2023年の秋葉原ロボット部では、RISC-Vを搭載したMilk-V Duoを扱っていました。
このボードを利用した活動記録が「milk-V Duo Advent Calendar 2023」として公開されています。
Milk-V Duoでは、FreeRTOS、LinuxやArduinoのファームウェが動作します。
RTOSのZephyrも動作しそうです。
ここでは、RAMが64 MBのMilk-V Duoのsmall core上でのZephyrOSの動作確認結果を報告します。
Risc-V用ZephyrRTOS
公式サイトで公開されているZephyrのRISC-Vサポートは大きく分けると、3種類のようです。
RISC-V搭載ボード
Qemu
FPGAボード(neorv32, litex_vexriscv)
詳細は、以下の検索結果から確認できます。
この検索結果を見ると、Milk-V Duoの公式サポートは無いことがわかります。
Milk-V Duo用ZephyrRTOS
Milk-V Duo用ZephyrRTOSとして、2024年3月に「GP Orcullo(kinsamanka)さんによって 「initial commit」が公開されました。
Milk-V Duoのsmall coreで動作する環境です。
環境構築とファームウェアのビルドを自分で行っていもいいのですが、Githubでは、ZephyrRTOS用elfファイルが動作するディスクイメージと、Lチカのelfファイルが公開されていますので、こちらを使います。
milkv-duo_sdcard.imgで起動したMilk-V Duoにログインできません
GP Orculloさんの公開しているSDカードイメージを使って起動したところ、ログインできません。IDとパスワードの組み合わせが、Milk-Vの公式のものと違うようです。
Arduinoのファームウェア搭載のディスクイメージを使用
Milk-Vのコミュニティフォーラムを見ていると、Arduinoのファームウェア搭載のディスクイメージを使っている例が紹介されていました。
Arduinoのファームウェア搭載のディスクイメージとして、「arduino-milkv-duo-sd-v1.1.4.img」を使用しました。
このイメージを使用する場合、起動の確認のために、ボード上のLEDが点滅するように設定されています。
Lチカを行うときにもボード上のLEDを使いますので、LED点滅プログラムを止めておきます。
ボードが起動したら、LED点滅プログラムの名前を変更して、実行されないようにします。実際のコマンドは以下の通りです。
# mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync
作業が終わったら、再起動します。
再起動後にLEDは点滅しません。
Milk-V Duo上でLチカする方法
Milk-V Duoにsshで接続します。
Milk-V Duo上の/lib/firmwareに、「zephyr.elf」を保存します。
その後、以下のコマンドを実行します。
# echo stop > /sys/class/remoteproc/remoteproc0/state
# echo -n zephyr.elf > /sys/class/remoteproc/remoteproc0/firmware
# echo start > /sys/class/remoteproc/remoteproc0/state
すると、ボード上のLEDが点滅します。
おわりに
RAMが64 MBのMilk-V Duoのsmall coreでzephyrRTOS用のelfが動作しました。
FreeRTOSのリソースが蓄積されているので、これらの情報も活用できそうです。
さらに、Milk-V Duoの環境だと、同じボード上でZephyrOS用プログラム開発とプログラムの実行が行えます。
しかも、再起動せずに行うことが可能です。
この点は、Milk-V Duoの特徴の一つになります。
【おまけ】Milk-V Duo 256M上でのLチカはうまくいきません
「arduino-milkv-duo256m-sd-v1.1.4.img」を使って、Milk-V Duo 256Mを起動後、起動時のLチカプログラムを止めます。
再起動後、「Milk-V Duo上でLチカする方法」の節と同様、「zephyr.elf」の転送後に実行しても、Lチカは起こりません。
ドキュメントを見ると、Milk-V DuoとMilk-V Duo 256Mのボード上のLEDの接続部分が異なっています。
ソースファイルのLEDの指定を修正する必要があるようです。