OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2...

27
公開 OpenAMPを実際に使って分かったこと 2019/10/28 サイバートラスト株式会社 鈴木保是

Transcript of OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2...

Page 1: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

OpenAMPを実際に使って分かったこと

2019/10/28サイバートラスト株式会社

鈴木保是

Page 2: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

アジェンダ

● はじめに: をとりまく状況など

● で通信できるようにした事例○ コアに を移植

● で通信してみた事例○ プロセッサと プロセッサ○ 通信開始から受信終了まで○ 通信開始から受信開始まで

Page 3: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● は で管理されることに!

はじめに:OpenAMPをとりまく状況など

[ サンディエゴ 2019年9月23日 ]

オープンガバナンスでオープンソースコミュニティプロジェクトを管理する Linaro Community は、本日 Open Asymmetric Multi-Processing (OpenAMP) プロジェクトが Linaro Community Project になったことをご報告します。OpenAMPプロジェクトは、オープンソースソリューションでヘテロ組込みシステム間の通信を標準化する、ということを目的としています。

Page 4: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● コアに を移植○ における 構成

OpenAMPで通信できるようにした事例

Cortex-R7#1

Cortex-R7#0

Cortex-A57#3

Cortex-A57#1

Cortex-A57#0

Cortex-A57#2

Cortex-A53#3

Cortex-A53#1

Cortex-A53#0

Cortex-A53#2

FreeRTOSLinux

共有メモリ

コア間割り込み

Page 5: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● コアに を移植○ 部分を対象 向けに作成・カスタマイズ

OpenAMPで通信できるようにした事例

Page 6: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● コアに を移植○ 検討が必要な事柄

1.tick count用のタイマハンドリング

FreeRTOS(カーネル)で使用するシステム上のtick count用のタイマに対する制御と割り込み処理

2.ヒープ領域の設定とメモリ確保のためのアーキテクチャの選択

FreeRTOS(カーネル)で使用するメモリ領域の確保領域と確保するためのアーキテクチャの選択(1~5まである)ヒープメモリ管理https://docs.aws.amazon.com/ja_jp/freertos-kernel/latest/dg/heap-management.html

OpenAMPで通信できるようにした事例

Page 7: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● コアに を移植○ 検討が必要な事柄

3.初期化処理(ベクターテーブルと起動処理)設定

電源投入時に最初に動作するベクタテーブルの記述とman()までに実施する処理の作成(キャッシュ操作やMPUの設定も含む)

4.CPUに対するキャッシュの操作

キャッシュの禁止、許可、無効化など

5.割り込みコントローラ(GIC)の操作

割り込みコントローラに関係する操作(割り込み禁止、許可、割り込みハンドラの登録など)

6.メモリマップの決定

OpenAMPで通信できるようにした事例

Page 8: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● プロセッサと プロセッサ○ 側から 側送受信バッファをセットアップ※1

○ 関数などは でも でも使う(ただし通常側は システムコール内でカーネルモード が

使われる)○ 通常は が 側(条件※2付きで を 側にするこ

とも可能)

※1 環境におけるブート順( 依存)との関係に注意。※2 ともにユーザーモード となる の場合。

OpenAMP で通信してみた事例

Page 9: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(1)○ 送信動作の開始から対向側がデータ受信を終了するまでの時間

を計測する

OpenAMP で通信してみた事例

データ送信処理の開始

rpmsg_send ( )

データ受信処理

call_back ( )

送信側:RTOS 受信側:Linux

T0

IPIによる通知

T1

割込みハンドラから受信処理起動

Page 10: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(1)○ 送信動作の開始から対向側がデータ受信を終了するまでの時間

を計測する

T0+T1を計測する。

OpenAMP で通信してみた事例

データ送信処理の開始

rpmsg_send ( )

データ受信処理

call_back ( )

送信側:RTOS 受信側:Linux

T0

IPIによる通知

T1

割込みハンドラから受信処理起動

Page 11: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(1)○ 送信動作の開始から対向側がデータ受信を終了するまでの時間

を計測する

T0+T1を計測する。

OpenAMP で通信してみた事例

データ送信処理の開始

rpmsg_send ( )

データ受信処理

call_back ( )

送信側:RTOS 受信側:Linux

T0

T1

IPIによる通知

割込みハンドラから受信処理起動

漏れてることに注意!

Page 12: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(1)○ システム構成

○ ソフトウェア構成

OpenAMP で通信してみた事例

Zynq 7020Cortex-A9(Dual): 866MHz

https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_4/ug1186-zynq-openamp-gsg.pdf より

Linux: v 4.9.0 + Xilinx PatchRTOS: v 9.0.1OpenAMP 2017.10 / Libmetal 2017.10

Page 13: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(1)○ → の測定結果(ペイロードは バイト)

OpenAMP で通信してみた事例

T0 117 [μsec]

T1 18 [μsec]

T0 + T1 135 [μsec]

Page 14: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(2)○ 送信動作の開始から対向側がそのデータを受信し、受信側から

再送信し、送信側が受信するまでの時間を計測する

OpenAMP で通信してみた事例

データ送信処理の開始コア間通知API実行

コア間通知レジスタ操作

コア間通知割込み処理の開始通知のハンドリング

データ受信処理(開始 →終了)データ送信処理の開始

コア間通知API実行コア間通知レジスタ操作

Master プロセッサ Remote プロセッサ

T1

IPIによる通知

コア間通知割込み処理の開始通知のハンドリング

データ受信処理(開始 →終了)

IPIによる通知

Page 15: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(2)○ ⇔ 通信のシステム構成

OpenAMP で通信してみた事例

Cortex-A53(Quad): Clock: 1.5GHz L1 cache: 命令キャッシュ 32KB、データキャッシュ 32KB(コア毎) L2 cache: 1MB(コア共通)

Cortex-R5(Dual): Clock: 600MHz L1 cache: 命令キャッシュ 32KB、データキャッシュ 32KB(コア毎) TCM: Single 128KB(コア毎)、Lockstep 256KB

ボードのRAM容量: 4GB

Page 16: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(2)○ ソフトウェア構成

OpenAMP で通信してみた事例

https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_4/ug1186-zynq-openamp-gsg.pdf より

Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2

RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1

OpenAMP: OpenAMP 2017.10 Libmetal 2017.10

Page 17: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(2)○ → 、 → 、のそれぞれの測定結果(ペイロード

は バイト)

OpenAMP で通信してみた事例

RTOS→Linux Linux→RTOS

34 [μsec] 35 [μsec]

Page 18: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する

までの時間(オーバヘッド)を計測する

OpenAMP で通信してみた事例

データ送信処理の開始コア間通知API実行

コア間通知レジスタ操作

コア間通知割込み処理の開始通知のハンドリング

データ受信処理の開始

T0

T1

IPIによる通知

Master プロセッサ Remote プロセッサ

Page 19: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する

までの時間(オーバヘッド)を計測する

OpenAMP で通信してみた事例

データ送信処理の開始コア間通知API実行

コア間通知レジスタ操作

Master プロセッサ

T0

T0:データの送信処理を対抗側CPUに向けて行うまでの処理時間 ①送信処理用APIを実行する。 ②IPIで対向CPUに通知する。

Page 20: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する

までの時間(オーバヘッド)を計測する

OpenAMP で通信してみた事例

T0:データの送信処理を対抗側CPUに向けて行うまでの処理時間 ①送信処理用APIを実行する。 ②IPIで対向CPUに通知する。

T1:IPIによる通知からデータ受信処理までの時間 ③IPIで受信プロセス・タスクを起動する。 ④受信処理用APIでデータを取得する。

データ送信処理の開始コア間通知API実行

コア間通知レジスタ操作

Master プロセッサ

T0

コア間通知割込み処理の開始通知のハンドリング

データ受信処理の開始

Remote プロセッサ

T1

Page 21: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する

までの時間(オーバヘッド)を計測する

OpenAMP で通信してみた事例

T0:データの送信処理を対抗側CPUに向けて行うまでの処理時間 ①送信処理用APIを実行する。 ②IPIで対向CPUに通知する。

T1:IPIによる通知からデータ受信処理までの時間 ③IPIで受信プロセス・タスクを起動する。 ④受信処理用APIでデータを取得する。

T0+T1を計測する。

データ送信処理の開始コア間通知API実行

コア間通知レジスタ操作

Master プロセッサ

T0

コア間通知割込み処理の開始通知のハンドリング

データ受信処理の開始

Remote プロセッサ

T1

Page 22: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する

までの時間(オーバヘッド)を計測する

OpenAMP で通信してみた事例

データ送信処理の開始コア間通知API実行

コア間通知レジスタ操作

コア間通知割込み処理の開始通知のハンドリング

データ受信処理の開始

Master プロセッサ Remote プロセッサ

T0

T1

IPIによる通知

漏れてることに注意!

Page 23: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(2)○ ⇔ 通信のシステム構成

OpenAMP で通信してみた事例

Cortex-A53(Quad): Clock: 1.5GHz L1 cache: 命令キャッシュ 32KB、データキャッシュ 32KB(コア毎) L2 cache: 1MB(コア共通)

Cortex-R5(Dual): Clock: 600MHz L1 cache: 命令キャッシュ 32KB、データキャッシュ 32KB(コア毎) TCM: Single 128KB(コア毎)、Lockstep 256KB

ボードのRAM容量: 4GB

Page 24: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信終了まで(2)○ ソフトウェア構成

OpenAMP で通信してみた事例

https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_4/ug1186-zynq-openamp-gsg.pdf より

Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2

RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1

OpenAMP: OpenAMP 2017.10 Libmetal 2017.10

Page 25: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● 通信開始から受信開始まで○ → 、 → 、のそれぞれの測定結果(ペイロード

は バイト)

OpenAMP で通信してみた事例

RTOS→Linux Linux→RTOS

20 [μsec] 18 [μsec]

Page 26: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

● の移植はかなり大変です(大変でした)。● 測定できている範囲を把握しておく必要があります。● 測定にはカーネルに手を入れる必要があります。● カーネル内の改変はかなり大変です(大変でした)。● それでも に要する時間の直接測定はしていません( と

でタイマーが別々)。● そして数値は参考値です。

まとめ

Page 27: OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2 4.14.0-xilinx-v2018.2 RTOS(Cortex-R5): FreeRTOS Xilinx提供SDK同梱 v10.1.1 OpenAMP:

公開

信頼とともに

留意事項

本資料に記載されている会社名、製品名、サービス名は、当社または各社、各団体の商標もしくは登録商標です。その他本資料に記載されているイラスト・ロゴ・写真・動画・ソフトウェア等は、当社または第三者が有する知的財産権やその他の権利により守られております。お客様は、当社が著作権を有するコンテンツについて、特に定めた場合を除き、複製、改変、頒布などをすることはできません。本資料に記載されている情報は予告なしに変更されることがあります。また、時間の経過などにより記載内容が不正確となる場合がありますが、当社は、当該情報を更新する義務を負うものではありません。