2017-01-22 8 views
-2

割り込みが無効になっているときに、割り込みのコードが最後まで実行されていないと思われます。次のコードでは、variableAとvariableBの順番はいつ変わるのでしょうか? 少なくとも、いくつかのプリント(ルーチンが割り込みの途中で実行している場合)が異なる場合があります。しかし、割り込みが無効になった後に物事が終わると、両方の変数は常に同じ値になります。割り込みAを割り込みBから無効にすると、Aが終了するのを待たずに実行が停止しますか?

myInterruptは固定サンプル時間に呼び出され、someRoutineは別のサンプルレートで呼び出されます。外部条件は、プログラムのある時点で設定されます。

"someRoutine"が優先度の高い割り込みの場合はどうなりますか?

+0

'printf'を呼び出す準備中に割り込み関数が発生した場合、ある変数のコピーがスタックにプッシュされた後、他の変数のコピーがプッシュされる前に、' printf'は異なる値を出力します。 –

+0

'printf'は割り込みの途中で決して実行されず、呼び出し元はサービス中に割り込みを無効にできないため、割り込みハンドラの実行が完了するのを止めることができません。 –

+2

あなたの編集を覚えていれば、割り込みから 'printf'を呼び出すのは愚かでしょう、* escpecially *優先度の高いものです。より高いプライオリティの実行中に優先度の低い割り込みをディセーブルする点は何でしょうか? –

答えて

1

割り込みは、割り込みサービスルーチン(ISR)が完了するまでを実行するイベントです。。割り込みを無効にしても進行中のISRは中止されません。割り込みとISRは同じものではありません。割り込みのみを無効にします。

割り込みBの方が優先度が高く、割り込みAが優先されている場合、割り込みAを中断するには、スタックを変更してBからの戻りがAへのコンテキスト切り替えAによって没収されましたが、あなたは本当にそれを望んでいません - それは恐ろしく複雑で目標を超えています。あなたの割り込み処理に問題がある場合は、ほぼ確実に(良いデザインのような)簡単な解決策になります。

関連する問題