mikrocontroller.net

Forum: Compiler & IDEs Variablen nur in Registern, zuviel gepoppe in Interrupts?


Autor: pripri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend,
Hab bisher Assembler programmiert und bin nun dabei mich in den GCC 
einzuarbeiten.
Was mir auffiel:
1. Variablen werden im Ram abgelegt, auch wenn ich zB nur eine brauche. 
Gibts ne Möglichkeit, die Variable als Register zu deklarieren?
2. Bei Interrupts werden erstmal R0, R1, R24, R25, R28, R29 gepusht, 
auch wenn ich sie nicht brauche und dann natürlich auch wieder gepoppt. 
Kann man das auch umgehen?
mfg pripri

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1. Variablen werden im Ram abgelegt, auch wenn ich zB nur eine brauche.
> Gibts ne Möglichkeit, die Variable als Register zu deklarieren?

Es gibt eine Möglichkeit (Forumsuche benutzen).

Aber(!) diese Möglichkeit möchtest du wahrscheinlich nicht benutzen, 
weil nicht garantiert ist, dass sie in einem Jahr noch funktioniert und 
weil sie dir vermutlich zu wenig Vorteile bringt um diese 
Inkompatibilitätsgefahr zu kompensieren.

Dadurch, dass du eine Hochsprache wie C benutzt, erhältst du eine 
gewisse Abstraktion. Das Konzept "Register" wird von dieser Abstraktion 
versteckt.
Deswegen ist es eher unnatürlich in C Variablen an bestimmte Register zu 
binden. Bei lokalen Variablen wird der Compiler selbstverständlich auch 
ohne besondere Hinweise Register nutzen. Je nach Verwendung und 
Optimierungseinstellungen wird er die Variable sogar komplett vom RAM 
fernhalten und ausschließlich in einem Register speichern.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, schalte doch einfach mal die Optimierungsstufe -Os an. Die 
Optimierungen, die da gemacht werden sind ziemlich gut.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pripri wrote:

> 2. Bei Interrupts werden erstmal R0, R1, R24, R25, R28, R29 gepusht,
> auch wenn ich sie nicht brauche und dann natürlich auch wieder gepoppt.

Nein, R24, R25, R28, R29 werden nur gepusht, wenn man sie auch braucht

Und das Geeiere mit R0, R1 hat historische Gründe.
Sie wurden als Null- bzw. Statussaveregister deklariert, aber können von 
LPM, MUL geändert werden.
Ein Wechsel z.B. auf R2, R3 wurde bisher nicht angegangen, also muß man 
damit leben.


Peter

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.