VIC(Vectored Interrupt Controller)を使用すると、割り込み応答性能が良くなると聞いたので、
通常割り込みからどの程度速くなるのか比較してみる。
参考書:AN595: ベクトル割り込みコントローラの使用およびアプリケーション
#環境
Quartus Prime 18.0
Modelsim INTEL FPGA EDITION 10.5b
#通常割り込み(IIC)
Platform Editor
入力ポートとしてpio_0を追加して、立下りエッジでNiosに割り込みをかけるように設定する。
出力ポートとしてbusyを追加して、処理の開始と終了がみれるようにする。
##Eclipse
適当なプロジェクトを作って以下のコードを書く。
#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
//割り込み発生時のコールバック関数
void pio_0_callback(){
IOWR_ALTERA_AVALON_PIO_SET_BITS(BUSY_BASE, 0x01); //出力ポートBusyを1にする。
IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(BUSY_BASE, 0x01); //出力ポートBusyを0にする。
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x0000); //エッジキャプチャのリセット
}
//割り込みのための初期化
void init() {
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_0_BASE, 0x0001); //PIO初期化
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_0_BASE, 0x0000); //エッジキャプチャのリセット
alt_ic_isr_register(PIO_0_IRQ_INTERRUPT_CONTROLLER_ID, PIO_0_IRQ, pio_0_callback, (void *)0, (void *)0); //割り込みハンドラ登録
}
int main()
{
init();
while(1); //割り込み待ち受け
return 0;
}
##Modelsimでの時間測定結果
Niosが起動するタイミングを探るためpio_0に200us周期のクロック入れてみた。800usあたりでbusyに出力があるのでこの辺でプログラムも起動してるらしい。pio_0のパルスは850us~850.1usにいれてみる。
force -freeze sim:/display_qsys_tb/display_qsys_inst_pio_0_external_connection_bfm_conduit_export St0 0
force -freeze sim:/display_qsys_tb/display_qsys_inst_pio_0_external_connection_bfm_conduit_export St1 850000000
force -freeze sim:/display_qsys_tb/display_qsys_inst_pio_0_external_connection_bfm_conduit_export St0 850100000
run 1ms
・・・じっくり待つ・・・
pio_0立下り(割り込み発生)からbusyの立ち上がり(処理開始)まで4550ns ( ´_ゝ`)フーン
#VIC(Vectored Interrupt Controller)使用
##Platform Editor
通常割り込みの構成のほかに、VICを追加するのと、Nios2→AdvancedタブのGeneral-Interrupt controllerをInternalからExternalに変更する。
##Eclipse
通常割り込みのときと同じ
##Modelsimでの時間測定結果
通常割り込みのときと同じくpio_0にパルスいれる設定をする。実行する。じっくり待つ・・・。
pio_0立下り(割り込み発生)からbusyの立ち上がり(処理開始)まで1570ns 通常に比べて3倍速い!
#まとめ
通常にくらべてVICを使用すると、割り込み応答時間が約3倍速くなった。
参考書では「4~5倍良い割り込み性能」とうたってるけど、他にチューニングがある?