2017-12-15 8 views
0

の運転時間は、次のサブルーチンの(ナノ秒単位)で実行時間を決定し決定しますトリプルネストされた遅延ループ

delay: 
     push r22 
     ldi r20, 0x40 
del1: nop 
     ldi r21, 0xFF 
del2: nop 
     ldi r22, 0xFF 
del3: nop 
     dec r22 
     brne del3 
     dec r21 
     brne del2 
     dec r20 
     brne del1 
     pop r22 
     ret 

は、ここに私の仕事です:

ちょうど数を答える
Inner loop = 1 + 254(1 + 3) + (1 + 2) = 1020 
Middle loop = 1 + 254(1020 + 1 + 3) + (1020 + 1 + 2) = 261 120 
Outer loop = 1 + 63(261120 + 1 + 3) + (261120 + 1 + 2) = 16 711 936 
Total cycles = 16 711 936 + 2 (push) + 1 (ldi) + 2 (pop) + 4 (ret) 
      = 16 711 945 

サイクル数は問題ありませんが、マイクロコントローラはATMega 2560です。

+0

重複の可能性:https://stackoverflow.com/questions/35750663/calculating-delay-from-3-nested-loops、https://stackoverflow.com/questions/47453737/how-do -avr-assembly-brne-delay-loops-work、https://stackoverflow.com/questions/24097526/how-to-make-a-delay-in-assembly-for-avr-microcontrollers –

答えて

1

これが正解です:

Inner loop = 1 + 254(1 + 3) + (1 + 2) = 1020 
Middle loop = 1 + 254(1020 + 1 + 3) + (1020 + 1 + 2) = 261 120 
Outer loop = 1 + 63(261120 + 1 + 3) + (261120 + 1 + 2) = 16 711 936 
Total cycles = 16 711 936 + 2 (push) + 1 (ldi) + 2 (pop) + 4 (ret) 
      = 16 711 945 

式が真ならldi + (n-1) * (body + ldi + brne_true) + (body + ldi + brne_false)

  • LDI = 1サイクル
  • brne = 2サイクル、1サイクルであるか偽
  • 12月= 1サイクル
  • NOP = 1サイクル
  • プッシュ= 2サイクル
  • pop = 2サイクル
  • RET = 4サイクル

内側ループの本体は、1つのNOP命令であり、我々は、LDIとbrneためのサイクルを知って、その後2最後の反復のために、3です。

中間ループの本体は1 nop命令+内側ループの結果です。

最外ループの本体1 nop命令+中間ループの結果。

次に、合計サイクル数=外側のループサイクル数+ push + ldi + pop + retです。

合計時間を得るには、クロック数をヘルツ単位で分けます。

Total time = 16711945/16000000 = 1.044 seconds or 1044496562.5 nanoseconds

0

シミュレータであなたの前提をテストするだけです!

いくつかのヒント:外側のループで

  1. それは0xFFではありませんカウンタ変数にロードされている
  2. 0xFFでは254ではありませんが、255
  3. はリターンサイクルをカウントすることを忘れないでください
  4. ところで

...あなたはまた、R21とR20をプッシュする必要があります...

+0

私のシミュレータは実行されません。なんらかの理由でカーソルにジャンプしてこれを実行するのは時間がかかりすぎます。 について 1.カウンタ変数には何がロードされていますか? 2。0xFFは255ですが、BRNEが真の場合は2サイクル、偽の場合は1であることがわかります。そのため、括弧内に254が追加されて2番目の式が追加されています。 3.それは私の悪いです。 また、回答ではなくコメントでヒントを与えてください。 – Shea

+0

1の場合、0x40がカウンタ変数にロードされていることがわかりました。 – Shea

関連する問題