AVR SEI命令

AVR SEIの命令) 割り込みを有効にする前に、次の命令が終了するのを待ちます。

SREGでIフラグを設定するために別の命令を使用する場合、これも1命令待ちますか

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

それがSEI命令の特徴である場合、SEIを実行するサイクルで、または次の命令で、どの時点でフラグが実際に設定されるのでしょうか。

12
ru de
@Voracこれをどうやってテストできるかの例を教えてください。それは確かに私の受け入れられた答えでしょう。
追加された 著者 AJM,
これは大きな問題ですが、テストして確認することはそれほど難しくありません。
追加された 著者 KC Baltz,
それはAVR構造の実装の特徴、そして割り込みが扱えられるところかもしれません。 AVRアーキテクチャであるIIRCは3ステージパイプラインを使用しました。したがって、次の命令は、Iフラグの変更を使用して割り込みをチェックすることができる前に、すでに「実行中」(すなわち、パイプラインステージ1、またはそれ以降)にある可能性がある。私は長い間探していませんでした、しかし、私はAVRアーキテクチャの設計者が彼ら自身を過度に制限したと思いません。そのため、パイプラインのステージ1で命令の割り込みをテストし、次の命令の前(ステージ2ではしない)にある程度の柔軟性を与えます。
追加された 著者 Kiran,

4 答え

実験結果

他の答えは思慮深くそして十分に理にかなっていますが、それらはすべて不完全であるか単なる推測です。ドキュメンテーションがあいまいな場合は、実験しなければならず、すべてのケースをテストしなければなりません。

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

手順

テストするために、私はちょっとしたArduino(ATMEGA328P)プログラムを作りました。

  1. 返されないISRを設定します( while(1)
  2. ソフトウェアでトリガできるソースにISRを割り当てました( INT0 が低くなります)
  3. 無効な割り込み
  4. 保留状態になるように割り込みを有効にしてトリガーしました

割り込みが有効になった後、単一の命令でLEDを点灯させるテストベッドを使用しました。テストベッドで割り込みを有効にするさまざまな方法を試してLEDをチェックすることで、有効にした命令の後の命令が実行されたかどうかを判断できます。

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

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

結果

SEI instruction (base case)

コード:

sei

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

OUT instruction

コード:

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

結果:

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

ST instruction

コード:

   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: SREGI ビットを 0 から 1 に変更すると、次のようになります。どの命令を使用してビットを設定するかにかかわらず、保留中の割り込みがあっても次に実行する命令。

ノート

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

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

6
追加された
@ gbulmer 100%同意します。文書化されていない機能をプロダクションで使用する彼は悲しいことをするべきです。それでも興味深い経験的な質問(そして答え)であり、おそらく1回限りの個人的なプロジェクトに頼っても大丈夫です。
追加された 著者 chews,
仕様があいまいな場合は、「経験的結果」に問題があります。テストした特定のハードウェアが特定の方法で機能するからといって、他の部分がそのように機能するわけではありません。仕様を変更しない限り、Atmelは実装を変更することができます。そのため、「文書があいまいなところでは...」ということは、実験とテストの後でも、まだあいまいなままです。
追加された 著者 Kiran,
はい、あなたは魅力的な調査をしました。
追加された 著者 Kiran,

It is my understanding from the documentation that performing the sei instruction is no different from directly writing a 1 to the I bit of the SREG. The advantage of the instruction is you don't need to first load a value of 1< into a working register in order to change the SREG, thus it saves time.

詳しくは、 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

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


ちょっと検索したところ、Arduinoフォーラムのこちらのスレッドに、動作を検証するためにさまざまなテストが実行されました。それは私が上で言ったことと一致するようです。

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

4
追加された
SREGI ビットを設定するために SBI を使用することはできません。そのため、実際には実際にテストされていない可能性があります。組み立てることすらありません。 SBI下位32個のレジスタでのみ操作できますとSREGはスロット63にあります。
追加された 著者 chews,
2番目の例の場合、保留中の割り込みはいつ処理されますか。最初のようにサイクル遅延はありますか?
追加された 著者 AJM,
良い発見、ありがとう:)
追加された 著者 AJM,
それで、SEIに特有であるがOUTには特有ではないが、次の命令を完了させることを可能にする操作を遅らせるという側面はありませんか?
追加された 著者 jumojer,
@ jayjayが私の更新を見ます。
追加された 著者 Tom Carpenter,
@bigjosh SBIの例は後で考えたものです - out は私がもともと使っていたものです。私は私がより低い32のレジスタにSREGを持っているAVR(ATTinyかもしれない)に出会うだろうと思ったが、私はそれを想像しているのかもしれない。
追加された 著者 Tom Carpenter,

私見は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);
}

あいにく私はそれをする時間が足りません:(

1
追加された

それはそれが言うことではありません。ドキュメンテーションは言う

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

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

0
追加された
これはすべて本当ですが、私の質問は次のとおりです。この動作はSEIに固有のものですか。
追加された 著者 AJM,
@jayjayこれは命令パイプラインの長さによるものと思われる
追加された 著者 MaryBeth,