www.mikrocontroller.net

Forum: Compiler & IDEs Portzugriffe und Optimierung


Autor: Stefan Wieden (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

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

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Wieden (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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....

Autor: Stefan Wieden (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stoppt alles,

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

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

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Wieden (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Bewertung
0 lesenswert
nicht 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.

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.