mikrocontroller.net

Forum: Compiler & IDEs Optimierung: Löst gcc oder AVR struct- Adressen auf


Autor: GerdS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,
kurze Frage:

Wenn ich im Programm mit statischen structs arbeite und ich auf die 
struct- Elemente ohne Pointer zugreifen will, wer löst die Adressen der 
Elemente auf?

Kann das der avr-gcc  schon beim Compilieren oder muss der uC dies zur 
Laufzeit berechnen ?

Gruß und Dank
Gerd

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler versucht zu entscheiden, was günstiger ist im jeweiligen
Fall.  Wenn du in einer Funktion nur einmal auf ein solches Element
zugreifst, wird er ganz sicher direkt die Adresse benutzen.  Greifst
du kreuz und quer auf die struct members zu, hat es mehr Sinn, die
Basisadresse in ein Zeigerregister zu laden und dann nur noch mit den
Offsets zu arbeiten.

Offset-indirekte Adressierung beherrscht jeder ordentliche Prozessor,
das konnte sogar schon der Z80 (dort war's aber teuer, da es in den
i8080 opcode space nachträglich reingeflanscht war und dadurch mit
Präfixbytes arbeiten musste).

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Offset-indirekte Adressierung beherrscht jeder ordentliche Prozessor,

Schon mal mit einem Intel IA64 (Itanium) programmiert? Der kann das 
nicht, nur indirekt (vgl. ehedem AMD 29000). Aber man kann beim einem 
vorigen Lade/Speicher-Befehl nebenbei was auf den verwendeten Pointer 
anschliessend draufaddieren um für den nächsten Zugriff gewappnet zu 
sein. Operation-Scheduling zum anfassen.

Die 8051er können auch nur direkt und notfalls indirekt adressieren, 
nicht aber mit Offset - weiss nicht, ob du die als "ordentlich" ansiehst 
(die 14-Bit PICs lasse ich deshalb mal weg ;-).

Eine Daumenregel, was effizienter ist, gibt es also nicht. 8-Bitter 
kommen meist ganz gut mit direkter Adressierung zurecht, auch wenn das 
nicht immer der kürzeste Weg sein muss (AVR), grössere Dinger bevorzugen 
die Adressierung über einen Pointer.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Schon mal mit einem Intel IA64 (Itanium) programmiert?

Nö, ist mir erspart geblieben.

> Der kann das
> nicht, nur indirekt (vgl. ehedem AMD 29000).

Nun, dann fällt er halt nicht in meine Definition von "ordentlichem
Prozessor". :-)

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.