Portzugriffe und Optimierung

Gast #412128
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;
Gast #412130
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....
Angehängte Dateien:
Moderator Persönliche Seite #412132
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?
Gast #412133
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren