2

Microchip C18コンパイラを使用していますが、割り込みが発生すると、ISRコードの実行が開始されるまでにかなり長い遅延が発生します。

実験として、これは私の主な機能です:

while(1)
{
    LATAbits.LATA4 = 1;
    LATAbits.LATA4 = 0;
}

割り込みハンドラーとして、いくつかの例からコピーしたこのコードを使用しています(なぜこのように行われたのかわかりません)。

#pragma interrupt high_isr
void high_isr(void)
{
    LATAbits.LATA4 = 1;
    LATAbits.LATA4 = 1;
    LATAbits.LATA4 = 0;
    LATAbits.LATA4 = 1;
    LATAbits.LATA4 = 1;
    LATAbits.LATA4 = 0;
}

#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}

SPI経由でバイトを受信して​​いますが、バイトを受信した直後にメインループが停止します。次に、ISRコードの実行が開始される前に、16.5 µsの遅延が続きます。これは165命令サイクルです。

割り込みタイミング 画像を拡大

割り込みに関連するコンテキストの保存がいくつかあり、優先度の低い割り込みではさらに悪化することを私は知っています。IPENを無効にし、優先度の高いベクトルのみを使用しています。165の命令は、コンテキストを保存するための通常の期間ですか?

4

2 に答える 2

3

状況によっては、割り込みオーバーヘッドがあなたのように大きくなることがあります! これ
を見てください。

于 2011-06-20T22:59:50.323 に答える
0

PIC の割り込みから良好なパフォーマンスを得るための鍵は、必要なコンテキストの保存/復元コードの範囲を最小限に抑えることです。多くの場合、これは割り込みハンドラのタイム クリティカルな部分をマシン コードで記述することを意味します。割り込みの使用に専念できるバンク化されていないレジスタが少なくともいくつかある部品では (たとえば、FSR2 アドレッシングに 15 バイト、 FSR0 と FSR1 のアドレス指定、および FSR ごとに 1 つの「魔法の操作」レジスタ [そのようなアイデアについてチャットしたい])コンテキストの保存/復元なしでやり遂げることができる場合があります一般的な場合。たとえば、私の 14 ビット PIC プロジェクトの 1 つで、1000 クロック サイクルごとに割り込みが必要でした。したがって、RTCC プリスカラーを無効にすると、割り込みは次のようになりました。

INTERRUPT_ENTRY:
  bcf INTCON,TMR0IF
  decfsz int_counter,f
   リフィー
  movwf saveW
  movf STATUS,w
  clrf ステータス; バンク 0
  movwf saveStat
  動く 4
  movwf int_counter
  movlw 1024+3-1000 ' TMR0 未調整時間、プラス 3 'スリップ'、マイナス希望時間
  addwf TMR0,f
  bsf INTCON、GIE ; この時点以降、割り込みは安全にネストできます。
  ... その他の割り込み
  movf saveStat,w
  movwf ステータス
  swapf saveW
  retfie ; 割り込みが有効になっているため、RETURN を使用することもできます。  

時間の 3/4 で、合計 3 つの命令を実行した後に割り込みが返されることに注意してください。その下で実行されていたコードから合計約 6 サイクルかかります。

于 2012-02-09T16:03:09.943 に答える