コア間通信をやってみよう

とりあえず前回までで環境設定と個別のコアの動作確認を行いました。今回からいよいよマルチコアの醍醐味、コア間通信について試していこうと思います。コア間通信の方法としてOpenAMPというフレームワークがありますので、これを利用します。OpenAMPのサンプルプログラムもルネサス エレクトロニクスから手順書付きで提供されていますので、そのまま使用します。

マルチコアの使い道

そもそもマルチコアの使い道が分からなければRZ/G2Lにたどり着かなかったかも知れませんが、改めてどのようにメインコアとサブコアを使えばいいのか、想定してみたいと思います。

メインコアのCortex-A55はクロック1.2GHzで、これが2個搭載されており、GUIや画像処理、AIなどにも使える頼もしいやつです。しかし、Linuxで動くことが想定されているので、細かいリアルタイム制御には不向きです。昔なら同じボードにH8マイコンを一つ追加して制御させたかもしれませんが、Cortex-M33という、もっとパフォーマンスの高いMCUが内蔵されているので、これを使わない手はありません。

処理としては下の図のようにメインコアの指示に従って、サブコアがリアルタイム制御を行うのが一般的ではないかと思われます。

Workbench

なので、メインコアからサブコアへのコマンド送受信が必要になります。このようなコア間の通信に必要となるのがOpenAMPです。

コア間通信の準備

コア間通信を行うにあたり、ルネサスのページから「RZ/G2L CM33 Multi-OS Package V1.21」というのをダウンロードします。この時点ではバージョン1.21でした。このパッケージにはコア間の通信を行うためのOpenAMPと、それを使って通信を行うためのサンプルプログラム、およびドキュメントが含まれています。

パッケージを展開すると、メインコア側とサブコア側のパッケージに分かれます。メインコア側は「meta-rz-features_multi-os_v1.2.1.tar.gz」、サブコア側は「rzg2l_cm33_rpmsg_demo.zip」です。

サンプルプログラムについて

実際の作業に行く前に、このサンプルプログラムがどういったものか確認しておきます。このプログラムはメインコア側Linux、サブコア側FreeRTOSで動きます。Linuxのコンソールから「rpmsg_sample_client」というコマンドを実行するとメインコアからサブコアへデータを送信し、受信できたら再びメインコアにエコーバックします。「送った」、「受けた」というメッセージを繰り返し表示するだけでそれほど芸をするわけではありません。

OpenAMPの仕組みとしてはコア間で共有するメモリを使用して、データを書き込んでから他方のコアに割り込みを掛けることで通信を実現するらしいです。でも、同じパッケージに住みながらなんか他人行儀な感じがしますね。例えばですが、コア間の特殊な通信ポートを用意してそれがHIGHになれば・・・、あかん、それだとポーリングしないといけない。やはりそう簡単にはいかないようです。なんにせよ、このサンプルプログラムを参考にすればコア間の通信ができそうです。

メインコア側の準備

それでは実際に準備を行っていきます。まず、仮想環境を立ち上げて、Linuxのビルド環境を用意します。初回で構築したYoctoの環境に上記のメインコア側のパッケージ(meta-rz-features_multi-os_v1.2.1.tar.gz)を展開します。このパッケージはYoctoのレシピに追加されますのでbitbakeでビルドします。デバイスドライバレベルのパッチが当たりますのでカーネルが再構築されます。同時にコア間通信のサンプルプログラムもファイルシステム内に作られます。

$ cd ~/rzg_vlp_v3.0.3
$ tar zxvf meta-rz-features_multi-os_v1.2.1.tar.gz
:(ファイル展開)
$ TEMPLATECONF=$PWD/meta-renesas/meta-rzg2l/docs/template/conf/ source poky/oe-init-build-env build
:(中略)
$ bitbake-layers add-layer ../meta-rz-features/meta-rz-multi-os
$ MACHINE=smarc-rzg2l bitbake core-image-minimal
:(中略)
NOTE: Tasks Summary: Attempted 2879 tasks of which 2746 didn't need to be rerun and all succeeded.

エラーなく終了すれば生成されたファイルをSDカードにコピーします。

SDカードにイメージをコピー

初回で作ったSDカードを用意し、パソコンのSDカードスロットに挿入します。ビルドの生成物は「rzg_vlp_v3.0.3/build/tmp/deploy/images」にありますので、初回と同じ方法でコピーします。相変わらずファイル名、長いです。

$ cp ~/rzg_vlp_v3.0.3/build/tmp/deploy/images/smarc-rzg2l/Image-smarc-rzg2l.bin /media/ubuntu/0548-CA76
$ cp ~/rzg_vlp_v3.0.3/build/tmp/deploy/images/smarc-rzg2l/Image-*.dtb /media/ubuntu/0548-CA76
$ cd /media/ubuntu/rootfs
$ sudo tar jxvf ~/rzg_vlp_v3.0.3/build/tmp/deploy/images/smarc-rzg2l/core-image-minimal-smarc-rzg2l-*.rootfs.tar.bz2
./
./bin/
./bin/ash
 :(中略)
./var/tmp
./var/volatile/

一応、SDカードをRZ/G2Lのボードに接続して、Linuxがブートするか確認しておきましょう。

サブコア側の準備

Linuxの起動が確認できたら、次はサブコアの準備を行います。サブコア側のビルドにはe2 studioを使用します。とりあえず適当なところにワークスペースフォルダとして「rpmsg」を作っておきます。Multi-OS Packageの「rzg2l_cm33_rpmsg_demo.zip」を使用しますが、zipは展開しなくても大丈夫です。

e2 studioを起動してワークスペースフォルダをrpmsgに設定し、「Import existion projects」を選択します。

Workbench

プロジェクトをインポートする設定で、アーカイブファイルの選択をクリックし、先ほどのzipファイルを指定します。zipをそのままインポートできるんですね。

Workbench

終了ボタンを押すとzipファイルが展開されて、プロジェクトのインポートが行われます。

Workbench

続いて、ハンマーボタンを押してビルドを行います。

Workbench

エラーが表示されていなければ完成ですが、プロジェクトをインポートした場合、ツールチェインのバージョン違いでエラーになることがあります。実は今回もそれでエラーとなっていました。その場合は、e2 studioの設定でツールチェインを設定しなおします。Ctrl+Alt+pで設定画面が表示されますので以下のように設定します(バージョンは異なる場合があります)。

Workbench

これでメインコアとサブコアの準備が整いましたので、次回は、いよいよコアの通信テストを行います。