インテルのみ表示可能 — GUID: iga1457465685895
Ixiasoft
インテルのみ表示可能 — GUID: iga1457465685895
Ixiasoft
37.6.2.1. alt_ic_isr_register() とalt_irq_register()
拡張API関数のalt_ic_isr_register() は、レガシー関数のalt_irq_register() に非常に類似しています。ただし、いくつかの重要な違いがあります。これら2つの関数の違いは、2つのAPIにおけるISRのレジスター のコードを確認することで理解することができます。この例では、ボード・サポート・パッケージ (BSP) に実装されているレガシーAPIまたは拡張APIのいずれかにタイマー割り込みを登録します。この例は、このドキュメントに付属するコード例から直接引用されています。
2つのAPIにおけるISRのレジスター
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT void timer_interrupt_latency_init (void* base, alt_u32 irq_controller_id, alt_u32 irq) { /* Register the interrupt */ alt_ic_isr_register(irq_controller_id, irq, timer_interrupt_latency_irq, base, NULL); /* Start timer */ IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK); } #else void timer_interrupt_latency_init (void* base, alt_u32 irq) { /* Register the interrupt */ alt_irq_register(irq, base, timer_interrupt_latency_irq); /* Start timer */ IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK); } #endif
2つのAPIにおけるISRのレジスター の最初の行では、BSPが拡張割り込みAPIを実装しているかを検出します。拡張APIが実装されている場合、timer_interrupt_latency_init() 関数は拡張関数を呼び出します。そうでない場合、timer_interrupt_latency_init() はレガシー割り込みAPI関数に戻ります。
BSPで実装するAPIを Nios® IIソフトウェア・ビルド・ツールで選択する方法に関しては、 Nios® II Software Developer’s HandbookのException Handlingの章で、「Interrupt Service Routines」を参照してください。
alt_ic_isr_register() 拡張関数 は、alt_ic_isr_register() 関数のプロトタイプを示しています。この関数は、ISRを拡張APIに登録します。割り込みコントローラー識別子 (引数ic_idで使用) および割り込みポート番号 (引数irqで使用) は、system.hで定義されます。
alt_ic_isr_register() 拡張関数
extern int alt_ic_isr_register(alt_u32 ic_id, alt_u32 irq, alt_isr_func isr, void *isr_context, void *flags);
比較するため、alt_irq_register() レガシー関数 では、alt_irq_register() 関数のプロトタイプを示しています。この関数は、ISRをレガシーAPIに登録します。
alt_irq_register() レガシー関数
extern int alt_irq_register (alt_u32 id, void* context, alt_isr_func handler);
alt_ic_isr_register() に渡される引数は、alt_irq_register() に渡される引数とはわずかに異なります。次の表は、2つの関数に対する引数を比較しています。
alt_ic_isr_register() の引数 | 目的 | alt_irq_register() の引数 |
---|---|---|
alt_u32 ic_id | system.hで定義される一意の割り込みコントローラーID | — |
alt_u32 irq | system.hで定義される割り込み要求 (IRQ) 番号 | alt_u32 id |
alt_isr_func isr | 割り込みサービスルーチン (ISR) の関数ポインター | handler |
void* isr_context | コンポーネント固有のデータ構造へのオプションのポインター | context |
void* flags | 予約済み。他のEICの実装でこの引数を使用する場合があります。 | なし |
レガシー割り込みAPIと拡張割り込みAPIには、他にも大きな違いがあります。これらの違いのいくつかは、ISR本体に影響します。特に、この2つのAPIは完全に異なる割り込みプリエンプション・モデルを採用しています。このドキュメントに付属するサンプルコードでは、多くの違いが表されています。
HAL割り込みAPIの他の関数については、 Nios® II Software Developer’s HandbookのException HandlingおよびHAL API Referenceの章を参照してください。