我的练习:•使用三个环路@ 1 MHz时钟频率计算可能的最大延迟。 (答案49.94 s)
delay: ldi r23,$FF ;Initialise 3rd loop counter
loop3: ldi r24,$FF ;Initialise 2nd loop counter
loop2: ldi r25,$FF ;Initialise 1st loop counter
loop1: dec r25 ;Decrement the 1st loop counter
brne loop1 ;and continue to decrement until 1st loop counter = 0
dec r24 ;Decrement the 2nd loop counter
brne loop2 ;If the 2nd loop counter is not equal to zero repeat the 1st loop, else continue
dec r23
brne loop3
ret ;Return
我试图使用这3个循环来计算最大延迟,答案显然是49.94秒,而我真的很挣扎,它更简单,有2个嵌套循环。
这是我尝试过的,但答案很明显。
33*((255*3)-1) + 17*((33*3)-1) + 11*3
ldi
- 1个时钟周期,brne
1或2个时钟周期
架构:ATmega8535
答案 0 :(得分:2)
对于初学者来说,最长的循环会将0
而非FF
加载到计数器,但让我们坚持使用FF
,以便我们得到预期的答案。使用FF
循环运行254次并在第255次退出。
通用公式为1
ldi
,(n-1) * (body + 3)
为完整迭代(1
为dec
,2
为brne
最后一个(body + 2)
1
dec
和1
未brne
。 body
表示循环体中的任何内容,对于最内层的循环0
,因为它是空的。
因此,对于最里面的循环:1 + 254 * (0 + 3) + (0 + 2) = 765
。
对于中间循环,body
是来自最内层循环的765
,因此我们有:1 + 254 * (765 + 3) + (765 + 2) = 195840
。
对于最外层循环,body
是来自中间循环的195840
我们有:1 + 254 * (195840 + 3) + (195840 + 2) = 49939965
这是预期的答案。