Forum: Compiler & IDEs c-Routinen aus .S-Dateien aufrufen


von André K. (freakazoid)


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

von Rolf Magnus (Gast)


Lesenswert?


von André K. (freakazoid)


Lesenswert?

???

Verpaß ich da gerade was? Da geht es doch um .S-Files und das Linken
gegen der Rest, oder? Wird da irgendwo eine C-Funktion aus einem
anderen .o aufgerufen? Abgesehen davon, daß _delay in keinem .o
vorkommt ;-/

Grüße, Freakazoid

von Rolf Magnus (Gast)


Lesenswert?

Es geht dort darum, wie man eine Assembler-Datei schreibt, in der
Funktionen der avr-libc aufgerufen werden. Ich habe deine Frage so
verstanden, daß du genau das willst.

von Rolf Magnus (Gast)


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.

von André K. (freakazoid)


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 ;-)

von André K. (freakazoid)


Lesenswert?

Problem wird wohl das 'static inline void _delay_ms(double __ms)
__attribute__((always_inline));' sein.

Denke der Compiler wird das direkt so auflösen ('inlinen'), daß das
eigentlich Symbol '_delay_ms' nicht mehr da ist (wozu auch). Pech für
den Linker ;-(

von Rolf Magnus (Gast)


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.

von André K. (freakazoid)


Lesenswert?

Puh. Ich dachte schon ich sollte mir den Kaffee abgewöhnen. Trotzdem
danke erstmal.

von Rolf Magnus (Gast)


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.

von André K. (freakazoid)


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 ...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.