mikrocontroller.net

Forum: Compiler & IDEs WinAVR Register Doppelbelegung?


Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kriege hier echt noch Läuse...
Ich sitze schon seit Tagen über ein paar Zeilen aber irgendwie scheint 
GCC zwei Variablen die selben Register zuzuordnen. Kann sowas sein? Das 
ist auf jedenfall sehr schwer mit AVRStudio zu beurteilen ob da die 
Register nacheinander genutzt werden und die werte gesichert werden oder 
ob es da zu handfesten Kollisionen kommt.

Ist euch da irgendetwas bekannt ob GCC solche Bugs erzeugen kann? Hätte 
mal jemand Zeit drüber zu schauen?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann sowas sein?

Eigentlich nicht.

> Hätte mal jemand Zeit drüber zu schauen?

Über was?

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

Bewertung
0 lesenswert
nicht lesenswert
0undNichtig wrote:

> Ich sitze schon seit Tagen über ein paar Zeilen aber irgendwie scheint
> GCC zwei Variablen die selben Register zuzuordnen. Kann sowas sein?

Ja klar.  Warum sollte der Compiler eine so wertvolle Resource wie
ein CPU-Register noch blockieren für eine Variable, die bereits gar
nicht mehr genutzt wird?  Das wäre doch pure Verschwendung.  Der
Job des Optimierers ist es doch, die Register möglichst sinnvoll zu
belegen.

Gewöhn' dich dran.  AVR Studio ist sowieso eher ein mittelmäßiger
Debugger.  Wenn du's genau wissen willst, musst du eben den generierten
Assemblercode angucken oder dir den Code disassemblieren lassen.

Autor: 0undNichtig (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also ich benutze viele 16bit Doppelregister.
Wie man im Bild sieht haben x und pixelrest die selben Register. Nun 
kann es ein Bug im AVRStudio sein, eine Fehlinterpretation meinerseits 
oder GCC hat im Binary oder im ELF was falsch gemacht :-/

Ich weiß nicht ob ich es jemanden zumuten kann sich durch meinen Source 
zu wühlen...

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dir mal genau durchgelesen, was Jörg geschrieben hat?

"Warum sollte der Compiler eine so wertvolle Resource wie
ein CPU-Register noch blockieren für eine Variable, die bereits gar
nicht mehr genutzt wird?"

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das stimmt schon aber wenn ich das Disassembly richtig verstehe wird 
der Wert nicht gerettet.
Das Problem ist ja eigentlich auch, dass eine Stelle kommt, wo beide 
Variablen gebraucht werden, aber wenn beide die selben Register sind 
wäre das ja ohne Wirkung:
//check if the first pixelbyte is incomplete (necessary byte allready allocated)
  pixelrest=x % PixelSpace; //if x<3 it returns 3
  if (pixelrest!=0)
  {...
---- D:\Projekte\AVR\Hausmanagement\GLCD\Source\S1D13700ex.c --------------------------------------
261:        pixelrest=x % PixelSpace; //if x<3 it returns 3
+0000032C:   E037        LDI     R19,0x07         Load immediate
---- No Source ------------------------------------------------------------------------------------
+0000032D:   22E3        AND     R14,R19          Logical AND
+0000032E:   24FF        CLR     R15              Clear Register
---- D:\Projekte\AVR\Hausmanagement\GLCD\Source\S1D13700ex.c --------------------------------------
262:        if (pixelrest!=0)
+0000032F:   14E1        CP      R14,R1           Compare
---- No Source ------------------------------------------------------------------------------------
+00000330:   04F1        CPC     R15,R1           Compare with carry
+00000331:   F069        BREQ    PC+0x0E          Branch if equal

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

Bewertung
0 lesenswert
nicht lesenswert
Ganz nebenbei, bitte screenshots nicht als JPEG:

Beitrag "Schaltpläne und Board-Layouts gehören nicht ins jpg oder g"

Autor: wandwarze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bub, was denn? Kannst du nichts erkennen?

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

Bewertung
0 lesenswert
nicht lesenswert
0undNichtig wrote:

> Das Problem ist ja eigentlich auch, dass eine Stelle kommt, wo beide
> Variablen gebraucht werden, ...

Woher willst du das wissen?  Der Compiler kann und darf deinen Code
doch so umformen, dass er vielleicht nicht mehr beide Variablen
braucht?

>
> //check if the first pixelbyte is incomplete (necessary byte allready
> allocated)
>   pixelrest=x % PixelSpace; //if x<3 it returns 3
>   if (pixelrest!=0)
>   {...
> 

Ja, die Variable x wird ab dieser Stelle nicht mehr benötigt
(zumindest nicht im geposteten Teil), daher wird ihr ,Speicher' (also
ihr Registerpaar) durch den neuen Wert von pixelrest überlagert.  Das
hat hier sogar doppelt Sinn, da die Modulo-Operation mit (offenbar) 8
als UND-Verknüpfung mit 7 implementiert ist, und diese Operation ihr
Ergebnis zwangsweise erst einmal im bisherigen Register hinterlässt.
Wenn der Compiler also ab der linken Seite dieser Zuweisung den Wert
von x nicht mehr braucht, dann spart er sich sinnlosen Kopieraufwand.

Wenn dem nicht so ist: bitte compilierfähiges Schnipsel posten (am
besten gleich als Anhang), bitte nur den Code, keine langen
Disassemblerlistings.  Ich kann die Dinger sowieso nicht lesen, und
die Zuordnung des Quellcodes zum Objektcode ist bei guter Optimierung
schlicht nicht mehr möglich, verwirrt also eher.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Jörg Wunsch (dl8dtl)

>Ganz nebenbei, bitte screenshots nicht als JPEG:

Eben. Oder nochmal schön dargestellt.

Bildformate

MFG
Falk

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo werden denn in deinem Codefragment beide Variablen gleichzeitig 
gebraucht?

Autor: 0undNichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rolf in dem obigen Source bei der Modulo Operation

Also gut ich gehe mal davon aus, dass das stimmt. Ist mir ja schon 
öfters bei AVRStudio aufgefallen aber an der Stelle kam mir das 
irgendwie komisch vor...
Das ist aber auch doof fürs debuggen, na werde meinen (eigentlichen) 
Fehler schon finden.

Danke Leute! Sry wegen dem JPEG...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Jörg schon schreibt, wird x nur bis zu dieser Operation benötigt, 
pixelrest erst danach.

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.