Compiler optimiert Code weg, was er nicht sollte

OP #712598
Lesenswert?

Hi,

ich habe mir hier eine LCD Routine geschrieben um Sachen auf einem LCD 
auszugeben. Allerdings optimiert mir der Compiler bei der Options -Os 
Code weg, was er nicht machen sollte.

Hier mal ein Auszug aus der .c Datei:
[c]
     uint16_t t=0xffee;
     lcd_hex(t>>8);
     lcd_putc(' ');
     lcd_hex(t);
     lcd_putc(' ');

void lcd_hex(uint8_t d)
{
     uint8_t high,low;
     high = d >> 4; // copy high nibble
     low = d & ~((1<<7) | (1<<6) | (1<<5) | (1<<4)); // copy low nibble
     if(high > 9)
     {
          high += 'A';
          high -= '9';
          high -= 1; // in hex A or greater move to right position in 
matrix
     }
     high += '0'; // map 0x00 to char '0'
     lcd_write(high);

     if(low > 9)
          low += ('A' - '9' -1);
     low += '0';
     lcd_write(low);
}
[\c]

Was er aber nur ausgibt ist "FFE " aber er sollte "FF EE " ausgeben. Hat 
hier einer eine Idee woran das liegt?
Wenn ich die Option -Os durch -O0 ersetze klappt es wunderbar.
Nutze WinAVR 20070525.

Liebe Grüsse
Matthias
Persönliche Seite #712610
Lesenswert?

Wie sehen lcd_write() und lcd_putc() aus; ist da vielleicht ein 
Timingproblem?

Normalerweise muss die Optimierung eingeschaltet sein, damit die 
LCD-Timings exakt wie vorgegeben sind. Möglicherweise stimmen die Zeiten 
nicht und es werden Zeichen verschluckt, wenn die Ausgabefunktionen zu 
schnell nacheinander aufgerufen werden. Das würde sich entschärfen, wenn 
die Optimierung ausgeschaltet wird. Klappt eine schnelle Ausgabe eines 
"Hello World" Textes mit eingeschalteter Optimierung?

Wieso wird in lcd_hex() lcd_write() statt lcd_putc() benutzt?

Sowas macht mich misstrauisch. Nicht dass die eine Funktion für STRINGS 
statt für ZEICHEN ist. Ist aber eher eine unwahrscheinliche Möglichkeit, 
denn einiges bei der Ausgabe stimmt ja.

Als letzte Möglichkeit fällt mir ein, dass du ein gemischtes 
C/Assembler-Listing erzeugen lassen kannst und diese *.LSS Datei angeben 
lönntest. Dann sieht man welchen Code GCC aus deinem Quelltext 
produziert hat.
Gast #712652
Lesenswert?

Matthias Fechner schrieb:
>Das mit dem abschneiden ist Absicht

In der Tat, gcc akzeptiert

# include <stdint.h>
void test(uint8_t i)
{

}

int main(void)
{
  uint16_t j;
  test(j);
  return 0;
}

Ich dachte eigentlich, dass man korrekt
   test((uint8_t) j);
schreiben müsste.

Wieder was gelernt, wenngleich ich bei der Notation mit Type-Cast 
bleiben werde.
OP #713494
Lesenswert?

Hi Walter,

Walter wrote:
> wieso verwendest du ein Mal lcd_write und ein Mal lct_putc???????????
>
> dein lcd_putc baut sich aus lcd_write UND delay zusammen!!

oh man, manchmal sieht man de Wald echt vor lauter Bäumen nicht. Vielen 
Dank für den Tip, jetzt klappt es wunderbar.

VLG
Matthias

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