今回は、MPSoCでOpenAMPを使って、第1回で動かしたLinuxと第2回で動かしたFreeRTOSを連携させてみましょう!
OpenAMPは正式名称OPEN ASYMMETRIC MULTI PROCESSINGといい、The Multicore Association® (MCA)で規定する非対称マルチコアで各コアが連携できるようにコア間の通信やリソースの管理を行うための標準規格です。OpenAMPについて、もっと詳しく知りたい人は下記を読んでね。
OPEN ASYMMETRIC MULTI PROCESSING (OpenAMP)
OpenAMPはGitHubでソースが公開されています。ソースを読んでみたい人は下記にアクセスしてね。
また、実機上で動作するコードは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を利用した通信は動画がわかりやすいので、ぜひ見てね!
Xilinx社製 Zynq® UltraScale+™ MPSoC搭載ボード
ザイリンクス社のZynq UltraScale+ MPSoC デバイスは、Quad-core Arm® Cortex®-A53とDual-core Arm Cortex-R5、最大1143KロジックセルのFPGAを搭載した、All Programmable SoCデバイスです。CPUコアの性能はもちろんのこと、DDR4対応やセキュリティのサポート、GPUにはDual-coreのMali™-400、USB、GbE、PCIe Gen2x4、DisplayPortをも搭載しています。開発ツールは、Vivado® Design Suiteをはじめ、SDSoCによるプログラマブルデバイスならではのシステム開発環境が利用できます。今回の講座では、Zynq UltraScale+を搭載した「ZCU102/ZCU104評価キット」を使用します。
最新情報をメーカーサイトで見る
DTSインサイト社製 adviceLUNA Ⅱ
情報家電などの組込み製品には、高機能であることや高い処理性能が求められています。LinuxやAndroidなどのプラットフォームには、マルチコアCPUが搭載されるようになり、システムは複雑かつ大規模化し、ソフトウェアのデバッグは困難を増しています。adviceLUNA Ⅱは、従来デバッガのデバッグ機能に加え、Linuxデバッグやマルチコアデバッグに対応した高度なデバッグ機能、トレース機能、測定機能、解析機能を提供することで、MMUの仮想記憶環境やマルチコアCPUで並行動作するような複雑なソフトウェアのデバッグをサポートします。
最新情報をメーカーサイトで見る
組み込みLinux導入/開発支援サービス
組込みLinuxによりお客様の装置開発に新たな価値を提供します。
富士通コンピュータテクノロジーズ
こちらも是非
“もっと見る” 組み込みLinux|MPSoC編
PMUを使いこなして、より安全なシステム設計にチャレンジ!
MUを使ってMPSoCの温度と電力を監視する 今回は、MPSoCのPMUを活用してみましょう。これまではMPSoCのArm Cortex-A53とArm Cortex-R5を活用してきましたが、今回はもう一つのプロセッサであるであるPMUを活用してみましょう。
adviceLUNA Ⅱを使ってOpenAMPのコア間通信をデバッグしよう!
今回は、Arm Cortex-A53上のLinuxとArm Cortex-R5上のFreeRTOSをデバッグしてみたいと思います。デバッガとしては、Armを使ったシステム開発にて根強い人気を誇る「adviceLUNA Ⅱ」を選択しています。
Zynqに搭載されたPS部を活用し、仮想化ソフトウェア「Xen」を実行してみよう!
今回は、MPSoCのPS部を活用して、Linuxの仮想化の実装であるXenを動かしてみましょう。MPSoCは、Arm Cortex-A53クアッド コアで複数のOSを動作させられる高いパフォーマンスなので、仮想マシン(VM)を動かすことができます。