Zynq タイマー割り込みハンドラ – タイマー割り込み理解メモ (1)

アイキャッチ

この記事の内容

Zynq タイマー割り込みの関数について。

FPGA設計大全第2版の第5章に、 Zynq の CPU を使ってタイマー割り込みで RGB LED の色を切り替えていく例が載っています。その C言語のコードを自分なりに理解したメモです。

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

タイマー割り込み関数

/* タイマー割り込み関数 */
void TimerCounterHandler(void *CallBackRef)
{
    volatile static int cnt;
    XScuTimer *TimerInstancePtr = (XScuTimer *)CallBackRef;

    if (XScuTimer_IsExpired(TimerInstancePtr))
    {
        XScuTimer_ClearInterruptStatus(TimerInstancePtr);
        if (++cnt > 15)
            cnt = 0;
        xil_printf("cnt=%d\n", cnt);
        XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, led_rgb(cnt));
    }
}

void TimerCounterHandler { }

タイマー割り込みが発生したときに実行する関数。 (この関数を実行するように別の関数内で設定している。)

割り込み発生時に起動するから「割り込みハンドラ」という。


volatile static int cnt;

volatile : コンパイラによる最適化を抑制する。
static : 関数の処理終了後も値を保持する。 static がない場合は関数を呼び出すたびに初期化される。


XScuTimer *TimerInstancePtr = (XScuTimer *)CallBackRef;

XScuTimer ポインタ型の変数を宣言する。「*」が付いているのでポインタ。
初期値は、 XScuTimer のポインタ型にキャストした CallBackRef (関数の引数として入ってくる) 。

XScuTimer は IP ごとに定義された構造体で、「インスタンス」と呼ばれる。(参考文献より)


if (XScuTimer_IsExpired(TimerInstancePtr))

タイマーのカウンタが 0 になっている場合に処理を実行する。
XScuTimer_IsExpired は、タイマーの値が 0 のときに True を返す。


XScuTimer_ClearInterruptStatus(TimerInstancePtr);

タイマー割り込み状態をクリアする。


if (++cnt > 15)
    cnt = 0;

(LED の色を切り替えるための)カウンタをインクリメントして、その値が 15 を超えたら 0 に戻す。


xil_printf("cnt=%d\n", cnt);

カウンタの値を表示する。

xil_printf は printf よりもサイズが小さい。浮動小数と long 型の表示には対応していない。 Xilinx Standalone Library Documentation の 10 ページ目に記載あり。

この記事には載せていないが、ファイルの先頭でインクルードしている (#include "xil_printf.h")


XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, led_rgb(cnt));

GPIO に値を出力する。
引数は、 1つ目が GPIO のインスタンス、 2つ目がチャンネル番号(1 か 2)、3つ目が出力したい値。

関連記事・参考文献

関連記事

当ブログ内の関連記事

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

参考文献

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

使用ボード

Digilent 社製の PYNQ-Z1 を使いました。 Zynq 搭載のほかの評価ボードでも同じように動くはずです。参考までに PYNQ-Z1 購入先のリンクの一例。(PYNQ-Z1 と Z2 の違いはこちらの記事)

スポンサーリンク