![]() |
AVR-Programmierung: einige Tipps |
zurück |
|
Hier sind zum Thema AVR-Programmierung einige Tipps und Hinweise auf Stolperstellen zusammengestellt. Die Liste wird im Laufe der Zeit sicher noch anwachsen. 1. pop und push ins Unterprogramm auslagern?Gleich vornweg: es geht und trägt zur Übersichtlichkeit bei, wenn an mehreren Stellen im Programm die gleichen Register gesichert werden müssen, aber es erfordert einige Takte zusätzlich. In zeitkritischen Interrupt-Routinen muß man also von Fall zu Fall beurteilen, ob man von dieser Möglichkeit Gebrauch macht. Zu beachten ist, was wann auf dem Stack passiert. Angenommen, das Unterprogramm fürs Registersichern wird aufgerufen:
Hier muß man nun beachten, daß nach diesem Aufruf die Rücksprungadresse zuoberst auf dem Stack liegt. Würde man jetzt im Unterprogramm per push-Befehl die Register sichern, würde die Rücksprungadresse darunter begraben. Der Returnbefehl würde folgerichtig die letzten gesicherten Registerinhalte als Adresse interpretieren - das Chaos wäre perfekt. Erfolgversprechender ist diese Lösung, bei der zunächst die Rücksprungadresse ins Z-Register geholt und nach dem Sichern der anderen Register wieder abgelegt wird:
Für das Zurückholen der gesicherten Daten ist natürlich die Reihenfolge umgekehrt; das Sichern der Rücksprungadresse erfolgt aber in der exakt gleichen Reihenfolge!
Dieser Ablauf gilt eigentlich für alle Prozessoren, lediglich bei von 16 bit abweichender Programm-Adressbreite sind entsprechende Anpassungen vorzunehmen. Für den AT90S2313 funktioniert die Methode exakt so wie beschrieben. 2. Division und Multiplikation mit 2n ...wird vorteilhaft durch bitweises Rechts- bzw. Linksschieben erledigt:
Das kann zu Überraschungen führen, wenn das Carry-Flag von einer vorhergehenden Operation gesetzt wurde. Man sollte also daran denken, daß dieses mit rotiert und es sicherheitshalber per separaten Befehl zurücksetzen:
Dieser Fehler ist auch mit Hilfe des Simulators ziemlich schwer zu finden, insbesondere, wenn er nur in bestimmten Konstellationen auftritt. Ähnliches gilt für alle anderen Operationen, die von Flags beeinflußt werden, welche nicht vom unmittelbar davor abgearbeiteten Befehl gesetzt werden. |