2016-03-02 59 views
0

我的练习:•使用三个环@ 1 MHz时钟频率计算可能的最大延迟。 (回答49.94 S)计算来自3个嵌套环路的延迟

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

'ldi r23,$ FF;初始化第三循环计数器17' < - 您的评论与代码不匹配。您在尝试计算时也使用了17和33。你从哪里得到这些价值?如果你想尽可能延迟,不应该把计数器初始化为0吗? – Michael

+0

哪个架构是?将它添加到标签 –

回答

2

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

通式为1ldi(n-1) * (body + 3)为全面迭代(1dec2brne)和(body + 2)为最后一个(dec11为不采取brne)。 body意味着无论在循环体中,对于0的最内层循环,因为它是空的。

因此,对于最内层循环:1 + 254 * (0 + 3) + (0 + 2) = 765。 对于中间循环,body是来自最内层循环的765,因此我们有:1 + 254 * (765 + 3) + (765 + 2) = 195840。 对于最外层循环body195840从中间循环,因此 我们有:1 + 254 * (195840 + 3) + (195840 + 2) = 49939965这是预期的答案。

+0

我现在有点困惑(身体+3)所以ldi运行一次所以1然后dec和brne运行254次所以不会是最后循环2 * 254 brne是2所以整个事情看起来像1 + 2 * 254 + 2 – Higeath

+0

你交换了'brne'的时间,当它跳回时它需要2个时钟,在循环中需要2个时钟,当它不跳转时需要1个时钟,是最后一次迭代。 – Jester

+0

我现在明白了,谢谢:)我不是要给你带来负担,但你能告诉我延迟会是什么,例如,循环r23,$ 06,r24,$ FD,r23,$ DD;这是很难遵循所有相同的数字我对这些的答案是1174836时钟周期我试图在Excel中重新创建它,所以我不必每次计算它 – Higeath