OpenAMPをMPSoCで動かしてみよう!

今回は、MPSoCでOpenAMPを使って、第1回で動かしたLinuxと第2回で動かしたFreeRTOSを連携させてみましょう!

OpenAMPは正式名称OPEN ASYMMETRIC MULTI PROCESSINGといい、The Multicore Association® (MCA)で規定する非対称マルチコアで各コアが連携できるようにコア間の通信やリソースの管理を行うための標準規格です。OpenAMPについて、もっと詳しく知りたい人は下記を読んでね。
OPEN ASYMMETRIC MULTI PROCESSING (OpenAMP)

OpenAMPはGitHubでソースが公開されています。ソースを読んでみたい人は下記にアクセスしてね。
GitHub - OpenAMP/open-amp

また、実機上で動作するコードはBSD-3-Clauseでライセンスされているので、様々なソフトウェアと組み合わせて動作することができます。

FreeRTOSの設定をしてみよう

前回と同様にXSDKを起動し、FreeRTOSのアプリケーション プロジェクトを作成します。Hardware Platformはお使いのボードに合わせて選択し、Processorはpsu_cortexr5_0を選択して、Next >をクリックしてください。

図

テンプレートは、OpenAMP echo-testを選択してください。他にも行列乗算やRPC (リモート プロシジャー コール)のテンプレートが用意されています。

図

前回と同様にBSPの設定を確認します。OpenAMPのテンプレートを選択すると、libmetalとopenampのライブラリーが自動で選択されます。

図

前回と同様、標準入出力をUART1を使う設定を行います。

図

テンプレートのままでもOpenAMPは動作しますが、動きを見るためにechoを返す処理の部分 (水色にハイライトされている行)にPRINT文を1行挿入します。

ソースを保存すると自動でビルドされます。

図

Linuxの設定をしてみよう

次に、Linuxの設定を行います。

環境変数を設定し、
$ source ~/tools/petalinux/settings.sh
~/tools/petalinuxは、インストール パスです。任意に変更してください。

rootfsの設定を行うツールを起動します。
$ petainux-config -c rootfs

図

rootfsにOpenAMPのパッケージを組み込むために、メニューからPetalinux Package Groupsを選択します。

図

packagegroup-petalinux-openampを選択します。

図

packagegroup-petalinux-openampを選択し、configを終了してください。

図

次にLinuxからCortex-R5を制御し、Cortex-R5にUART1を制御させるために
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
をこのように変更します。

/ {
	reserved-memory {
		#address-cells = <2>;
		#size-cells = <2>;
		ranges;
		rproc_0_reserved: rproc@3ed000000 {
			no-map;
			reg = <0x0 0x3ed00000 0x0 0x1000000>;
		};
	};

	power-domains {
		pd_r5_0: pd_r5_0 {
			#power-domain-cells = <0x0>;
			pd-id = <0x7>;
		};
		pd_tcm_0_a: pd_tcm_0_a {
			#power-domain-cells = <0x0>;
			pd-id = <0xf>;
		};
		pd_tcm_0_b: pd_tcm_0_b {
			#power-domain-cells = <0x0>;
			pd-id = <0x10>;
		};
	};

	amba {
		r5_0_tcm_a: tcm@ffe00000 {
			compatible = "mmio-sram";
			reg = <0x0 0xFFE00000 0x0 0x10000>;
			pd-handle = <&pd_tcm_0_a>;
		};
		r5_0_tcm_b: tcm@ffe20000 {
			compatible = "mmio-sram";
			reg = <0x0 0xFFE20000 0x0 0x10000>;
			pd-handle = <&pd_tcm_0_b>;
		};

		elf_ddr_0: ddr@3ed00000 {
			compatible = "mmio-sram";
			reg = <0x0 0x3ed00000 0x0 0x40000>;
		};

		test_r50: zynqmp_r5_rproc@0 {
			compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
			reg = <0x0 0xff9a0100 0x0 0x100>, <0x0 0xff340000 0x0 0x100>, <0x0 0xff9a0000 0x0 0x100>;
			reg-names = "rpu_base", "ipi", "rpu_glbl_base";
			dma-ranges;
			core_conf = "split0";
			srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
			pd-handle = <&pd_r5_0>;
			interrupt-parent = <&gic>;
			interrupts = <0 29 4>;
		} ;
	};
};

&uart1{
        status = "disable";
};
					

最後にLinuxのビルドを行います。
$ petalinux-build

出来上がったイメージを前回と同様にSDカードへコピーします。

FreeRTOSとLinuxで通信してみよう

LinuxはUART0にコンソール入出力し、ホストPCのttyUSB0へ接続されます。FreeRTOSはUART1にコンソール入出力し、ホストPCのttyUSB1へ接続されます。
※PCに他のUSBシリアル デバイスが接続されていない場合。

操作はすべてLinuxのコンソールから行います。Linuxがブートしたら、Cortex-R5のイメージaps_freertos_openamp_app1.elfを/lib/firmwareへコピーしてください。

Cortex-R5へファームウェアをロードします。
# echo aps_freertos_openamp_app1.elf > /sys/class/remoteproc/remoteproc0/firmware

Cortex-R5をブートします。
# echo start > /sys/class/remoteproc/remoteproc0/state

LinuxのOpenAMPのドライバーをロードします。
# modprobe rpmsg_user_dev_driver

OpenAMPを使ってLinuxからFreeRTOSへメッセージを投げて、FreeRTOSが応答するデモを実行します。
# echo_test

OpenAMPを利用した通信は動画がわかりやすいので、ぜひ見てね!

図

図