代码之家  ›  专栏  ›  技术社区  ›  Higeath

从3个嵌套循环计算延迟

  •  0
  • Higeath  · 技术社区  · 8 年前

    我的练习:在1 MHz时钟频率下使用三个环路计算可能的最大延迟。(答案49.94秒)

    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 回复  |  直到 8 年前
        1
  •  2
  •   Jester    8 年前

    对于初学者来说,最长的循环将加载 0 FF 去柜台,但我们还是坚持 关闭 所以我们得到了预期的答案。具有 关闭 循环运行254次,并在255次退出。

    一般公式为 1 对于 ldi , (n-1) * (body + 3) 对于整个迭代( 1. 对于 dec 2 对于 brne )和 (body + 2) 最后一个( 1. 对于 十二月 1. 未被接受 brne公司 ). body 表示循环体中的任何内容,对于最内部的循环 0 因为它是空的。

    因此,对于最里面的循环: 1 + 254 * (0 + 3) + (0 + 2) = 765 . 对于中间循环 身体 765 从最内层的循环,我们得到: 1 + 254 * (765 + 3) + (765 + 2) = 195840 . 对于最外环 身体 195840 从中间循环,因此 我们有: 1 + 254 * (195840 + 3) + (195840 + 2) = 49939965 这是预期的答案。