JAJZ023C December 2021 – May 2025 AM2732 , AM2732-Q1
R5FSS:同じ割り込みを別の割り込み内にバック トゥ バックでネストできない
2 回目以降は、優先度の低い割り込み内で同じ高優先度の割り込みをネスト (プリエンプション) することはできません。2 回目に高優先度の割り込みが発生した場合、プログラムが低優先度の割り込みサービス ルーチン (ISR) を終了するまで待つ必要があります。この問題が生じるのは、現在のプリエンプションに続く優先度の高い割り込みが、元のプリエンプションの原因となった割り込みと同じ場合のみです。元の優先度の高い割り込みが 2 回目に発生する前に、別の割り込みが低優先度の ISR をプリエンプトした場合は、問題はありません。この問題は、VIM でのベクタ インターフェイス法と MMR インターフェイス法の割り込み処理の両方に影響します。この問題は、FIQ と IRQ の両方の割り込みに影響します。
ソフトウェア回避方法が存在します。SW の回避方法の目的は、同じ割り込みが連続的にアクティブ化するのを防止し、それによってバグの必要な条件を取り除くことです。これは、最高の優先度レベル (優先度 0) を予約し、その優先度をダミー割り込み (R5FSS で使用可能な 512 個の割り込みのいずれか) に使用して、各 ISR 内でこのダミー割り込みを呼び出すことによって実現できます。さらに、R5FSS コア自体がこのダミー ISR に入る必要はなく (マスクすることも可能です)、このダミー ISR を中心とする VIM とのハンドシェイクだけを行う必要があります。
疑似コード例を以下に示します。ご要望いただければ、TI はこの回避方法を実行するために必要なドライバを提供いたします。
any_isr_routine {
...
1: set I/F bit in CPSR ; //so R5FSS cannot be interrupted again. I for irq, F for fiq
2: Trigger dummy_intr; //writing 1'b1 to Interrupt RAW Status/Set Register bit in VIM corresponding to the chosen dummy_intr
3: rd_irqvec; //Read IRQVEC register in VIM to acknowledge dummy_isr
4: clear dummy_isr; //writing 1'b0 to Interrupt RAW Status/Set Register bit in VIM corresponding to the chosen dummy_intr
5: wr_irqvec;//Write to IRQVEC register in VIM to denote end of interrupt
6: clear I/F bit in CPSR;
…
}
Note: Depending on where the workaround code is inserted in the ISR, step 1 & 6 may not be needed.
この回避方法の短所は、優先度 0 を使用できず (優先度 1~15 のみが使用可能)、ISR 実行時にレイテンシが付加されることです。