Forum: Compiler & IDEs 16 bit Vergleich bei while


von Benedikt (Gast)


Lesenswert?

Ich habe ein LCD mit einem T6963 Controller über das XMEM Interface an
einen mega8515 angeschlossen.
Die festen Adressen habe so definiert:
#define LCD_COM _SFR_MEM8(32768)
#define LCD_DAT _SFR_MEM8(32768+512)

Gibt es eine bessere Lösung ? Das war zumindest die einzige, die ich in
der Anleitung gefunden habe.
Wenn ich jetzt warte bis das LCD bereit ist, übersetzt mir der Compiler
diese Zeile so:
    while ((LCD_COM&3)!=3);

  26                 .L2:
  27 0000 8091 0080     lds r24,-32768
  28 0004 9927          clr r25
  29 0006 8370          andi r24,lo8(3)
  30 0008 9070          andi r25,hi8(3)
  31 000a 0397          sbiw r24,3
  32 000c C9F7          brne .L2

Wieso verwendet der Compiler 16bit für den Vergleich, wo doch ein Byte
ausreichen würde ? Kann man den Compiler irgendwie dazu bringen,
das so zu übersetzen:
lds r24,-32768
cpi r24, 3
brne .L2
Das wäre nämlich doppelt so schnel...

von Daniel (Gast)


Lesenswert?

Hallo,

ein cast nach char/uint8_t ?

while ( (uint8_t)LCD_COM != 3);

Keine Ahnung, ob das nun wirklich tut - aber man kann es ja mal
probieren ;-):

MfG, Daniel.

von Benedikt (Gast)


Lesenswert?

Das war das erste was ich ausprobiert habe, aber leider ohne Erfolg.
_SFR_MEM8() sollte an sich sowiso schon char sein, es gibt nämlich auch
_SFR_MEM16()

von Volkmar (Gast)


Lesenswert?

Das Thema wurde hier schon öfter diskutiert, habe es jetzt nicht parat,
aber über die Suche müßtest Du was finden.

Ansonsten würde ich den cast noch der '3' hinzufügen, schließlich
wird diese Zahl ja als integer angesehen.

Im übrigen ist Dein Wunschergebnis nicht kompatibel zu Deiner
ursprünglichen Abfrage, Du hast die UND-Verknüpfung nicht
berücksichtigt.

Volkmar

von Benedikt (Gast)


Lesenswert?

Stimmt, mit der UND Verknüpfung ist es eine Zeile mehr, aber immer noch
deutlich weniger als das was der Compiler liefert.

Unter welchem Stichwort wurde das Thema diskutiert ?
Meine Suche war leider ergebnislos, da ich keine Ahnung habe wonach ich
bei sowas eigentlich suchen muss...

von Yagan Z. Dongobar (Gast)


Lesenswert?

Benedikt,

wenn ich Dich richtig verstanden habe, benutzt Du 'memory-mapped
I/O'
für das LCD (also wie externe RAM-Speicheradressen)
Dann müssten folgende Definitionen gehen:
#define LCD_COM ((volatile char *)(0x8000))
#define LCD_DAT ((volatile char *)(0x8200))

Anschliessend mit

while ((*LCD_COM & 3)!= 3);

oder

*LCD_DAT = 'A';

benutzen.

Ciao, Yagan

von Benedikt (Gast)


Lesenswert?

Das mit den Pointer funktioniert zwar, das Ergebnis ist aber genau
dasselbe.

In der GCC Anleitung steht, dass &, |, ~ usw. intern als int
verarbeitet werden, und man daher nachher mit (char) casten soll, aber
leider ändert sich dadurch nichts am Ergebnis...

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.