Forum: Compiler & IDEs Portzugriffe und Optimierung


von Stefan Wieden (Gast)


Lesenswert?

Wie verhindere ich, dass der gcc (ich benutze noch den alten 3.4.3)
Port-Zugriffe wegoptimiert. Das Code-Beispiel unten soll einen Clock an
zwei Pins auf Port-A erzeugen. Allerdings optimiert der gcc die drei
Zugriffe irgendwie weg/zusammen, wenn die Optimierung von -O0 auf -Os
umgestellt wird. Nur bei -O0 wird der Clock richtig erzeugt....

Testweise habe ich ein nop nach jedem Zugriff eingebaut, hat aber auch
nicht geholfen....


#define DRV_PORT PORTA
#define ROW_SCK (_BV(PA1))
#define COL_SCK (_BV(PA5))

      DRV_PORT = tmp;  // data output with clock == LOW
      // clock rising edge
      DRV_PORT = tmp | COL_SCK | ROW_SCK;
      // clock falling edge
      DRV_PORT = tmp;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Port-Zugriffe werden nicht wegoptimiert, da die Port-Adressen
als volatile markiert sind.

Wenn du einen compilierbaren Code postest, können wir uns das mal
angucken, aber so einen alten Compiler kann ich nicht mehr
auftreiben.  Mit Mühe werde ich noch einen 3.4.6 finden, aktuell
nehme ich eigentlich nur noch 4.1.x.

von Stefan Wieden (Gast)


Angehängte Dateien:

Lesenswert?

Ich möchte euch nicht die Zeit stehlen... Ich habe auch gesehen, dass
das eigentlich nicht sein sollte, hätte ja der alte gcc sein können...

Aber falls ihr euch wirklich die Arbeit machen wollt, habe ich mal ein
test-programm generiert. (siehe Anhang) Dazu auch zwei Bilder vom
Logic-Analyser, einmal die Signale mit der Optimierung -O0, einmal mit
der Optimierung -Os.

Man sieht, dass bei Optimierung -Os einige Pulse fehlen, insbesondere
die RCK Pulse aber auch Clock Pulse.

Im Grunde macht das Programm nichts anderes, als mit den Port's zu
wackeln....

von Stefan Wieden (Gast)


Lesenswert?

Stoppt alles,

ich glaube ich habe den Fehler gefunden. DDRA habe ich vergessen :-(
tut mir schrecklich leid....

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mist, ich merke gerade, dass ich den GCC 3.4.6, den ich immer
noch auf einer Maschine hatte, vorige Woche gelöscht habe.

GCC 4.1.1 erzeugt:

        ldi r25,lo8(8)
.L10:
        cp r20,r26
        brne .L11
        ori r25,lo8(4)
.L11:
        out 59-0x20,r25
/* #APP */
        nop
/* #NOAPP */
        mov r24,r25
        ori r24,lo8(34)
        out 59-0x20,r24
/* #APP */
        nop
/* #NOAPP */
        out 59-0x20,r25
/* #APP */
        nop
/* #NOAPP */

was korrekt aussieht.  Deine NOPs sind ja gut zu erkennen.

Wie sieht denn dein Assemblercode aus?

von Stefan Wieden (Gast)


Lesenswert?

Hallo Jörg,

ich war halt etwas verzweifelt nachdem ich den Fehler nicht finden
konnte... Tut mir leid, den gcc verdächtigt zu haben...

Ich hatte einfach vergessen im DDRA die Ports auf output zu
programmieren. Man sieht ja trotzdem Signale, aber die sind halt nicht
sauber. Je langsamer um so besser sehen sie aus... Daher auch der
Unterschied bei der Optimierung.

Na ja, jetzt läufts, vielen vielen Dank für die Hilfe...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klar, dann haben dir die Pullups ein ,,Signal'' generiert.

Mit dem Oszi wärst du wahrscheinlich besser beraten gewesen als
mit dem LA, dann hättest du den langsamen Signalanstieg bemerkt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.