2011-06-20 3 views
1

私はMicrochip C18コンパイラを使用していますが、割り込みが発生すると、ISRコードが実行されるまでにかなりの遅延があります。実験としてマイクロチップC18の通常の割り込みレイテンシとコンテキスト保存時間はどのくらいですか?

、これは私の主な機能である:割り込みハンドラとして

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命令サイクルです!

interrupt timing enlarge image

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

答えて

2

状況によっては、割り込みオーバーヘッドがあなたのものと同じくらい素晴らしいことがあります。
をご覧ください。

+0

+1私はabuotを知っていましたが、実際には長時間かかる機能だと思っていました。優れたFAQ。 – AndreKR

0

PICの割り込みから良好なパフォーマンスを得るための鍵は、必要なコンテキストの保存/復元コードの必要性を最小限に抑えることです。多くの場合、これは、割り込みハンドラの時間が重要な部分をマシンコードに書き込むことを意味します。使用を中断することができる少なくともいくつかのアンバンクドライズされたレジスタを持つ部品(FSR2アドレッシングのために例えば15バイトを割り当てるのではなく、FSR2アドレッシングのための共通バンクのほとんどまたはすべてを貪欲にするというマイクロチップの決定を嫌うFSR0とFSR1のアドレッシングと、各FSRのための1つの "魔法の操作"レジスタ[私はそのようなことのためのアイデアについてチャットしたい])なしで得ることが可能である場合は、通常のコンテキストでの保存/復元。たとえば、私の14ビットPICプロジェクトの1つでは、1000クロックサイクルごとに割り込みが必要でした。時間の3/4、割り込みが何であれから約6サイクルの合計を取って、3つの命令のなんと合計を実行した後に返すこと

 
INTERRUPT_ENTRY: 
    bcf INTCON,TMR0IF 
    decfsz int_counter,f 
    retfie 
    movwf saveW 
    movf STATUS,w 
    clrf STATUS ; Bank 0 
    movwf saveStat 
    movlw 4 
    movwf int_counter 
    movlw 1024+3-1000 ' TMR0 unadjusted time, plus 3 'slip', minus desired time 
    addwf TMR0,f 
    bsf INTCON,GIE ; Interrupts can safely nest after this point! 
    ... other interrupt stuff 
    movf saveStat,w 
    movwf STATUS 
    swapf saveW 
    retfie ; Could just as well use RETURN, since interrupts are enabled 

注:だからRTCCプリスケーラを無効にして、私の割り込みは、のようなものでしたコードが実行されました。

+0

質問はC18コンパイラについてです。多分役立つかもしれませんが、文脈に置かないと答えの頭や尾を作ることはできません。私はこのインラインアセンブリコードをどこに置くべきかも知らない。 – AndreKR

関連する問題