mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik was heißt eigentlich "iwr"


Autor: h2oundco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin auf der Seite 
http://www.mikrocontroller.net/articles/AVR-Tutori...
im Code:
[avrasm]
.def iwr0      = r1
.def iwr1      = r2
[avrasm]
draufgestoßen.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
InterruptWorkRegister

Autor: h2oundco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> .. 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.