Hallo!
Ich stehe gerade mal wieder auf dem Schlauch, hatte gerade schon ein
Thema zu diesem Problem gemacht es aber wieder gelöscht, da es etwas
dran vorbei geht. Also hier jetzt erstmal mein C-Code:
(nur der interessante teil, wo es ums Lesen vm Flash und so geht)
So, warum liest er nur jedes 2. Byte? (lpm rXX, Z+ UND adiw Z, 1)
Warum zieht er nach dem 2. lesen wieder 1 von Z ab, obwohl er extra mit
Z+ liest? Warum addiert er am Ende der Schleife 2 drauf anstatt das
gleich zu tun?
Die erste dieser Fragen ist ja das wirkliche Problem, er tut etwas, was
er garnicht darf. Oder habe ich hier nen Programmierfehler?
Kurze Funktionsbeschreibung:
Anzeige des aktuellen Kurses (GPS) oder der Richtung zu einem Wegpunkt
(Winkel [pos->WP] + Kurs) auf 8 im Kreis angeordneten LEDs, volatile
uint8_t led; hat für jede LED 1 Bit. Winkelangabe ist in (Grad * 100) >>
8, die Funktion dient zum Übersetzen der Winkelangaben auf die
jeweilig(en) LEDs, es leuchten meistens 2, außer wenn der Fehler zu
einer LED ziemlich klein ist, dann nur eine. (LED 0 kommt 2x vor, da sie
von 127-13 leuchten soll)
Ob die Funktion so in der Praxis jetzt funktioniert weiß ich nichtmal,
aber eigentlich dürfte sie das ja nicht, da er die falschen Bytes liest?
cu
Matze
>Ob die Funktion so in der Praxis jetzt funktioniert weiß ich nichtmal,>aber eigentlich dürfte sie das ja nicht, da er die falschen Bytes liest?
Tut sie aber.
Steck es in den nächsten Simulator, und schau es dir an. Oder mach eine
UART-Ausgabe dahinter, oder sonstwas.
Oliver
> So, warum liest er nur jedes 2. Byte? (lpm rXX, Z+ UND adiw Z, 1)
Tut er nicht. Es ist offenbar ein Fehler des Disassemblers, denn der
Opcode "84 91" bedeutet "lpm r24, Z". Für Z+ wäre es 85 statt 84.
Oehm, ja, ihr habt ja so recht...
Oh man, ich sollte Code immer erst simulieren, bevor ich solche Beiträge
verfasse, spart mir auch Zeit :-)
Bleiben 2 Probleme:
a) Fehler im Listfile, Bugmeldung irgendwie bei den GCC Entwicklern
machen? Muss ich mich mal schlau googeln. Der Disassembler vom AVR
Studio Simulator zeigts dann auch wieder richtig an, ist ja auch zu
erwarten, die beiden Programme haben nichts miteinander zu tun
b) Warum benutzt er nicht LPM, rXX, Z+ und spart sich damit 2x adiw und
1x sdiw? Das sind 3 Words bzw. 6 Cycles...
Matze
Edit:
http://sourceforge.net/tracker/index.php?func=detail&aid=1996284&group_id=68108&atid=520074
Bug also bei WinAVR bereits gemeldet.
> Warum benutzt er nicht LPM, rXX, Z+
Weil der LPM-Befehl gar nicht vom Compiler generiert wird, sondern durch
die AVR-Libc per Inline-Assembler. Würde dort Z+ verwendet werden, würde
das den Z-Pointer verändern, ohne dass der Compiler davon weiß.
Das wäre gar nicht gut. ;-)
Heißt das, dass der Compiler dort in keinem Fall optimieren kann? Dann
wäre es eventuell schlauer, wenn ich das ganze direkt per
Inlineassembler mache, falls ich irgendwann mal diese 3 Words brauche
:-) (Es sieht schon fast danach aus, als könnte das in naher Zukunft
passieren)
Gut, dann Vielen Dank nochmal für alles.
Matze