RAMが64 MBのMilk-V Duoのsmall core上でZephyrRTOSを使ってLチカ



## はじめに
秋葉原ロボット部では、2024年の秋から冬にかけて、RTOSのZpheyrRTOSを種々のボードで動作させる活動が行われていました。

RISC-Vのサポートもされていますので、種々のボードで動きそうです。

2023年の秋葉原ロボット部では、RISC-Vを搭載したMilk-V Duoを扱っていました。

https://milkv.io/ja/duo

このボードを利用した活動記録が「milk-V Duo Advent Calendar 2023」として公開されています。

https://qiita.com/advent-calendar/2023/milkvduo

Milk-V Duoでは、FreeRTOS、LinuxやArduinoのファームウェが動作します。

https://milkv.io/ja/docs/duo/getting-started/rtoscore

RTOSのZephyrも動作しそうです。

ここでは、RAMが64 MBのMilk-V Duoのsmall core上でのZephyrOSの動作確認結果を報告します。

## Risc-V用ZephyrRTOS
公式サイトで公開されているZephyrのRISC-Vサポートは大きく分けると、3種類のようです。

https://docs.zephyrproject.org/latest/hardware/arch/risc-v.html

RISC-V搭載ボード
Qemu
FPGAボード（neorv32, litex_vexriscv）

詳細は、以下の検索結果から確認できます。

https://docs.zephyrproject.org/latest/boards/index.html#arch=riscv

この検索結果を見ると、Milk-V Duoの公式サポートは無いことがわかります。

## Milk-V Duo用ZephyrRTOS
Milk-V Duo用ZephyrRTOSとして、2024年3月に「GP Orcullo（kinsamanka）さんによって　「initial commit」が公開されました。

https://github.com/kinsamanka/milkv-zephyros

Milk-V Duoのsmall coreで動作する環境です。

環境構築とファームウェアのビルドを自分で行っていもいいのですが、Githubでは、ZephyrRTOS用elfファイルが動作するディスクイメージと、Lチカのelfファイルが公開されていますので、こちらを使います。

https://github.com/kinsamanka/milkv-zephyros/releases/download/v0.1.1-alpha/milkv-duo_sdcard.img.gz

https://github.com/kinsamanka/milkv-zephyros/releases/download/v0.1.0-alpha/zephyr.elf


## milkv-duo_sdcard.imgで起動したMilk-V Duoにログインできません
GP Orculloさんの公開しているSDカードイメージを使って起動したところ、ログインできません。IDとパスワードの組み合わせが、Milk-Vの公式のものと違うようです。

## Arduinoのファームウェア搭載のディスクイメージを使用
Milk-Vのコミュニティフォーラムを見ていると、Arduinoのファームウェア搭載のディスクイメージを使っている例が紹介されていました。

https://community.milkv.io/t/zephyr-os-running-on-the-small-core/1493/4$0

Arduinoのファームウェア搭載のディスクイメージとして、「arduino-milkv-duo-sd-v1.1.4.img」を使用しました。

https://github.com/milkv-duo/duo-buildroot-sdk/releases/download/v1.1.4/arduino-milkv-duo-sd-v1.1.4.img.zip


このイメージを使用する場合、起動の確認のために、ボード上の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チカプログラムを止めます。

https://github.com/milkv-duo/duo-buildroot-sdk/releases/download/v1.1.4/arduino-milkv-duo256m-sd-v1.1.4.img.zip$

再起動後、「Milk-V Duo上でLチカする方法」の節と同様、「zephyr.elf」の転送後に実行しても、Lチカは起こりません。

ドキュメントを見ると、Milk-V DuoとMilk-V Duo 256Mのボード上のLEDの接続部分が異なっています。

https://milkv.io/ja/docs/duo/getting-started/duo

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/8d11afa5-10f6-419f-a224-8f7c205bd1e6.png)

https://milkv.io/ja/docs/duo/getting-started/duo256m

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f2215bb6-052c-41f5-a67d-fe3ba150c2ee.png)

ソースファイルのLEDの指定を修正する必要があるようです。