www.mikrocontroller.net

Forum: Compiler & IDEs Library in Assembler


Autor: HendrikHoelscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 )

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: HendrikHoelscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: HendrikHoelscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: HendrikHoelscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: ObjectFile Format Hinterfrager (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt denn der avr-ld überhaupt mit den vom AVRASM erzeugten Object
Files zurecht?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.