OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2...
Transcript of OpenAMPを実際に使って分かったこと...Linux(Cortex-A53): Petalinux 2018.2...
公開
OpenAMPを実際に使って分かったこと
2019/10/28サイバートラスト株式会社
鈴木保是
公開
アジェンダ
● はじめに: をとりまく状況など
● で通信できるようにした事例○ コアに を移植
● で通信してみた事例○ プロセッサと プロセッサ○ 通信開始から受信終了まで○ 通信開始から受信開始まで
公開
● は で管理されることに!
はじめに:OpenAMPをとりまく状況など
[ サンディエゴ 2019年9月23日 ]
オープンガバナンスでオープンソースコミュニティプロジェクトを管理する Linaro Community は、本日 Open Asymmetric Multi-Processing (OpenAMP) プロジェクトが Linaro Community Project になったことをご報告します。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
共有メモリ
コア間割り込み
公開
● コアに を移植○ 部分を対象 向けに作成・カスタマイズ
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で通信できるようにした事例
公開
● コアに を移植○ 検討が必要な事柄
3.初期化処理(ベクターテーブルと起動処理)設定
電源投入時に最初に動作するベクタテーブルの記述とman()までに実施する処理の作成(キャッシュ操作やMPUの設定も含む)
4.CPUに対するキャッシュの操作
キャッシュの禁止、許可、無効化など
5.割り込みコントローラ(GIC)の操作
割り込みコントローラに関係する操作(割り込み禁止、許可、割り込みハンドラの登録など)
6.メモリマップの決定
OpenAMPで通信できるようにした事例
公開
● プロセッサと プロセッサ○ 側から 側送受信バッファをセットアップ※1
○ 関数などは でも でも使う(ただし通常側は システムコール内でカーネルモード が
使われる)○ 通常は が 側(条件※2付きで を 側にするこ
とも可能)
※1 環境におけるブート順( 依存)との関係に注意。※2 ともにユーザーモード となる の場合。
OpenAMP で通信してみた事例
公開
● 通信開始から受信終了まで(1)○ 送信動作の開始から対向側がデータ受信を終了するまでの時間
を計測する
OpenAMP で通信してみた事例
データ送信処理の開始
rpmsg_send ( )
データ受信処理
call_back ( )
送信側:RTOS 受信側:Linux
T0
IPIによる通知
T1
割込みハンドラから受信処理起動
公開
● 通信開始から受信終了まで(1)○ 送信動作の開始から対向側がデータ受信を終了するまでの時間
を計測する
T0+T1を計測する。
OpenAMP で通信してみた事例
データ送信処理の開始
rpmsg_send ( )
データ受信処理
call_back ( )
送信側:RTOS 受信側:Linux
T0
IPIによる通知
T1
割込みハンドラから受信処理起動
公開
● 通信開始から受信終了まで(1)○ 送信動作の開始から対向側がデータ受信を終了するまでの時間
を計測する
T0+T1を計測する。
OpenAMP で通信してみた事例
データ送信処理の開始
rpmsg_send ( )
データ受信処理
call_back ( )
送信側:RTOS 受信側:Linux
T0
T1
IPIによる通知
割込みハンドラから受信処理起動
漏れてることに注意!
公開
● 通信開始から受信終了まで(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
公開
● 通信開始から受信終了まで(1)○ → の測定結果(ペイロードは バイト)
OpenAMP で通信してみた事例
T0 117 [μsec]
T1 18 [μsec]
T0 + T1 135 [μsec]
公開
● 通信開始から受信終了まで(2)○ 送信動作の開始から対向側がそのデータを受信し、受信側から
再送信し、送信側が受信するまでの時間を計測する
OpenAMP で通信してみた事例
データ送信処理の開始コア間通知API実行
コア間通知レジスタ操作
コア間通知割込み処理の開始通知のハンドリング
データ受信処理(開始 →終了)データ送信処理の開始
コア間通知API実行コア間通知レジスタ操作
Master プロセッサ Remote プロセッサ
T1
IPIによる通知
コア間通知割込み処理の開始通知のハンドリング
データ受信処理(開始 →終了)
IPIによる通知
公開
● 通信開始から受信終了まで(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
公開
● 通信開始から受信終了まで(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
公開
● 通信開始から受信終了まで(2)○ → 、 → 、のそれぞれの測定結果(ペイロード
は バイト)
OpenAMP で通信してみた事例
RTOS→Linux Linux→RTOS
34 [μsec] 35 [μsec]
公開
● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する
までの時間(オーバヘッド)を計測する
OpenAMP で通信してみた事例
データ送信処理の開始コア間通知API実行
コア間通知レジスタ操作
コア間通知割込み処理の開始通知のハンドリング
データ受信処理の開始
T0
T1
IPIによる通知
Master プロセッサ Remote プロセッサ
公開
● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する
までの時間(オーバヘッド)を計測する
OpenAMP で通信してみた事例
データ送信処理の開始コア間通知API実行
コア間通知レジスタ操作
Master プロセッサ
T0
T0:データの送信処理を対抗側CPUに向けて行うまでの処理時間 ①送信処理用APIを実行する。 ②IPIで対向CPUに通知する。
公開
● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する
までの時間(オーバヘッド)を計測する
OpenAMP で通信してみた事例
T0:データの送信処理を対抗側CPUに向けて行うまでの処理時間 ①送信処理用APIを実行する。 ②IPIで対向CPUに通知する。
T1:IPIによる通知からデータ受信処理までの時間 ③IPIで受信プロセス・タスクを起動する。 ④受信処理用APIでデータを取得する。
データ送信処理の開始コア間通知API実行
コア間通知レジスタ操作
Master プロセッサ
T0
コア間通知割込み処理の開始通知のハンドリング
データ受信処理の開始
Remote プロセッサ
T1
公開
● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する
までの時間(オーバヘッド)を計測する
OpenAMP で通信してみた事例
T0:データの送信処理を対抗側CPUに向けて行うまでの処理時間 ①送信処理用APIを実行する。 ②IPIで対向CPUに通知する。
T1:IPIによる通知からデータ受信処理までの時間 ③IPIで受信プロセス・タスクを起動する。 ④受信処理用APIでデータを取得する。
T0+T1を計測する。
データ送信処理の開始コア間通知API実行
コア間通知レジスタ操作
Master プロセッサ
T0
コア間通知割込み処理の開始通知のハンドリング
データ受信処理の開始
Remote プロセッサ
T1
公開
● 通信開始から受信開始まで○ 送信元 が送信を開始してから受信側 が受信を開始する
までの時間(オーバヘッド)を計測する
OpenAMP で通信してみた事例
データ送信処理の開始コア間通知API実行
コア間通知レジスタ操作
コア間通知割込み処理の開始通知のハンドリング
データ受信処理の開始
Master プロセッサ Remote プロセッサ
T0
T1
IPIによる通知
漏れてることに注意!
公開
● 通信開始から受信終了まで(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
公開
● 通信開始から受信終了まで(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
公開
● 通信開始から受信開始まで○ → 、 → 、のそれぞれの測定結果(ペイロード
は バイト)
OpenAMP で通信してみた事例
RTOS→Linux Linux→RTOS
20 [μsec] 18 [μsec]
公開
● の移植はかなり大変です(大変でした)。● 測定できている範囲を把握しておく必要があります。● 測定にはカーネルに手を入れる必要があります。● カーネル内の改変はかなり大変です(大変でした)。● それでも に要する時間の直接測定はしていません( と
でタイマーが別々)。● そして数値は参考値です。
まとめ
公開
信頼とともに
留意事項
本資料に記載されている会社名、製品名、サービス名は、当社または各社、各団体の商標もしくは登録商標です。その他本資料に記載されているイラスト・ロゴ・写真・動画・ソフトウェア等は、当社または第三者が有する知的財産権やその他の権利により守られております。お客様は、当社が著作権を有するコンテンツについて、特に定めた場合を除き、複製、改変、頒布などをすることはできません。本資料に記載されている情報は予告なしに変更されることがあります。また、時間の経過などにより記載内容が不正確となる場合がありますが、当社は、当該情報を更新する義務を負うものではありません。