Moin :-) Nachdem ich mich in letzter Zeit verstärkt um meine DMX-'Tuts' gekümmert habe und zZ. an einer etwas besseren LCD-Ausgabe werkel, hat sich folgendes Problem herauskristallisiert: Sehr viele scheinen sich überhaupt nicht um den Code selbst zu scheren, lesen die Erläuterungen nicht sondern klatschen irgendwelche Module aus dem Netz (-> Codesammlung ist da sehr beliebt...) wild zusammen. Am Ende Ärgern sie sich, dass es nicht so werkelt wie gewünscht. Wenig später findet man Posts à la: 'Alles Scheiße - funzt net! Wer hat noch Probleme?' Darum würde ich nun gerne mit Libraries anfangen. Etwas weniger schnell - aber narrensicher. Aus Performancegründen müsste ein großer Teil in Assembler geschrieben werden. Nun zu meinen Fragen: Kann man eine ASM-Lib so schreiben, dass man sie sowohl in C- als auch asm-Projekte einbinden kann? (WinAVR-asm ist scheinbar nicht ganz mit dem AVR-Studio-asm kompatibel...) Wie funktionieren solche eleganten Aufrufe mit Parametern? 'ergebnis = mul(var1,var2)' Werden die vars vor dem Aufruf auf den Stack gepushed und dann von meiner Lib wieder runter gepopt? Es wäre wirklich nett, wenn Ihr mir helfen könntet, einen nettes Werkzeugkästchen für den Transceiver zu basteln. Viele Grüße, Hendrik ( www.hoelscher-hi.de/hendrik/light/asm.htm )
> Aus Performancegründen müsste ein großer Teil in Assembler > geschrieben werden. Beweise, bitte. > Kann man eine ASM-Lib so schreiben, dass man sie sowohl in C- als > auch asm-Projekte einbinden kann? Ja. > Wie funktionieren solche eleganten Aufrufe mit Parametern? Hmm, hast du denn wenigstens mal die avr-libc-FAQ gelesen? Dort steht's drin... Wenn du WinAVR hast, liegt das alles auf deiner Platte rum.
Zitat HomerS.: 'NEIN!' Habe online bei WinAVR gesucht - auf meine Platte bin ich grade nicht gekommen... Zur Performance: Du hattest mir damals bei dem DMX-Empfang in C geholfen. nach Deinen Optimierungen lagen wir immer noch bei 7-8µs ggü. 3-4µs in asm. Du selbst meintest, in diesem Fall einen ASM-include zu bevorzugen. >> Kann man eine ASM-Lib so schreiben, dass man sie sowohl in C- als >> auch asm-Projekte einbinden kann? > Ja. Bei einer derart informativen Antwort müsssen sich wohl wahre Schätze auf meiner Platte befinden g Viele Grüße, Hendrik
> Du hattest mir damals bei dem DMX-Empfang in C geholfen. nach Deinen > Optimierungen lagen wir immer noch bei 7-8µs ggü. 3-4µs in asm. Du > selbst meintest, in diesem Fall einen ASM-include zu bevorzugen. Nu ja, war mir nicht mehr in Erinnerung. Klar, wenn du so'n knappes Timing brauchst, wird das wohl nicht anders helfen. >> Ja. > Bei einer derart informativen Antwort müsssen sich wohl wahre > Schätze auf meiner Platte befinden *g* Das ist ganz einfach: du musst es eh' C-kompatibel schreiben (d.h. dich an die register conventions halten). asm-kompatibel ist es ja in jedem Falle, da der Aufrufer beim Assemblercode jederzeit in der Lage ist, sich an beliebige Übergabekonventionen zu halten. Alles, was du dafür tun kannst ist, das ordentlich zu dokumentieren.
habe grade mal wegen der C-Integration das neue AVR-Studio gezogen. Das Teil verwendet ja einen völlig neuen assembler (AVRASM2)?!? Na gut - jetzt habe ich wirklich was zu tun... Hendrik
So - habe mir jetzt die call conventions rausgepickt: zu übergebene Argumente: - nur gradzahlige register - r25 -> r8 (wobei r25 nur mäßig gradzahlig ist...) return val: - 8bit: r24 -16bit: r25:r24 Ich habe zu definieren mit #define test r1 (frisst auch das AVR-Studio so) Muss SREG puffern sowie sämtliche Register, mit denen ich arbeite - wenn ich sie mir nicht fest gekrallt habe. Ist das soweit korrekt? Grüße, Hendrik (der noch von dem libc-Mörderpdf alles doppelt sieht g)
> zu übergebene Argumente: > - nur gradzahlige register > - r25 -> r8 (wobei r25 nur mäßig gradzahlig ist...) r25 ist ja auch der high-Teil des ersten Arguments falls das 16 bits (oder mehr) ist. Falls das nur 8 bits sind, bleibt r25 einfach unberührt. > Ich habe zu definieren mit #define test r1 > (frisst auch das AVR-Studio so) Ja, das dürfte der portabelste Weg sein. Warum willst du unbedingt den Atmel-Assembler benutzen können? Ich denke, da kommst du nicht um Portabilitäts-#ifdefs herum, da beide Assembler ziemlich unterschiedliche pseudo-ops benutzen. Im GNU-Assembler brauchst du mindestens noch: .global foo foo: ... am Anfang deiner Funktion "foo". > Muss SREG puffern sowie sämtliche Register, mit denen ich arbeite - > wenn ich sie mir nicht fest gekrallt habe. Nein. Um SREG musst du dich nicht weiter kümmern. Alle "call-used registers" musst du nicht retten, also r18...r27 und r30/r31 kannst du frei benutzen, außerdem r0 (auch als tmp_reg bezeichnet). Die anderen Register musst du retten. r1 darfst du als Quelle für die Konstante 0 benutzen (und solltest es sinnvollerweise auch auf diesem Wert belassen). Alle Register + SREG muss man nur im Interruptkontext retten. > Hendrik (der noch von dem libc-Mörderpdf alles doppelt sieht g) Gibt's doch auch als HTML.
Kommt denn der avr-ld überhaupt mit den vom AVRASM erzeugten Object Files zurecht?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.