确定三重嵌套延迟循环的 运行 时间
Determine the running time of a triple nested delay loop
确定以下子程序的运行时间(以纳秒为单位):
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。
只需在模拟器中测试您的假设即可!
一些提示:
- 在外循环中,计数器变量中加载的不是 0xFF
- 0xFF 不是 254,而是 255
- 别忘了数 return 个周期
顺便说一下...你还应该按 r21 和 r20...
这是正确答案:
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 个周期
- ret = 4 个周期
内层循环体是1条nop指令,我们知道ldi和brne的循环数是3,最后一次循环是2。
中间循环体是1条nop指令+内层循环的结果
最外层循环体1 nop指令+中间循环结果
那么总循环次数=外循环次数+push+ldi+pop+ret。
要获得总时间,请将周期数除以以赫兹为单位的时钟速度。
Total time = 16711945 / 16000000 = 1.044 seconds or 1044496562.5 nanoseconds
确定以下子程序的运行时间(以纳秒为单位):
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。
只需在模拟器中测试您的假设即可!
一些提示:
- 在外循环中,计数器变量中加载的不是 0xFF
- 0xFF 不是 254,而是 255
- 别忘了数 return 个周期
顺便说一下...你还应该按 r21 和 r20...
这是正确答案:
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 个周期
- ret = 4 个周期
内层循环体是1条nop指令,我们知道ldi和brne的循环数是3,最后一次循环是2。
中间循环体是1条nop指令+内层循环的结果
最外层循环体1 nop指令+中间循环结果
那么总循环次数=外循环次数+push+ldi+pop+ret。
要获得总时间,请将周期数除以以赫兹为单位的时钟速度。
Total time = 16711945 / 16000000 = 1.044 seconds or 1044496562.5 nanoseconds