Eine Warteschleife

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 741
Registriert seit: Apr 2014
Bewertung: 5
#1
19.06.2019, 17:36

Hallo zusammen,

Heute mal eine Warteschleife.

Die Warteschleife ist zwar eine Sünde, da sie den Prozessor im Kreis herum schickt und wertvolle Rechenzeit vergeuden lässt. Aber in vielen Situationen ist man auf eine Warteschleife angewiesen um ein Timing für Signal zu erreichen oder um Geschehnisse beobachten zu können, die bei voller Geschwindigkeit nicht nachvollziehbar wären.

Ausgehend von einem Prozessortakt von 4MHz sieht das wie folgt aus:

 
                  ; *********************************************
                  ; Pausenschleife
                  ; *********************************************
_pause:            push bc                          ;
                  ld bc,0000H                      ; 2,5 µs
                 
_ploop:            dec bc                           ; 1,5 µs
                  ld a,b                           ; 1 µs
                  or c                             ; 1 µs
                  ex (sp),hl                       ; 4,75 µs
                  ex (sp),hl                       ; 4,75 µs
                  ex (sp),hl                       ; 4,75 µs
                  ex (sp),hl                       ; 4,75 µs
                  ex (sp),hl                       ; 4,75 µs
                  ex (sp),hl                       ; 4,75 µs
                  jr nz,_ploop                     ; 3 µs bzw 1,5 µs, wenn fertig
                 
                  pop bc
                  ret
 

wir haben hier also pro Schleifendurchlauf 35 µs. Plus 2,5 µs für den ld bc,xxxx Befehl. Im Beispiel wird BC mit 0 geladen. Das bedeutet, es werden 65536 Schleifendurchläufe generiert. Macht 2.293.760 µs. Das sind umgerechnet 2,293 Sekunden (plus 4 µs für's laden und beenden). Die Befehle Push, Pop und Ret habe ich nicht mit berechnet. Bei langsamerem Takt dauert's das Ganze natürlich länger!

Die Anzahl der "ex (sp),hl" muss übrigens immer durch zwei teilbar sein, da hier der Inhalt des Stackpointers mit dem Inhalt des Registers HL getauscht wird. Zweimal ex (sp),hl hintereinander stellt sozusagen den ursprünglichen Zustand wieder her. Eine ungerade Anzahl von ex (sp),hl bringt das laufende Programm mit ziemlicher Sicherheit aus dem Takt bzw. zum Absturz.

Gruß
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 19.06.2019, 17:37 von Unilein.)
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste