确定三重嵌套延迟循环的运行时间

问题描述 投票:0回答:2

确定以下子例程的运行时间(以纳秒为单位):

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。

assembly nested-loops avr timing
2个回答
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个周期
  • dec = 1个周期
  • nop = 1个周期
  • 推= 2个周期
  • pop = 2个周期
  • 对= 4个周期

内循环的主体是1 nop指令,我们知道ldi和brne的循环是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. 不要忘记计算返回周期

顺便说一下......你还应该推r21和r20 ......

© www.soinside.com 2019 - 2024. All rights reserved.