c-Routinen aus .S-Dateien aufrufen

OP #410811
Lesenswert?

Hallo,

gibt es eine Möglichkeit aus .S-Dateien (Assembler) C-Routinen
aufzurufen?

Problem ist, daß die Funktion '_delay_ms' in einem .h-File
implementiert wurde (/util/delay.h).
Ein '.extern _delay_ms' läßt zwar den Compiler durchlaufen, aber der
Linker meckert mit 'undefined reference to `_delay_ms`'. Laut
Symboltabelle muß ich dem Linker Recht geben. Nirgends ein
'_delay_ms' zu finden. Allerdings kann ich auch das .h-File nicht in
das .S einbinden.

Gibt es da eine Lösung, oder muß ich ein eigenes 'delay' schreiben?

Grüße, Freakazoid
Gast #410815
Lesenswert?

Hmm, mir fällt da grad noch was ein. _delay_ms() ist eine
Inline-Funktion, und muß das auch sein. Deshalb wird sie nicht extern
gefunden. Da sie aber eh in inline-Assembler implementiert ist,
könntest du eigentlich ihren Inhalt mehr oder weniger in deine
Assemlber-Datei kopieren.
OP #410816
Lesenswert?

Prinzipiell ja (außer das _delay_ms im Header implementiert wurde).

Leider kann ich Dir trotzdem nicht ganz folgen.
Vielleicht stell ich mich auch doof an, aber auf der von Dir verlinkten
Seite finde ich nur das Überschreiben von Symbolen (ISR-Vektoren, main,
...).

Sorry, wenn ich gerade etwas doof anstelle ;-)
Gast #410818
Lesenswert?

Hmm, ich könnte schwören, das gesehen zu haben, aber in der Seite finde
ich auch nichts. Ich hatte wohl eine andere Seite im Kopf, aber die
finde ich im Moment nicht. Sorry, wenn ich damit Verwirrung gestiftet
habe.
Gast #410820
Lesenswert?

Das Problem ist, daß in __delay_ms() einige Fließkommaberechnungen
stehen. Auch der Parameter ist ein Fließkommawert. Diese Berechnungen
müssen zur Laufzeit ausgeführt werden, es sei denn, die Funktion wird
inline expandiert. Dann kan das "constant folding" des Compilers die
Berechnungen auf die Compilezeit verlagern. Also wird diese Funktion
für dich in Assembler nicht nutzbar sein.
OP #410821
Lesenswert?

Sowas hab ich auch gerade gefunden:

When using _delay_us() and _delay_ms(), the expressions passed as
arguments to these functions shall be compile-time constants, otherwise
the floating-point calculations to setup the loops will be done at
run-time, thereby drastically increasing both the resulting code size,
as well as the time required to setup the loops.

-> Besser wohl selbst machen ...
Moderator Persönliche Seite #410822
Lesenswert?

> Besser wohl selbst machen ...

Ja, der Kern der Verzögerungsschleifen ist ja nicht sehr viel.
Ich bin mir gerade nicht im Klaren, ob der Assembler auch
Gleitkommaberechnungen machen kann oder nicht, aber eventuell
genügt dir ja auch (long) integer.  Die Gleitkommaversion im
Compiler ist einfach nur ,,Dummuser-sicher'': man muss sich
nicht um irgendeinen Überlauf kümmern, den die Multiplikation
von x MHz CPU-Frequenz mit irgendeiner Zahl hervorrufen könnte.

Ansonsten kannst du dir ja das Inlining wie Makros vorstellen
(ist nur ein syntaktischer Unterschied), und damit hast du
eigentlich auch schon das Hilfsmittel, mit dem du diese
Funktionalität im Assembler abbilden kannst.  Du hast dabei
sowohl C-Präprozessor- als auch Assemblermakros zu deiner
Verfügung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren