2016-03-02 2 views
0

Mon exercice: • Calculer le délai maximum possible à l'aide de trois boucles à la fréquence d'horloge de 1 MHz. (Réponse 49,94 s)Calcul du délai à partir de 3 boucles imbriquées

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 

Je suis en train de calculer le délai maximum en utilisant les 3 boucles, la réponse est apparemment 49,94 s et je suis vraiment mal, il était beaucoup plus simple avec 2 boucles imbriquées.

Voici ce que j'ai essayé, mais la réponse est loin.

33*((255*3)-1) + 17*((33*3)-1) + 11*3 

ldi-1 cycle d'horloge, brne 1 ou 2 cycles d'horloge

Architecture: ATmega8535

+0

'ldi r23, $ FF; Initialise le 3ème compteur de boucle 17' <- Votre commentaire ne correspond pas au code. Vous utilisez également 17 et 33 dans votre tentative de calcul. D'où avez-vous tiré ces valeurs? Et si vous vouliez le délai maximum possible, ne devriez-vous pas initialiser les compteurs à 0? – Michael

+0

quelle architecture est-ce? l'ajouter à la balise –

Répondre

2

Pour commencer, la plus longue boucle chargeraient 0 pas FF au comptoir, mais nous allons coller avec FF Nous obtenons donc la réponse attendue. Avec FF la boucle s'exécute 254 fois et sort le 255ème.

La formule générale est 1 pour ldi, (n-1) * (body + 3) pour les itérations complètes (1 pour dec et 2 pour brne) et (body + 2) pour le dernier (11 pour dec et pour ne pas prendre brne). body signifie tout ce qui est dans le corps de la boucle, pour la boucle la plus interne 0 car elle est vide.

Ainsi, pour la boucle la plus interne: 1 + 254 * (0 + 3) + (0 + 2) = 765. Pour la boucle du milieu, le body est le 765 de la boucle la plus interne, donc nous avons: 1 + 254 * (765 + 3) + (765 + 2) = 195840. Pour la boucle la plus externe, le body est le 195840 de la boucle du milieu, donc nous avons: 1 + 254 * (195840 + 3) + (195840 + 2) = 49939965 qui est la réponse attendue.

+0

Je suis un peu confus avec le (corps +3) maintenant si ldi s'exécute une fois donc 1 et dec et brne court 254 fois donc ne serait-ce pas 2 * 254 sur la boucle finale brne est 2 Donc, tout cela ressemblerait à 1 + 2 * 254 + 2 – Higeath

+0

Vous avez échangé les temps pour le 'brne', il faut 2 horloges quand il recule, c'est dans la boucle, et 1 horloge quand il ne saute pas, ça est la dernière itération. – Jester

+0

Je l'ai maintenant, merci :) Je ne veux pas vous fardeau, mais pourriez-vous me dire quel serait le retard par exemple. boucles r23, $ 06, r24, $ FD, r23, $ DD; Il est plus difficile de suivre avec tous les mêmes chiffres ma réponse pour ceux-là est 1174836 cycles d'horloge J'essaie de le recréer dans Excel donc je n'ai pas besoin de le calculer à chaque fois – Higeath