Hallo,
ich habe mich mal daran gemacht, diese Sprungtabelle
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Sprungtabelle)
nachzuprogrammieren, bzw. den Quelltext zu kopieren und im Simulator von
AVR Studio (4.18) laufen zu lassen. Aber es kompiliert erst garnicht:
Für die Zeilen "ldi ZL,low(Sprungtabelle)" und "ldi
ZH,high(Sprungtabelle)" meckert der Compiler "Error: garbage at end of
line".
Und wenn ich "low()"/"high()" durch "lo8()"/"hi8()" ersetze, wird nicht
korrekt gesprungen. Genauso funktionieren "pm_lo8()"/"pm_hi8()" nicht.
Mittlerweile bin ich etwas ratlos. Habt Ihr eine Idee, was hier
schiefläuft?
Grüße,
Luke
Luke schrieb:> AVR Studio (4.18) laufen zu lassen. Aber es kompiliert erst garnicht:
kompiliert -> assembliert.
Ein Assembler ist kein Compiler
> Für die Zeilen "ldi ZL,low(Sprungtabelle)" und "ldi> ZH,high(Sprungtabelle)" meckert der Compiler "Error: garbage at end of> line".
Das deutet aber eher darauf hin, dass sich irgend ein nicht sichtbares
Zeichen im Editor eingeschlichen hat. Ich schätze mal, dass da beim
Copy&Paste irgendwas mitkopiert wurde, was nicht dort sein soll.
Wenn es ein Problem mit den High/Low Makros gäbe, gibt es keinen
wirklichen Grund, warum der Assembler das nicht auch in der
Fehlermeldung anführen sollte. Die Fehlermeldung würde dann eher in die
Richtung "Unknown Operand 'HIgh'" oder so ähnlich lauten. 'Garbage at
the end of Line', also 'unbekannter 'Dreck' am Zeilenende ist meistens
ein Hinweis auf irgendein Zeichen, welches man zwar nicht sieht, welches
aber trotzdem dort ist und eigentlich nicht dort sein sollte.
Ein Teil der Lösung bestand darin, das ZL und ZH zu ersetzen. Aber "low"
und "high" funktionieren immer noch nicht!
Ich bin jetzt echt ratlos!
Viele Grüße,
Luke
Hallo,
spess53 schrieb:> Warum nimmst du nicht den richtigen Assembler vom AVR Studio?
weil ich schon den C-Code "drumherum" habe und den nicht nochmal neu
schreiben möchte in Assembler, aber das switch-Statement in C circa 30
Zyklen benötigt und ich die Zyklen für das Programm brauche!
Viele Grüße!
Luke schrieb:> Hallo,>> spess53 schrieb:>> Warum nimmst du nicht den richtigen Assembler vom AVR Studio?>> weil ich schon den C-Code "drumherum" habe und den nicht nochmal neu> schreiben möchte in Assembler, aber das switch-Statement in C circa 30> Zyklen benötigt und ich die Zyklen für das Programm brauche!
Zeig mal den C-Code.
Da gibt es sicher was, wie man das auch in reinem C schneller kriegt.
Die Compilerbauer sind nicht so dumm, wie Anfänger gerne denken.
Ein Switch kann durchaus als Sprungtabelle implementiert werden, sobald
es effektiver ist.
Hier wird allerdings ein Array die bessere Lösung sein (eine Zahl in
eine andere umwandeln).
Karl Heinz schrieb im Beitrag #3560098:
> Zeig mal den C-Code.
Ja.
Der gezeigte Assemblercode ist recht sinnfrei.
LOW und HIGH sind Zeugs vom Atmel-Assembler.
Du verwendest den GNU-Assembler (avr-as)mit avr-gcc als
Compiler-/Assembler-/Linker-Treiber.
Schau dir einfach an, wie avr-gcc das macht:
1
subi r30,lo8(-(gs(.LSprungtabelle)))
2
sbci r31,hi8(-(gs(.LSprungtabelle)))
3
ijmp
4
.section .progmem.gcc_sw_table,"ax",@progbits
5
.p2align 1
6
.LSprungtabelle:
7
rjmp .L1
8
rjmp .L2
9
...
10
.text
11
.L1:
12
...
für die kleinen AVRs (mit RJMP) und für die großen (mit JMP):