计算3个嵌套循环的延迟

时间:2016-03-02 14:55:04

标签: assembly avr timing

我的练习:•使用三个环路@ 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

1 个答案:

答案 0 :(得分:2)

对于初学者来说,最长的循环会将0而非FF加载到计数器,但让我们坚持使用FF,以便我们得到预期的答案。使用FF循环运行254次并在第255次退出。

通用公式为1 ldi(n-1) * (body + 3)为完整迭代(1dec2brne最后一个(body + 2) 1 dec1brnebody表示循环体中的任何内容,对于最内层的循环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这是预期的答案。