nRF54L15-DKのArmとRISC-Vのコアを用いて、ICMsgのサンプルをテストしました。
ICMsg…Zephyr RTOS独自の軽量通信プロトコル。
ビルド時に注意すること含めて、テスト内容含めて紹介します。
ZephyrのIPC(コア間通信)の ICMsgのサンプルを動かしてみた
nRF54L15-DKのArmとRISC-Vのコアを用いて、ICMsgのサンプルをテストしました。
ICMsg…Zephyr RTOS独自の軽量通信プロトコル。
ビルド時に注意すること含めて、テスト内容含めて紹介します。

nRF54L15
nRF54L15はM33とRISC-Vのデュアルコア構成です。
コア間通信にはOpenAMPが有名です。
Zephyr同士ならより軽量な「ICMsg (Inter-Core Messaging)」に着目してテストしています。

- ボード: nRF54L15DK
- OS: Zephyr (nRF Connect SDK)
- 構成: Main Core (M33) ⇔ VPR (RISC-V)

Zephyrのサンプル
今回は下記サンプルをそのままテストしただけです。
OpenAMP (RPMsg)とICMsg
標準的なOpenAMPと比較して構成がシンプルです。
メモリ消費を抑えながら高速なデータやり取りが可能なことを確認しました。
| 特徴 | OpenAMP (RPMsg) | ICMsg (このサンプル) |
| 相手 | Linux, FreeRTOS, ベアメタル等何でもOK | Zephyr同士 専用 |
| 規格 | 国際標準 (複雑) | Zephyr独自 (シンプル) |
| サイズ | 大きい (メモリ食う) | 小さい (省メモリ) |
| 速度 | 普通 | 高速 (オーバーヘッド小) |
ビルド・テスト結果
ビルド時はSNIPPETで「nordic-flpr」を使用します。
スニペットを入れないとRISC-Vのコアが動かなく、テスト時にエラーが出ます。

SNIPPETで「nordic-flpr」を入れないとエラー
実際のエラー内容が下記です。
ビルドは出来ても、実際テストするとエラーが出ます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
*** Booting nRF Connect SDK v3.2.1-d8887f6f32df *** *** Using Zephyr OS v4.2.99-ec78104f1569 *** [00:00:00.002,174] <inf> host: IPC-service HOST demo started [00:00:00.002,194] <err> os: ***** BUS FAULT ***** [00:00:00.002,199] <err> os: Precise data bus error [00:00:00.002,203] <err> os: BFAR Address: 0x5004c304 [00:00:00.002,214] <err> os: r0/a1: 0x00000000 r1/a2: 0x00000014 r2/a3: 0x00100000 [00:00:00.002,221] <err> os: r3/a4: 0x5004c000 r12/ip: 0x20002f1c r14/lr: 0x0000244b [00:00:00.002,226] <err> os: xpsr: 0x09000200 [00:00:00.002,230] <err> os: Faulting instruction address (r15/pc): 0x0000b7e2 [00:00:00.002,249] <err> os: >>> ZEPHYR FATAL ERROR 25: Unknown error on CPU 0 [00:00:00.002,266] <err> os: Current thread: 0x20000a68 (main) [00:00:00.079,072] <err> os: Halting system |
Nordicの開発サポート(Devzone)にて対応を教えて貰いました。
成功時のログ
M33側からメッセージを送信し、RISC-V側がエコーバックする様子をログで紹介します。
M33コア側のホスト側からデータを送信しています。
RISC-Vコアのリモート側がデータを受信できていることが分かります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
---- シリアル ポート COM33 を開きました ---- *** Booting nRF Connect SDK v3.2.1-d8887f6f32df *** *** Using Zephyr OS v4.2.99-ec78104f1569 *** [00:00:00.007,424] <inf> host: IPC-service HOST demo started [00:00:00.007,570] <inf> host: Ep bounded [00:00:00.007,624] <inf> host: Perform sends for 1000 [ms] [00:00:01.007,064] <inf> host: Sent 639615 [Bytes] over 1000 [ms] [00:00:01.007,076] <inf> host: Wait 500ms. Let remote core finish its sends [00:00:01.507,140] <inf> host: Received 639885 [Bytes] in total [00:00:01.507,147] <inf> host: IPC-service HOST demo ended ---- シリアル ポート COM32 を閉じました ---- ---- シリアル ポート COM32 を開きました ---- *** Booting nRF Connect SDK v3.2.1-d8887f6f32df *** *** Using Zephyr OS v4.2.99-ec78104f1569 *** [00:00:00.007,508] <inf> remote: IPC-service REMOTE demo started [00:00:00.007,532] <inf> remote: Ep bounded [00:00:00.007,562] <inf> remote: Perform sends for 1000 [ms] [00:00:01.007,379] <inf> remote: Sent 639816 [Bytes] over 1000 [ms] [00:00:01.007,387] <inf> remote: Received 639550 [Bytes] in total [00:00:01.007,391] <inf> remote: IPC-service REMOTE demo ended |
まとめ
nRF54L15-DKのArmとRISC-Vのコアを用いて、ICMsgのサンプルをテストしました。
ICMsg…Zephyr RTOS独自の軽量通信プロトコル。
ビルド時に注意すること含めて、テスト内容含めて紹介しました

コメント