Forum: Mikrocontroller und Digitale Elektronik AtMega8 und g++ Optimierung: PIN einlesen wird wegoptimiert


von stefan-koch (Gast)


Lesenswert?

Hallo,

ich steuere ein Display mit dem Atmega8 an, der Code ist in C++ 
geschrieben.
Unter anderem gibt es folgende Methode mit der "PROBLEMZEILE".
1
unsigned char readByte()
2
{
3
  unsigned char byte;
4
5
  DDRD=0x00; //PortD as input
6
  PORTD=0xFF; //PortD with internal Pull-Up
7
8
  PORTB |= (1 << WRB); // Read
9
10
  //Dummy read after setting address
11
  PORTB |= (1 << RDB);
12
  PORTB &= ~(1 << RDB);
13
  PORTB |= (1 << RDB);
14
15
  // really read
16
  PORTB |= (1 << RDB);
17
  PORTB &= ~(1 << RDB);
18
  byte = PIND;                 //PROBLEMZEILE
19
  PORTB |= (1 << RDB);
20
21
  return byte;
22
}

Ohne Compileroptimierung gibt es keine Probleme. Wenn ich die 
Compileroptimierung einschalte geht es nicht mehr richtig.

Wenn ich byte mit einem eigenen Wert überschreibe also z.B.
byte = 0; statt byte = PIND;
Dann funktioniert die Funktion. Aber so ist es ja nicht gedacht.

Kann es sein das der Lesezugriff PIND einfach wegoptimiert wird?
Wie kann ich das verhindern?

Danke

Stefan

von Karl H. (kbuchegg)


Lesenswert?

stefan-koch schrieb:

> Kann es sein das der Lesezugriff PIND einfach wegoptimiert wird?

Wird er nicht.
Dein Problem ist ein anderes. Du überfährst dein LCD, dein Code ist zu 
schnell. Nach dem Anlegen des RDB Pulses braucht das LCD eine gewisse 
Zeit, bis die Information bereit steht.

In der nicht optimierten Version, sind diese ganzen Operation
  PORTB |= (1 << RDB);
etc.
so implementiert, wie du sie hingeschrieben hast. Über den Daumen führt 
jede Zeile zu 3 Assmembler Instruktionen. In der optimierten Version 
optimiert der Compiler das aber zu nur einer einzigen Assembler 
Instruktion. D.h. das vorgeplänkel vor

  byte = PIND;

läuft jetzt wesentlich schneller ab. Zu schnell für dein LCD.

(AUs dem gleichen Grund hast du wahrscheinlich auch den Dummy Read 
eingeführt. Einfach nur um etwas Zeit zu gewinnen. Das ist keine gute 
Idee. Wenn dir das LCD vorschriebt, dass du eine gewisse Zeit zu warten 
hast, dann warte auch diese Zeit. Die _delay_xx Funktionen sind da 
nützlich).

von Steel (Gast)


Lesenswert?

Was geht nicht mehr richtig, was funktioniert nicht?

Wenn was wegoptimiert wird dann wohl eher der (notwendige?) dummy-read. 
Möglicherweise tuts deswegen die Funktion nicht mehr.

von stefan-koch (Gast)


Lesenswert?

Mit einem delay klappt es...
Wenn ich mit delay, den Code nicht optimiere ist das image gleich um 3K 
größer...

Mein Ziel ist aber, das Display ziemlich flott zu beschreiben, 
unoptimiert dauert das komplette Display zu initialisieren noch 1-2 Sek.

Wie kann ich verhindern, dass der Dummy-Read wegoptimiert werden kann?
(Ich konnte aber nicht feststellen, dass er wegoptimiert wurde - 
brauchen tue ich ihn aber)

von Ralf G. (ralg)


Lesenswert?

stefan-koch schrieb:
> Mein Ziel ist aber, das Display ziemlich flott zu beschreiben,

Zwischen den einzelnen Befehlen zur Initialisierung und Senden der Daten 
müssen definierte Pausen sein! (-> Datenblatt)

von Karl H. (kbuchegg)


Lesenswert?

stefan-koch schrieb:
> Mit einem delay klappt es...
> Wenn ich mit delay, den Code nicht optimiere ist das image gleich um 3K
> größer...

logisch.
Genau so ist das ja auch dokumentiert.

> Wie kann ich verhindern, dass der Dummy-Read wegoptimiert werden kann?

Brauchst du nicht. Der wird nicht wegoptimiert.

von stefan-koch (Gast)


Lesenswert?

Können PINX-Zugriffe, die auf eine Variable geschrieben werden nie 
wegoptimiert werden?

Kennt Ihr einen Link mit weiteren und guten Informationen zum Thema?

von stefan-koch (Gast)


Lesenswert?

Hätte die delay-Funktion nicht auch so programmiert werden können, dass 
sie weniger Speicher verbraucht?

von Karl H. (kbuchegg)


Lesenswert?

stefan-koch schrieb:
> Können PINX-Zugriffe, die auf eine Variable geschrieben werden nie
> wegoptimiert werden?

Richtig.

>
> Kennt Ihr einen Link mit weiteren und guten Informationen zum Thema?

Wie wäre es mit dem

AVR-GCC-Tutorial

von Karl H. (kbuchegg)


Lesenswert?

stefan-koch schrieb:
> Hätte die delay-Funktion nicht auch so programmiert werden können, dass
> sie weniger Speicher verbraucht?

Nochmal: schalte den Optimizer ein!
Das ist insofern sogar doppelt wichtig, weil die Delay-Zeiten, wenn du 
den Optimizer abgeschaltet hast, nicht stimmen.

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.