AVR SEI命令


13

AVR SEI命令(http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html)は、割り込みを有効にする前に次の命令が完了するのを待ちます

別の命令を使用してSREGのIフラグを設定した場合、これも1命令待機しますか?

つまり、待機はSEI命令またはステータスレジスタの機能ですか?

SEI命令の機能である場合、SEIを実行するサイクルで、または次の命令で、実際にどの時点でフラグが設定されますか?


これは素晴らしい質問ですが、テストして確認するのはそれほど難しくないはずです。
ヴォラック

1
@Voracこれをテストする方法の例を教えてください。それは確かに私の受け入れられた答えでしょう。
ジェイジェイ

1
これは、AVRアーキテクチャの実装の機能であり、割り込みを処理できる場合があります。IIRC、AVRアーキテクチャは3段階のパイプラインを使用しました。そのため、Iフラグの変更を使用して割り込みを確認する前に、次の命令が既に「実行中」(つまり、パイプラインステージ1以降)になっている可能性があります。私は長い間探していませんでしたが、AVRアーキテクチャの設計者が自分自身を過度に制約しているとは思いません。そのため、次の命令(ステージ2)の前ではなく、パイプラインのステージ1で命令の割り込みをテストすると、ある程度の柔軟性が得られます。
gbulmer

回答:


8

実証結果!

他の答えは思慮深く根拠のあるものですが、それらはすべて不完全または推測にすぎません。文書があいまいな場合は、実験し、すべてのケースをテストする必要があります。

この質問は決定的な答えに値するので、AVRを引き出していくつかのビットを設定しましょう!

手順

テストするために、次のような小さなArduino(ATMEGA328P)プログラムを作成しました。

  1. 決して戻らないISRをセットアップします(while (1)
  2. ISRをソフトウェアでトリガーできるソースに割り当てました(INT0ローになります)
  3. 無効化された割り込み
  4. 保留中になるように割り込みを有効にしてトリガーした

割り込みが有効になった後、単一の命令でLEDをオンにするテストベッドを使用しました。テストベッドで割り込みを有効にするさまざまな方法を試し、LEDを確認することで、有効にする命令の後の命令が実行されたかどうかを確認できました。

LEDが点灯しなかった場合、割り込みが有効になった直後にISRが実行(およびロック)されたことがわかります。

LEDが点灯した場合、ISRが呼び出される前に次の命令の実行が許可されていることがわかります。

結果

SEI 指示(基本ケース)

コード:

sei

結果:LEDが点灯します。次の命令が実行されました。

OUT 命令

コード:

in  r16,0x3f   // Get SREG
ori r16,128    // Set I bit 
out 0x3f,r16   // Save back to SREG

結果:

LEDが点灯します。次の命令が実行されました。

ST 命令

コード:

   clr r29        // Clear Y high byte
   ldi r28,0x5f   // Set Y low byte to point to SREG
   ld r16, Y      // Get SREG
   ori r16,128    // Set I bit 
   st Y,r16       // Put SREG

結果:

LEDが点灯します。次の命令が実行されました。

結論!

Q:待機はSEI命令またはステータスレジスタの機能ですか?

A:Iビットを変更することSREGは、a 0からa1ビットを設定するために使用される命令に関係なく、保留中の割り込みがある場合でもと、次の命令が次に実行できるようです。

ノート

これは実際、多くの複雑な問題を伴う非常に興味深い質問に変わりました。詳細に興味がある場合は、チェックしてください...

http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/


2
仕様があいまいな場合、「経験的結果」に問題があります。テストした特定のハードウェアが特定の方法で機能するからといって、他の部品がそのように機能するわけではありません。Atmelは、仕様を変更しない限り、実装を変更する自由があります。したがって、「ドキュメントがあいまいな場合...」は、実験とテストの後、まだあいまいなままであることに変わりはありません。
gbulmer

@gbulmer 100%に同意します。本番環境で文書化されていない機能を使用している彼は、悲しいことになるでしょう。まだ興味深い経験的質問(および回答)であり、おそらく1回限りの個人プロジェクトに依存してもかまいません。
bigjosh

はい、あなたは魅力的な調査をしました。
-gbulmer

4

ドキュメントから、sei命令を実行することは、SREGのIビットに直接1を書き込むことと同じであると理解しています。この命令の利点は、1<<ISREGを変更するために最初に値を作業レジスタにロードする必要がないため、時間を節約できることです。

詳しく説明するには、次を使用しseiます。

sei ; One cycle

を使用してビットを設定しますsbi(SREGがレジスタマップの下位32バイトにあった場合にのみ機能しますが、すべてではないにしてもほとんどではないようです)。

sbi SREG,7 ; Two cycles

SREGに直接Iビットを書き込む:

in  r24,SREG ;
ori r24,0x80 ;
out SREG,r24 ; Three cycles

IビットはとすぐSREGに設定されるべきsei命令(またはsbiあるいはout)完了。ただし、保留中の割り込みは、次の命令が完了するまで処理されません。ビットが設定されますが、割り込みが有効になるまでに余分なサイクルがかかります。割り込みは命令の途中で処理することができず、一部の命令は実行に複数のサイクルを要するため、1つの命令として有効になるまでにかかる時間を指定します。これは、コードのすべてのバージョンに当てはまります。つまり、上記のそれぞれが命令の遅延を引き起こします。


少し検索した後、私はこれを見つけまし Arduinoフォーラムでスレッドた。そこでは、動作を検証するためにいくつかの異なるテストが実行されました。私が上で言ったことに同意するようです。

さらに、そのスレッドによれば、Iフラグが既に設定されseiている場合、遅延応答は命令自体ではなく、Iフラグによって制御される内部ハードウェアによって引き起こされることを意味する割り込みの遅延応答はありません- SREGのフラグを変更するあらゆる操作が、それもそうseiか、outまたはsts必要があります正確に同じ動作を。


したがって、SEIに固有であり、OUTではなく、次の命令を完了することを可能にする操作を遅らせる側面はありませんか?
ブライアンドラモンド

2番目の例の場合、保留中の割り込みはいつ処理されますか?最初のようなサイクル遅延はありますか?
ジェイジェイ

@jayjayは私の更新を参照してください。
トムカーペンター

1
ビットSBIを設定するために使用することはできないため、これを行うコードは実際には実際にはテストされていないことに注意してください。下位32レジスタでのみ動作し、SREGはスロット63にあります。ISREGSBI
bigjosh16年

@bigjoshのSBIの例は、後で考えたものでした- out私が元々使用していたものでした。下位32レジスタにSREGがあるAVR(おそらくはATTiny)に出くわすと思っていましたが、想像するかもしれません。
トム・カーペンター

1

私見はSREGへの書き込みをまだ行いますが、1つの命令は次のようにテストできます(擬似コード):

ISR() { PORTA = 0; while(1); }
main() 
{
    cli();
    DDRA = 0xff;
    configure_isr_for_level_interrupt_that_will_trigger_immediately();
    SREG = 0xff;
    cli();
    PORTA = 0xff;
    while(1);
}

残念ながら、私はそれをする時間が足りません:(


0

それは言うことではありません。ドキュメントは言う

SEIに続く命令は、保留中の割り込みの前に実行されます。

次の命令を待つわけではありません。フラグがすぐに設定されるのでこれを読みますが、有効になっている場合でも、次の命令が実行されるまで割り込みは処理されません。


これはすべて真実ですが、私の質問は次のとおりです。この動作はSEIに固有ですか?
ジェイジェイ

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