Hallo, bin auf der Seite http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten#Einfache_Tastenentprellung_und_Abfrage im Code: [avrasm] .def iwr0 = r1 .def iwr1 = r2 [avrasm] draufgestoßen.
Schaus dir an: http://de.wikipedia.org/w/index.php?title=Datei:IWRSuedWestAnsicht.jpg&filetimestamp=20080511114232
Wenn man r0, r1, r... schreibt wird der Code sehr schnell unübersichtlich. Daher legt man fest, welche Register welche Funktion haben sollen und gibt ihnen Namen. Und da man schreibfaul ist, kürzt man die Namen ab. Peter
Hi >Daher legt man fest, welche Register welche Funktion haben sollen und >gibt ihnen Namen. Und da man schreibfaul ist, kürzt man die Namen ab. Wird lustig, wenn es mehr Funktionen, als Register gibt. Und .def iwr0 = r1 ist auch nicht sehr klug gewählt -> Ergebnisregister von 'mul' und Konsorten. Da hat jemand den Unsinn von GCC nachgemacht. MfG Spess
> .. kürzt man die Namen ab ...
... und dann wird es wieder unübersichtlich.
Bezeichner müssen aussagekräftige Namen haben und der Quellcode
informative Kommentare.
spess53 schrieb: > Wird lustig, wenn es mehr Funktionen, als Register gibt. Damit ist die Funktion von Registern gemeint, wie: - Arbeitsregister für Interrupts - SREG-Sicherungsregister - Arbeitsregister fürs Main - Argumentenregister - Returnwerteregister - Zählregister in Schleifen spess53 schrieb: > .def iwr0 = r1 ist auch nicht sehr klug gewählt Das ist eben der Vorteil von Definitionen, braucht man die Multiplikation, kann man das leicht und nur an einer Stelle ändern. Peter
Hi
>Damit ist die Funktion von Registern gemeint, wie:
Habe ich auch gemeint. Aber ab einer bestimmten Programmgröße kann ein
Register nicht nur eine Funktion haben. Z.B. eine SQRT64-Funktion die
etwa 2/3 der Register benötigt. Das schmeißt sofort dein schönes Schema
über den Haufen. Und solche Funktionen habe ich mehrere. Bei
Spielzeugprogrammen von Anfängern mag das vielleicht hilfreich sein.
Aber sehr schnell kann aus der Lust Frust werden. Aber das soll jeder
selbst entscheiden. Ich programmiere lieber, als meine Zeit mit dem
Umdefinieren von Registern oder movw-Orgien zu verschwenden.
MfG Spess
spess53 schrieb: > Z.B. eine SQRT64-Funktion die > etwa 2/3 der Register benötigt. Das schmeißt sofort dein schönes Schema > über den Haufen. Nö. Dann benutzt Du eben nur für diese Funktion einige Register anders. Die Regeln sollen helfen, einen Großteil der Aufgaben zu erleichtern, sie müssen garnicht für alles passen. Der Mensch ist kein Compiler, er darf die Default-Regeln auch mal außer Kraft setzen. Nur die Interruptregister sind exklusiv reserviert. Man kann es aber auch wie ein Compiler machen, wenn die Register für Parameterübergabe nicht mehr ausreichen, nimmt er eben SRAM. Man muß nicht zu 100% optimalen Code schreiben. Man sollte immer Aufwand und Nutzen abwägen. Daher schreibe ich auch große Programme in C. In Assembler ist für mich bei bei 2kB Flash die Schmerzgrenze erreicht. Peter
Hi >Nö. >Dann benutzt Du eben nur für diese Funktion einige Register anders. Die Funktion liegt aber in einer Lib, die von mehreren Programmen benutzt wird. Eigene Defs in einer Lib erzeugen beim AVR-Assembler2 Warnungen und, wenn ich mich recht erinnere, beim AVR-Assembler1 sogar Fehler. Die Verwendung zusätzlicher Libs macht dann das Chaos perfekt. Also verbietet sich für wiedervewendbaren Code die Benutzung von .def. Und damit wird die Ausnahme zu Regel. >Nur die Interruptregister sind exklusiv reserviert. ? >In Assembler ist für mich bei bei 2kB Flash die Schmerzgrenze erreicht. Wenn ich z.B. alle Routinen meiner GLCD-Lib für T6963 einbinde, wären davon schon 1,5kB weg, ohne eine Codezeile geschrieben zu haben. Sagt also nichts über den wirklichen Programmieraufwand aus. MfG Spess
spess53 schrieb: >>Nur die Interruptregister sind exklusiv reserviert. > ? Das Main darf sie nicht benutzen, da ja jederzeit ein Interrupt zuschlagen kann und diese dann zerstört. Interruptregister gehören nur den Interrupts, damit diese nicht mit Push/Pop-Orgien wertvolle CPU-Zeit verplempern. In C geht das nicht, daher dauern Interrupts deutlich länger. spess53 schrieb: > Wenn ich z.B. alle Routinen meiner GLCD-Lib für T6963 einbinde, wären > davon schon 1,5kB weg, ohne eine Codezeile geschrieben zu haben. Nun, die kommt ja nicht aus der Luft geflogen, sondern muß auch erstmal geschrieben worden sein. Ich würde sowas nie in Assembler schreiben. Schon allein, um sie auf anderen MCs (Z.B. 8051, Cortex-M3) sofort verwenden zu können. Zum mehrmals neu Schreiben und Debuggen habe ich definitiv keine Lust. Peter
Hi >Das Main darf sie nicht benutzen, da ja jederzeit ein Interrupt >zuschlagen kann und diese dann zerstört. Was hat das mit der Verwendung von .def zu tun? Abgesehen von der Tatsache, das es in den meisten Fällen nicht notwendig ist so superschnell zu reagieren sollte man sich die 2,3 Register merken können/müssen. Denn jeder sollte sich im Klaren sein: Entweder selbst definierte Registerbezeichner, aber dann konsequent und mit den o.g. Nebenwirkungen, oder die vordefinierten Registerbezeichner. Beides zu vermischen ist Harakiri >Nun, die kommt ja nicht aus der Luft geflogen, sondern muß auch erstmal >geschrieben worden sein. Ja. Aber die Lib ist seit etwa 12 Jahren bei verschiedensten Projekten im Einsatz. Das macht 128 Byte Code/Jahr. Pro Projekt noch weniger. Also nicht wirklich eine Belastung. >Ich würde sowas nie in Assembler schreiben. Schon allein, um sie auf >anderen MCs (Z.B. 8051, Cortex-M3) sofort verwenden zu können. Zum >mehrmals neu Schreiben und Debuggen habe ich definitiv keine Lust. Das hat aber jetzt gar nichts mit der Verwendung von .def zu tun. MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.