ISRなしで割り込みを有効にする


10

割り込みが有効になっている場合に何が起こるか知りたいのですが(例:NXPのLPC1778のCANモジュールのアービトレーションロスト割り込み)、割り込みにISRが定義されていません。

そのような割り込みが発生すると、それぞれの割り込みフラグが設定されることがわかりますが、ISRを定義していないため、そのような割り込みの制御転送用に格納されている割り込みベクトルオフセットアドレスはなく、制御はパスバックします。メインルーチンに割り込みフラグをリセットして、メインルーチンでポーリングフラグをリセットできます(これは私が考えていることです)。ジャンプするISRがないことをCPUが把握しているときに、レイテンシはありますか?

発生する可能性のある解決策が本当に役に立ちます。

ありがとう。

更新:

uCでCAN割り込みを有効にしましたが、ISRを定義していません。内部ループバックテストを実行すると、コードが無限ループに入りました。LPC1778で実行されている無限ループの逆アセンブリコードを次に示します。

B       .
ENDP

したがって、割り込みを使用している場合は、ISRを使用してください。


3
メイン関数でフラグをポーリングできるようにするために、割り込みを有効にする必要はありません。フラグを設定する条件が発生すると、関連する割り込みを有効にしたかどうかに関係なく、そのフラグが設定されます。
brhans 2016年

「バスアービトレーションロスト割り込み」を有効にしない場合でも、バスアービトレーションロスト割り込みフラグが設定されると言っています(ただし、割り込みステータスレジスタ以外にバスアービトレーションが失われたことを示すステータスレジスタはありません)?
AlphaGoku 2016年

はい。私が使用したすべてのMCUで、割り込みフラグは、それらを設定する必要がある条件が発生するたびに設定されます。割り込みを有効にすると、関連するフラグが設定されている場合にMCUがハンドラーにベクターし、割り込みを無効にするとフラグが無視され、フラグが設定されていてもハンドラーにベクターされません。割り込みの無効化/有効化は、フラグ設定動作ではなく、割り込みハンドラへのジャンプ動作にのみ影響します。
brhans 2016年

わあ、それは私が知らなかったものです。どうもありがとう。したがって、割り込みが有効になっていない場合でも、すべてのドライバーは割り込みステータスレジスタを定期的にチェックしてリセットする必要があります:)
AlphaGoku

@AkshayImmanuelDは重要な場合にのみ使用してください。割り込みが常に無効であり、フラグについて他に何も気にしない場合、フラグが設定されているかクリアされているかは重要ではありません。
ホッブズ

回答:


17

ISRが定義されていない場合、割り込みベクトル内のジャンプ命令の場所はnullであるか、例外ルーチンへのジャンプであるか、プログラムの先頭へジャンプするか、または "return from割り込み」(例:RTI)命令。

ATMega 16プロセッサの割り込みテーブルの逆アセンブルは、このようなケースを処理するルーチンにベクター化された3つの未使用の割り込み(無限ループに入る可能性があります)と1つの正当なベクターを示しています。

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

欠落したISRを処理するための前述の方法は、マイクロコントローラーとコンパイラーのアーキテクチャーの両方に依存します。RTIまたは同等の命令の場合は、すぐにアプリケーションに戻ります。ただし、割り込みがエッジトリガーではなくレベルトリガーの場合、これによりおそらく割り込みが再度トリガーされ、無限ループになります。

内部割り込み(たとえば、UARTによって受信される文字)がレベルトリガーと見なされるか、エッジトリガーと見なされるかは、チップのアーキテクチャーに依存すると思います。外部割り込みは通常、どちらか一方として設定できます。

他にも1つのケースがあり、時にはいくつかの割り込みがグループ化され、同じベクトルを使用します。これは、割り込みが2、3回しかなかった古いプロセッサに特に当てはまります。その場合、割り込みの原因は、割り込みレジスタのステータスをポーリングすることで特定されました。これは、提案したようなものです。

ただし、システムに割り込みを設定し、ISRを定義しないことは、どのような場合でも悪い習慣です。しないでください。


2
....または、未定義にすることができます。
Wouter van Ooijen

@WoutervanOoijenそれは私が割り込みベクトルがnullであることによって意味しました。
tcrosley 2016年

1
ステータスレジスタは、上記のようないくつかのエラーを示すことはできません。しかし、そのようなエラーには割り込みがあります。したがって、エラーを特定するために割り込みを有効にし、ISRを使用しないことを考えました。Keilを使用してLPC1778をシミュレーションしている間、例外は発生しなかったので、uCは前述のようにRTIを使用する必要があると思います
AlphaGoku

1
注意事項-割り込みを有効にしても、ハンドラーがフラグをクリアしない場合(またはハンドラーがなく、デフォルトの動作が単純な戻りである場合)、MCUが永久に終了する可能性があります。割り込みループでスタックしました。
brhans 2016年

1
ATSAM3X8EのPIO割り込みはエッジトリガーできますが、一度設定された割り込み条件は、割り込みハンドラーでISR(割り込みステータスレジスタ)を読み取るまでクリアされず、ループ@brhansが言及されます。
Simon Wright

1

それはあなたのMCU、コンパイラ、残りのコードに依存します。

私の経験から:

  1. AVR-デフォルトでISRを指定しない場合、フラッシュの割り込みベクトルは0x0000になります。つまり、この割り込みが発生するたびにアプリケーションがリセットにジャンプします。

    本当に割り込みが必要だがハンドラーは必要ない場合(たとえば、ADC低ノイズパワーダウンモードを使用し、割り込みを使用してMCUをウェイクアップするだけ)、EMPTY_INTERRUPTマクロを使用する必要があります。

  2. NXP Kinetis(ARM)-デフォルトでは、すべてのベクトルがブレークポイントを持つデフォルトのハンドラーを指し、CPUは単に停止してデバッガーに通知します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.