mikrocontroller.net

Forum: Compiler & IDEs WINAVR mag keinen Vergleich mit 1


Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei ein Testprogramm, wo eine Routine um 24Bytes größer ist, nur weil
ich es gewagt habe auf das Bit 0 zu testen (i & 1).

Alle anderen Tests der Bits 1..7 (i & 2) .. (i & 0x80) werden dagegen
brav mit SBRS übersetzt.

Ist dieser Bug schon bekannt oder behoben ?

Ich optimiere -Os


Peter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du scheinst da eine recht gut abgehangene Compilerversion zu verwenden.
Ich bekomme beim Kompilieren mit einer aktuellen Version jedenfalls die
folgenden Fehler/Warnungen angezeigt:

andreas@d700 tmp $ avr-gcc -Os -mmcu=atmega16 -g -o t.elf t.c
In file included from t.c:1:
  /usr/local/avr/avr/include/io.h:3:2: Warnung: #warning "<io.h> is
  deprecated, use <avr/io.h> instead"
In file included from t.c:2:
  /usr/local/avr/avr/include/interrupt.h:3:2: Warnung: #warning
  "<interrupt.h> is deprecated, use <avr/interrupt.h> instead"
t.c:3:20: signal.h: Datei oder Verzeichnis nicht gefunden
t.c:23: error: redefinition of `SIGNAL'
t.c:10: error: `SIGNAL' previously defined here

Wenn ich die includes anpasse und das Programm kompiliere, dann kann
ich das von dir beobachtete Problem nicht nachvollziehen. Listing ist
im Anhang.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt noch mehr Enten da drin.

"char t;" sollte wohl besser "volatile char t;" sein, ansonsten
hat
diese Variable ja überhaupt keinen Sinn (und kann gut wegoptimiert
werden).

Außerdem ist eine Konstruktion wie

if (i & 4)
  if (i & 2)

optimierungswürdig:

if (i & (4 | 2))

oder gleich

if (i & 6)

Schade, daß der Compiler das nicht optimiert.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quatsch natürlich:

if ((i & 6) == 6)

muß das heißen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas,

in dem Readme steht: WinAVR 20030115
Ich werde mal die neueste saugen müssen und testen.



@Joerg,

das ist auch kein funktionsfähiger Code, sondern soweit verkürzt, daß
der Bug noch klar hervortritt.
Z.B. hatte der if(i&2) noch einen else Zweig.


Peter

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Durch das Verkürzen kannst Du aber oft genug infolge der Optimierung
den (vermeintlichen) Bug nicht mehr nachweisen.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So die neue Version ist jetzt: WinAVR 20030424

Der 2.Interrupt mit (i&1) ist aber immer noch 68 Byte groß.

Dafür ist jetzt auch der 1. Interrupt mit (i&4) von 44 auf 50 Byte
angewachsen.

Absolut super !!!
Wirklich toll !!!

Anbei das Listing.

Hoffentlich finde ich die alte WINAVR Install noch, damit wenigstens
der 1.Interrupt wieder kürzer ist.


Peter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das versprochene Listing.

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

also bei der angehängten Notation erledigt kommt das von dir erwartete
Ergebnis raus. Wahrscheinlich hat der AVRGCC ein Problem mit dem
verketteten if die ich auch nicht sehr lesbar finde.

Matthias

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas,

Dein Listing sieht ja o.k. aus.
Bloß nützt mir das nichts, da ich nicht weiß, wie ich das reproduzieren
kann.
Ich habe ja heute die neueste Version auch ohne Erfolg probiert.

Und das ich Dir meine Programme zum Compilieren schicke, will ich Dir
nicht zumuten.

Wie kriegst Du denn die Quellzeilen mit ins Listing ?


@Matthias,

wie schon gesagt, ich habe da einiges rausgeschnippelt, nicht nur das
else beim 2. if. D.h. so kann ich es nicht machen.


Peter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende nicht die neueste WinAVR-Version, sondern ich habe den
Compiler vor ein paar Tagen aus dem aktuellen Quellen selber kompiliert
(3.3.1 20030720).

Das Listing bekommt man mit

  avr-objdump -d --source (elf-datei)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht allerdings nur wenn mit der Option -g kompiliert wurde.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Andreas,

ich hab jetzt eine Lösung gefunden, kostet nur einen Befehl mehr, also
wesentlich besser als 12 Befehle mehr:

 i = PIND<<1; // jetzt kann ich Bit 1 testen (vormals Bit 0)

 if( i & 2 )
   if( i & 4 )
     t++;
   else
     t--;

Merkwürdig ist die Bit0-Allergie aber doch. Tritt auch nur in
Zusammenhang mit dem 2. if auf.


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.