www.mikrocontroller.net

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


Autor: André Kronfeldt (freakazoid)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: André Kronfeldt (freakazoid)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: André Kronfeldt (freakazoid)
Datum:

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

Autor: André Kronfeldt (freakazoid)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: André Kronfeldt (freakazoid)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: André Kronfeldt (freakazoid)
Datum:

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

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

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

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.