1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NiosII通常割り込み(IIC)とVICの応答時間を比較する

Last updated at Posted at 2019-08-04

VIC(Vectored Interrupt Controller)を使用すると、割り込み応答性能が良くなると聞いたので、
通常割り込みからどの程度速くなるのか比較してみる。

参考書:AN595: ベクトル割り込みコントローラの使用およびアプリケーション

#環境
Quartus Prime 18.0
Modelsim INTEL FPGA EDITION 10.5b

#通常割り込み(IIC)

Platform Editor

入力ポートとしてpio_0を追加して、立下りエッジでNiosに割り込みをかけるように設定する。
出力ポートとしてbusyを追加して、処理の開始と終了がみれるようにする。
pf_normal.PNG

##Eclipse
適当なプロジェクトを作って以下のコードを書く。

test.c
#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 ( ´_ゝ`)フーン
normal.PNG

#VIC(Vectored Interrupt Controller)使用
##Platform Editor
通常割り込みの構成のほかに、VICを追加するのと、Nios2→AdvancedタブのGeneral-Interrupt controllerをInternalからExternalに変更する。
pf_vic.PNG

##Eclipse
通常割り込みのときと同じ

##Modelsimでの時間測定結果
通常割り込みのときと同じくpio_0にパルスいれる設定をする。実行する。じっくり待つ・・・。
pio_0立下り(割り込み発生)からbusyの立ち上がり(処理開始)まで1570ns 通常に比べて3倍速い!
vic.PNG

#まとめ
通常にくらべてVICを使用すると、割り込み応答時間が約3倍速くなった。
参考書では「4~5倍良い割り込み性能」とうたってるけど、他にチューニングがある?

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?