PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compiler streikt bei char!?



TillHoffmann
09.09.2004, 17:11
Ich wollte diese Wait Methode optimieren indem ich int x; durch unsigned char x; ersetzt habe.


void Wait(unsigned char time)
{
int x;
for (x = 0; x < time; x++);
}

Wait(100);




void Wait(unsigned char time)
{
unsigned char x;
for (x = 0; x < time; x++);
}

Wait(100);

Der Parameter von Wait überschreitet 100 nicht.

Nach der Wait Methode wird ein Wert an ein LCD Display ausgegeben.
Mit int funktioniert das Display mit unsigned char nicht!!!

Gottfreak
09.09.2004, 18:13
Bist du sicher, dass die Warteschleife danach nicht mehr geht? Vielleicht ist sie durch deine Optimierung nur schneller geworden.
Wenn du fertige Warteschleifen suchst, guck' mal in die Delay.h (bei AVR-GCC). Da sind welche drin, bei denen du dir genau ausrechnen kannst, wie lange sie warten(bei deinen C-Schleifen kannst du nur nachmessen oder dir den compilierten Code angucken, was wohl aufwändiger ist, als die gleich in ASM zu schreiben.).

TillHoffmann
09.09.2004, 18:36
Die Schleife wird schon schneller, aber wahrscheinlich nicht doppelt so schnell, oder???
Ich hab jetzt auch Wait(200); getestet.

Gottfreak
09.09.2004, 18:57
Ich kann mir schon vorstellen, dass die Schleife(zumindest) doppelt so schnell wird(schließlich ist der AVR ein 8bit-Controller, der Chars in einem Takt vergleichen kann.).
Kannst du die Dauer des Schleifendurchlaufs(oder auch von 100 oder 1000 Durchläufen) messen(und wenn nicht, wie bist du überhaupt auf die vorherige Schleife gekommen? Ausprobieren? )?

TillHoffmann
09.09.2004, 19:39
Ich kann mir schon vorstellen, dass die Schleife(zumindest) doppelt so schnell wird(schließlich ist der AVR ein 8bit-Controller, der Chars in einem Takt vergleichen kann.).
Kannst du die Dauer des Schleifendurchlaufs(oder auch von 100 oder 1000 Durchläufen) messen(und wenn nicht, wie bist du überhaupt auf die vorherige Schleife gekommen? Ausprobieren? )?

Ich hab eine Schleife gemacht und bei 95 hat es nicht mehr funktioniert. Als Toleranz 5 und fertisch :cheesy:

Kjion
09.09.2004, 22:01
Probiers mal mit :

volatile unsigned char x;

Ansonsten könnte dir der Compiler bei entsprecher Einstellung die Schleife einfach "wegoptimieren".
( Schau dir doch einfach mal das Assemblerlisting an, da kann man das sehr schön sehen )

MfG Kjion

TillHoffmann
09.09.2004, 23:18
Ich hab im makefile Optimierung auf 0 eingestellt.
Würde er die, wenn ich Optimierung verwenden würde, nicht auch wegoptmieren, wenn es eine intiger Variable wäre.