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
??? 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
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.
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.
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 ;-)
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 ;-(
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.
Puh. Ich dachte schon ich sollte mir den Kaffee abgewöhnen. Trotzdem danke erstmal.
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.
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 ...
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.