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;
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.
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....
Stoppt alles, ich glaube ich habe den Fehler gefunden. DDRA habe ich vergessen :-( tut mir schrecklich leid....
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?
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.