Zynq 割り込みコントローラ初期化 – タイマー割り込み理解メモ (2)

アイキャッチ

この記事の内容

Zynq 割り込みコントローラのドライバ初期化関数について。

FPGA設計大全第2版の第5章に 「Zynq の CPU でタイマー割り込みを使って 3色 LED の色を切り替えるテストコード」があります。HDL には慣れているけど C言語は初心者という筆者の個人的メモ第2弾です。

  1. タイマー割り込み
  2. 割り込みコントローラのドライバ初期化 ← この記事の内容
  3. 割り込み処理関数の登録
  4. main 関数・プリプロセッサ・インスタンス変数宣言

割り込みコントローラのドライバ初期化

対象の関数を抜粋したコード

/* 割り込みコントローラのドライバ初期化 */
int ScuGicInt_Init(void)
{
    int Status;
    XScuGic_Config *ConfigPtr;
    ConfigPtr = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);
    Status = XScuGic_CfgInitialize(&IntcInstance, ConfigPtr,
               ConfigPtr->CpuBaseAddress);
    if (Status != XST_SUCCESS)
        return XST_FAILURE;
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
               (Xil_ExceptionHandler)XScuGic_InterruptHandler,
               &IntcInstance);
    Xil_ExceptionEnable();
    return XST_SUCCESS;
}

以下、メモ内容です。


int ScuGicInt_Init(void) {}

割り込みコントローラのドライバを初期化する関数を作成する。


XScuGic_Config *ConfigPtr;

割り込みコントローラドライバの「コンフィグレーション」を作成 (ポインタ型)。

「コンフィグレーション」は、API 内でハードウェア上の設定を記憶しているもの。


ConfigPtr = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);

割り込みコントローラのデバイス ID を使ってコンフィグレーションを調べる。

正常終了時には、先に宣言した変数にコンフィグレーション構造体のポインタが入る。初期化に失敗すると NULL 。

XPAR_PS7_SCUGIC_0_DEVICE_ID はヘッダファイル内で定義されていて、ハードウェア的に決められた値が入る。抜粋したコードには含まれないけど、ヘッダファイルをインクルードしているのはこの部分 → #include "xparameters.h"


Status = XScuGic_CfgInitialize(&IntcInstance, ConfigPtr, ConfigPtr-> CpuBaseAddress);

割り込みコントローラの初期化で、次の処理を含む。

  • 割り込みコントローラ構造体初期化
  • ベクターテーブル初期化(スタブ関数を含む)
  • すべての割り込みソース無効化

スタブ関数はテスト用のダミーモジュール(と理解した)。

XScuGic_CfgInitialize の引数は、1つ目が割り込みコントローラインスタンスのポインタ、2つ目がコンフィグレーションのポインタ、3つ目はコントローラのベースアドレス。

第3引数のアドレスは、仮想メモリアドレス空間のベースアドレスとする。仮想アドレスを使わないときは Config->BaseAddress で物理アドレスを渡す。


if (Status != XST_SUCCESS)
    return XST_FAILURE;

初期失敗のときはここで処理を終了。


Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &IntcInstance);

例外 ID とハンドラを関連付ける。割り込みは例外の1つという扱い。

引数1つ目は例外 ID として XIL_EXCEPTION_ID_INT を、2つ目はハンドラ関数(割り込み発生時に呼ばれる)として XScuGic_InterruptHandler を渡す。3つ目はハンドラに渡されるデータのアドレス。

割り込みを表す例外 ID は、手元の環境では “xil_exception.h” ファイル内で #define XIL_EXCEPTION_ID_INT 16U と定義されている。

第2引数の XScuGic_InterruptHandler は、どの割り込みが有効になっているかを判断して適切な割り込みハンドラに処理を渡す。


Xil_ExceptionEnable();

割り込みを有効にする(例外を有効にする)。


return XST_SUCCESS;

正常終了の戻り値とともに初期化処理を完了。

関連記事・参考文献

関連記事

当ブログ内の関連記事

  1. タイマー割り込み
  2. 割り込みコントローラのドライバ初期化 ← この記事の内容
  3. 割り込み処理関数の登録
  4. main 関数・プリプロセッサ・インスタンス変数宣言

参考文献

  • Xilinx Vitis Drivers API Documentation “scugic_v4_5” (Vitis アプリ内から参照可能)
  • FPGAプログラム大全 Xilinx編 第2版

使用したボード PYNQ-Z1 については、割り込みハンドラの記事の最後 をご覧ください。

スポンサーリンク