2011-12-21 36 views
2

別の割り込みベクタの中で割り込みベクタをコールすることはできますか?例えば他の割り込みベクタ内の割り込みベクタを呼び出す

、私はep4inoutの手順をやっている間、割り込みベクタ:

void ep4inout interrupt 0 
{ 
    . 
    . 
    . 
    Timer1 = 1; //call interrupt for timer 1 
    . 
    . 
    . 
} 

編集

私のコードは、おおよそ次のようになります。タイマ1 = 1は、タイマ1の割り込み要求がセットされていることを示します。タイマー1 ISRの私の手順は機能しません。 FX2LPのマニュアルでは、タイマー1の方がエンドポイントバッファよりも高い優先度を持っています。タイマー1の優先度を高く、エンドポイント4を低く設定しようとしました。それでも同じ結果。私のIDEとしてKeil uVision2を使用し、私のマイクロコントローラはCypress FX2LP(enchanced 8051 - USBコントローラ)です。

void ISR_Ep4inout(void) interrupt 0 
{ 
    . 
    . 
    . 
    Timer1Enable = 1; 
    Timer1 = 1; //call interrupt for timer 1 
    . 
    . 
    . 
} 

void TMR1_Vect(void) interrupt 2 //timer 1 interrupt 
{ 
. 
. 
. 
} 

void TMR1_Vect interrupt 0 //timer 1 interrupt 
{ 
    . 
    . 
    . 
} 

答えて

0

関数が通常のC関数である場合、コンパイラはその関数が割り込みとして使用されていることを知ることができません。はい、あなたはその機能を呼び出すことができます。

あなたの場合のように、interrupt 0または他の手段(ISRINTERRUPT)を使用してそのような機能を指定する必要がある場合は、通常はできません。
問題は、多くの場合、関数を終了するために使用される命令(アセンブラレベルで)returnです。割り込みサービスルーチンの場合、コンパイラは異なる戻り命令を使用する必要があります。

"関数を呼び出す"ために、別の方法を指定しました。Timer1 = 1;がタイマ割り込みの割り込み要求ビットを効果的に設定し、割り込みサービスルーチンをアクティブにすると仮定します。これはまったく問題ではありません。しかし、どの割り込みが最初に処理され、ISRが中断されているかについて、プロセッサ/コンパイラのマニュアルを確認する必要があります。

詳細情報と詳細を提供している可能性があります。誰もが「割り込みベクタを呼び出す」と言っているわけではなく、「変数」が1に設定されていることを示しています。私はあなたが組み込み開発をしていると思います。コンパイラやプロセッサのようなものは、有用な答えを提供すること以上のものであることを示してください。

+0

返信いただきありがとうございます。私のKeil uVision 2を使用して私のマイクロコントローラはサイプレスFX2LPです。タイマー1のISRをテストした後、私の手続きは中断されません。タイマー1は、タイマー1の割り込みが呼び出されたことを意味します。ところで、エンドポイント4の優先順位は何ですか? –

+2

@FranzMationg元の質問を編集してこの情報を追加するとよいでしょう。このサイトは、あなただけでなく、同じまたは類似の質問をしているすべての人に役立つように意図されています。さらに、Cypress USBコントローラファミリに精通していないユーザーにとっては、プロセッサが強化された8051の実装であると述べると便利です。 –

関連する問題