もくじ
1. はじめに
インテル® SoC FPGA の Arm® Cortex™-A9 デュアルコアを Asymmetric Multi Processing(AMP)として使用する場合、Shared Peripheral Interrupt(SPI)の割り込みを両方のコアに通知したいというケースがあるかと思います。
多くの方は ICDIPTRn レジスタ(詳細は下記資料参照)にて割り込み通知のターゲットを両方のコアに設定することで、両方のコアへ割り込み通知ができるとお考えになるかもしれません。
参考資料:
PrimeCell Generic Interrupt Controller (PL390) Technical Reference Manual
“3.2.10 Target Registers (ICDIPTRn)" の章をご参照ください。
しかし、上記の設定を行っても両方のコアへ割り込みを通知することはできません。
下記ドキュメントに記載の通り、片方のコア(ごく稀に両方のコア)にしか通知されない仕様となっています。
参考資料:
ARM Generic Interrupt Controller Architecture Specification
<抜粋>
❝SPIs using the GIC 1-N model, where the acknowledgement of an interrupt by one processor
removes the pending status of the interrupt on any other targeted processors, see Implications
of the 1-N model on page 3-41.❞ [ ARM Generic Interrupt Controller Architecture Specification より引用]
この記事では両方のコアへ割り込みを通知する方法の一例を紹介しますので、 SPI の割り込みを両コアへ通知する際の参考にして頂ければと思います。
ポイント:
割り込みコントローラー(GIC)が扱う割り込みには3通り(SGI, PPI, SPI)の種別が存在します。
この記事に記載する注意点は、SPI をマルチコアに通知したい場合が対象となります。
- Software Generated Interrupt(SGI): ソフトウェア制御で生成する割り込み。
- Private Peripheral Interrupt(PPI): 各コアが専用に持つペリフェラルからの割り込み。
- Shared Peripheral Interrupt(SPI): コア間で共有するペリフェラルからの割り込み。
2. 対処法例
"1. はじめに" で説明した通り、SPI の割り込みは基本的に 1 つのコアにしか割り込みが入らない仕様となっています。
両方のコアへ割り込みを入れる最も確実な方法としては FPGA から HPS への FPGA_IRQxx を 2 つ作成し CPU0 と CPU1 にそれぞれ入力する方法です。
イメージとしては下記の通りです。
【図 1】 FPGA_IRQ を 2 本用意して両方のコアへ割り込み
上記は ハードウェア側で FPGA_IRQxx を 2 本用意する必要があり RTL を修正する必要があります。
その為、 この記事では FPGA_IRQxx を 1 本で両方のコアへ割り込みを入れる方法を紹介します。
ここで説明する対処法としては、片方のコアで SPI の割り込みルーチンを処理し、その中で他のコアに対して SGI を発行するというものです。
そうすることにより、両方のコアに割り込みを入れることができます。
図で表すと以下のようなイメージになります(この例では、コア 0 が SPI の割り込みを受ける構成を示しています)。
【図 2】 2 コア両方へ割り込みを入れる対処法フロー
3. コード実装のポイント
対処法を実装するためのコードのポイントは下記 3-1 から 3-3 の 3 点となります。
3-1. SPI による割り込み処理のターゲットを片方のコアに設定
まず 1 点目としては、インテル ® SoC FPGA エンベデッド開発スイート(SoC EDS)に含まれる HWLib(ハードウェア・ライブラリー)の alt_int_dist_target_set() API を用いることで、以下のように設定することができます(この例では、ターゲットをコア 0 に設定しています)。
alt_int_dist_target_set() については、SoC EDS の下記パスに HWLib のドキュメントがありますので、
そちらでご確認ください( index.html をブラウザで開きます)。
\intelFPGA\<version>\embedded\ip\altera\hps\altera_hps\doc\soc_cv_av\index.html
3-2. SGI で実行される割り込みハンドラーの登録
2点目としては、予め使⽤する SGI の番号を決めておき、HWLib の alt_int_isr_register() で割り込みハンドラーを登録します。
SGI の 0 番を使用して sample_ictrl_callback_SGI0__OSC1_TMR0() という割り込みハンドラーを登録しているコードの例としては下記となります。
alt_int_isr_register() については HWLib のドキュメントをご参照ください。
3-3. SGI の生成
3 点目として、SGI の⽣成は HWLib の alt_int_sgi_trigger() で行えます。
alt_int_sgi_trigger() の第 2 引数に 1 を設定することで、コードを実行しているコア以外のコアへ割り込みを通知することができます。
デュアルコアの場合コードを実行しているコア以外のコアは 1 つしかないので、必然的にもう片方のコアのみに割り込みが通知されるようになります。
0 番の SGI を生成しもう片方のコアへ割り込みを通知しているコードの例が下記となります。
第 1 引数で 0(ALT_INT_INTERRUPT_SGI0)を設定し 0 番の SGI を生成しています。
第 2 引数で 1(ALT_INT_SGI_tARGET_ALL_EXCL_SENDER)を設定し、もう片方のコアへ割り込みを通知するよう設定しています。
alt_int_sgi_trigger() の詳細についても HWLib のドキュメントをご参照ください。
4. 関連情報
インテル® SoC FPGA HPS の GIC(Generic Interrupt Controller)を扱う際に役立つ資料として下記 2 つの記事をご紹介します。
参考: Cyclone V SoC:HPSレジスタ仕様の掲載場所一覧シート
GIC の細かい仕様は Arm ® 社の資料を確認する必要があります。
こちらの記事では GIC に関する資料の URL を紹介していますのでご活用ください。
参考: DS-5 活用テクニック ~レジスタ・ビュー[2/3]レジスタ定義の自作
Arm ® Development Studio 5 Intel ® SoC FPGA Edition(DS-5)デバッガーに GIC のレジスタを
表示させるためのレジスタ定義ファイルを公開しています。
デバッガーの GUI 上でレジスタ値の確認を行いたい場合はこちらの記事をご参照ください。
5. おわりに
この記事では 1 つの SPI 割り込みを両方のコアに通知する対処法をご紹介しました。
インテル ® SoC FPGA の Cortex™-A9 デュアルコアを使用するケースにおいて、両方のコアに対して割り込みを入れたいというケースは多いかと思います。
その際には、この資料をご参考にして頂ければと思います。
コメント
0件のコメント
記事コメントは受け付けていません。