Ich habe eine großes Problem beim Potenzieren mit dem mspgcc. Wenn ich zB. b=pow(2.0,2.0) kompiliere, gibt es eine Fehleremldung: "undefined reference to 'pow'" Die math.h ist eingebunden. Das koriose ist andere Funktion wie zB. abs() funktionieren ohne weiteres. Wer hat einen Rat? MFG
Joerg X. wrote: > #include <math.h> > und -libm > pow() ist doch afaik 'ne Funktion aus der Mathe Lib., math.h ist includiert, s.o.! Was ist -libm oder wo muss ich es einfügen? Beim Linker gibts 'nen Fehler!
Das ist eine lib ;-) die wird beim link-befehl angefügt math.h sagt nur, das es sie gibt und libm ist ihre "heimat"
Wenn ich -libm beim Linker mit ranhänge gibts einen Fehler: msp430-gcc -IC:/Programme/eclipse/eigene/Wetterstation -I"C:\Programme\mspgcc\msp430\include" -O0 -g3 -Wall -c -fmessage-length=0 -mmcu=msp430x149 -omain.o ../main.c 'Finished building: ../main.c' make: msp430-gcc-libm: Command not found
oh, sry! es heißt nur "-lm" siehe hier: http://www.mikrocontroller.net/articles/MSPGCC#Sourcecode_f.C3.BCr_msp430x1121_kompilieren.2C_wenn_math.h_includiert_wird
Hallo! Das funktioniert leider nicht! Ich schaffe es auch nicht das "-lm" als letztes bei den Linker-Optionen anzuhängen! Wie geht das mit eclipse?
Hallo Peter, hast du unter http://mspgcc.sourceforge.net/manual/ schon mal nachgeschaut? Manchmal gibnt es hier auch hilfreiche Tipps. Gruß Patti
ohh! du kannst google doch bestimmt genauso gut benutzen wie ich ! und "msp-gcc eclipse" spuckt den MSP-GCC Artikel auf dieser Seite aus, und der hat diesen Link: http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/#Id225664 weiter unten ist ein Screenshot von den Projekt-Einstellungen, da gibts auch den Punkt Linker. (Ich benutze keine MSPs und habe mich auch mit eclipse noch nicht so recht angefreundet, kann dir also nicht mehr so recht weiterhelfen außer in div. dokus nachzulessen, was du aber sicher auch kannst ;) )
Hallo Patti! Diese Seite hab ich schon durchforstet....ohne Erfolg! Hallo Joerg X.! Klar kann ich mit google umgehen, doch diese Seite hilft überhaupt nicht weiter bei dem Problem! Ich bin ja schon soweit gewesen das ich dem Linker die "-lm"-Option gegeben habe, aber ohne Erfolg!
Hi Leute, ich benutze auch den msp430 GCC und Eclipse. Ich habe mal kurz ausprobiert und bei mir gibt es auch Fehler-Meldungen wenn ich pow() benutze! Dabei ist die math.h includiert. Also mich würde das jetzt auch interessieren!!! Und in den Einstellung, bzw. im Netz was ich so schnell gefunden habe steht davon leider nichts drin!!! Gruß Patti
OK! mal anders herum gefragt: kann mal jemand in die "math.h" reinschauen, ob es überhaupt eine funktion pow() für den MSP-GCC gibt ? dann bräuchten wir nicht weiterzusuchen :-) und ich glaube nicht, dass diese Funktion soo anspruchsvoll ist, dass man sie nicht selber nach bauen könnte ;)
Natürlich gibt es die, sie ist aber vollständig im Compiler integriert.....d.h. du kannst Sie dir nicht ansehen!
Wenn man sich http://www.mikrocontroller.net/Eclipse%20und%20MSPGCC/screenshots/42.jpg ansieht, dann gibt es da unter "msp gcc linker" einen Menüpunkt "Libraries" ... was werden denn dort für Optionen angeboten?
Und ... was passiert, wenn Du dort libmath.a (oder wie sie nun im gegebenen Falle genau heißen mag) angibst?
Es kommt immer eine Fehlermeldung das er die Datei nicht finden kann....obwohl ich sie ja auswählen musste! Komisch!?
Peter Brink wrote: > Natürlich gibt es die, sie ist aber vollständig im Compiler > integriert.....d.h. du kannst Sie dir nicht ansehen! Na das wäre der erste C-Compiler, der pow() als Intrinsic implementiert hat... Aber vielleicht kann man auch überprüfen, ob in der mathlib überhaupt eine pow()-Funktion vorhanden ist: Wenn beim gcc ein Bibliotheksverwalter dabei ist - was ich stark annehme - dann lies mal die Beschreibung dazu. Üblicherweise verfügen Bibliothelsverwalter ('librarian') über eine Option zum Auflisten der in einer lib vorhandenen Module. Ansonsten würde einfach mal nach dem Quelltext der Funktion googeln - die gibts 100% irgendwo.
@Uhu Das bringt mich nicht weiter! Es gibt jedenfall keine Funktion in der man sieht wie in pow(x,y) potenziert wird!
Uhu Uhuhu wrote: > Peter Brink wrote: > Aber vielleicht kann man auch überprüfen, ob in der mathlib überhaupt > eine pow()-Funktion vorhanden ist: > > Wenn beim gcc ein Bibliotheksverwalter dabei ist - was ich stark annehme > - dann lies mal die Beschreibung dazu. Üblicherweise verfügen > Bibliothelsverwalter ('librarian') über eine Option zum Auflisten der in > einer lib vorhandenen Module. > > Ansonsten würde einfach mal nach dem Quelltext der Funktion googeln - > die gibts 100% irgendwo. Was ist ein Bibliotheksverwalter??? Ich hab schon Stunden mit googeln verbracht bevor ich das Problem hier dargestellt habe! Aber anscheinend gibt es nicht soviele die sich mit dem MSPGCC befassen!
Bin leider nich mehr zu Hause, um es auszuprobieren :-( aber beim AVR gab es auch mal so'n Post, dort hat der jenige das hier eingetragen: #linker flags LDFLAGS = -Wl,-Map=$(TRG).map,--cref -lm siehe: Beitrag "POW funktioniert nicht" Vielleicht bringt das die Sache weiter?
> Was ist ein Bibliotheksverwalter??? Das ist das Teil, mit dem man aus einer Sammlung von compilierten Modulen eine Bibliothek zusammen baut, aus der der Linker sich dann später diejenigen Module herauspflücken kann, die offene Referenzen erfüllen. Beispiel: Dein Programm ruft atoi auf. Der Comiler sieht im Headerfile, was atoi ist und erzeugt eine externe Referenz. Nun startest Du den Linker, dessen Aufgabe es ist, aus den Standard-Bibliotheken und den vom Benutzer zusätzlich angegebenen diejenigen Module herauszupflücken, die externe Referenzen - wie die auf atoi - erfüllen. Er sammelt die notwendigen Module zusammen und montiert daraus anschließend Dein lauffähiges Programm zusammen -- oder bricht mit Fehler ab, wenn irgendwelche Referenzen offen bleiben -- wie die auf pow() in Deinem Fall. Mit einem Bibliotheksverwalter kann man sich eigene Bibliotheken bauen, bestehende analysieren, oder auch wieder in eine Sammlung von Modulen zerlegen. Quellen für die gcc mathlib findest Du hier: http://www.radiks.net/~rhuebner/mathlib.html (Ich habe nach 'gcc mathlib' gegoogelt.)
Uhu Uhuhu wrote: > Quellen für die gcc mathlib findest Du hier: > http://www.radiks.net/~rhuebner/mathlib.html (Ich habe nach 'gcc > mathlib' gegoogelt.) Das bringt mich auch nicht weiter! Ich arbeite am MSP430 mit dem MSPGCC und unter dem Link gehts um "PalmPilot applications"!?
> Das bringt mich auch nicht weiter! Ich arbeite am MSP430 mit dem MSPGCC > und unter dem Link gehts um "PalmPilot applications"!? Na und? Der Link ist die Antwort auf die Frage > Es gibt jedenfall keine Funktion in der > man sieht wie in pow(x,y) potenziert wird! Zip File geholt, ausgepackt und die pow Implementierung rausgeholt. Aber im Grunde hast du recht: Beim gcc müsste eine libm dabei sein. Wenn alles richtig installiert ist, dann müsste er die auch finden.
Die Mathematik auf dem MSP430 funktioniert im Prinzip genauso, wie auf dem PalmPilot -- oder beschwerst Du Dich nur, weil Du hier keine fertige Lösung angeboten bekommst?
o habe gerade die aktuellste Version des mspgcc installiert o 'pow(..)' ist in 'math.h' enthalten. o die 'libm.a' ist ebenfalls vorhanden Du musst in dem Dialog im Bild oben vermutlich(tm) einfach nur unter 'Libraries' ein "m" hinzufügen. Der Aufrufende Prozess wird dem Linker dann "-lm" mit auf den Weg geben. Ich habe selber gerade kein eclipse installiert, deswegen kann ich das nicht wirklich nachgucken. EDIT: 'Libraries' hinzugefügt ;-)
Patrick Dohmen wrote: > o habe gerade die aktuellste Version des mspgcc installiert > o 'pow(..)' ist in 'math.h' enthalten. > o die 'libm.a' ist ebenfalls vorhanden > > Du musst in dem Dialog im Bild oben vermutlich(tm) einfach nur unter > 'Libraries' ein "m" hinzufügen. Der Aufrufende Prozess wird dem Linker > dann "-lm" mit auf den Weg geben. Jetzt hab ich schonmal das "-lm" als Linkeroption am Ende dabei! Danke! Aber leider gehts immernoch nicht!
1 | double a=0; |
2 | a=pow(2.0,2.0); |
Fehlermeldung: undefined reference to 'pow'
Komischerweise erkennt der Compiler es, wenn ich der Funktion pow() nur einen Wert gebe und meldet "zuwenig Argumente"! Also muss er ja wissen das es pow() gibt oder sehe ich das falsch?
> Komischerweise erkennt der Compiler es, wenn ich der Funktion pow() nur > einen Wert gebe und meldet "zuwenig Argumente"! Wenn Du die math.h raus nimmst, erkennt er es nicht mehr... Siehe oben: 'externe Referenz'. Wenn ich den gcc für MSP430 portieren würde, würde ich mir überlegen, ob es überhaupt einen praktischen Sinn hat, pow() auf diesen Knirps zu bringen. Welcher µC-Programmierer wird ensthaft pow(2.0, 2.0) aufrufen, um 2 hoch 2 auszurechen? Schon der Einsatz von float und double auf einem µC ist eher die Ausnahme und Betriebssysteme kommen fast immer ohne aus. Das Problem ist wohl eher, daß man, bevor man auf dem µC was programmiert, sich überlegen sollte, was man will. Wenn Du Dir ein neues Brotmesser gekauft hast, kommst Du doch sicherlich auch nicht auf die Idee, es an einem Felsbrocken auszuprobieren -- oder?
Fehlermeldungen bitte immer per Copy & Paste Posten! Die Fehlermeldung 'undefined reference to 'pow'' wird auch nicht vom Compiler, sondern vom Linker kommen. Daß die andere vom Compiler kommt, ist ja klar. Der kennt ja den Prototypen von pow aus der math.h. Poste doch bitte mal den Compiler- und den Linkeraufruf aus der Kommandozeile (irgendwo gibts das auch in eclipse zu sehen).
Uhu Uhuhu wrote: >> Komischerweise erkennt der Compiler es, wenn ich der Funktion pow() nur >> einen Wert gebe und meldet "zuwenig Argumente"! > > Wenn Du die math.h raus nimmst, erkennt er es nicht mehr... Siehe oben: > 'externe Referenz'. Wenn ich die math.h rausnehme dann kennt er pow() nicht mehr! Verständlich. > Welcher µC-Programmierer wird ensthaft pow(2.0, 2.0) aufrufen, um 2 hoch > 2 auszurechen? 2 hoch 2 ist doch nur ein Beispiel!
Patrick Dohmen wrote: > Poste doch bitte mal den Compiler- und den Linkeraufruf aus der > Kommandozeile (irgendwo gibts das auch in eclipse zu sehen). **** Incremental build of configuration Debug for project test **** make -k all 'Building file: ../test.c' 'Invoking: mspgcc GCC C Compiler' msp430-gcc -I"C:\Programme\mspgcc\msp430\include" -I"C:\Programme\mspgcc\msp430\include\msp430" -O0 -g3 -Wall -c -fmessage-length=0 -mmcu=msp430x149 -otest.o ../test.c 'Finished building: ../test.c' ' ' 'Building target: test' 'Invoking: mspgcc GCC C Linker' msp430-gcc -mmcu=msp430x149 -otest ./test.o -lm ./test.o: In function `main': /cygdrive/c/Programme/eclipse/eigene/test/Debug/../test.c:229: undefined reference to `pow' make: *** [test] Error 1 make: Target `all' not remade because of errors. Build complete for project test
Naja, das geht zwar auch, aber ich hätte da jetzt ehrlich gesagt einen direkten Aufruf des 'msp430-ld' erwartet. Na gut, kannst Du den Parameter '-lm' in '-Wl,-Map=$(TRG).map,--cref -lm' ändern? Dann bekommst Du zusätzlich ein '.map-File' in dem Du das Speicherlayout noch einmal ansehen kannst.
@ Peter Brink: > 2 hoch 2 ist doch nur ein Beispiel! Das dachte ich mir. Trotzdem macht der Einsatz dieser Funktion auf dem MSP430 i.d.R. keinen Sinn, weil er einfach zu klein nund nicht leistungsfähig genug ist, als daß man damit praktisch was anfangen könnte. Sieh Dir den Quelltext von __ieee754_pow(x,y) -- das wird garantiert ein ganz schöner Brocken. Und dann ist noch nicht eine Zeile Anwendung dabei und der Flash des MSP430 fast voll. Ganz ernsthaft: Verrenn Dich nicht in solchen realitätsfremden Unsinn. Such Dir lieber ein einfaches Problem. Mach irgendwelche Berechnungen, die ohne Fließkommaarithmetik auskommen und taste Dich langsam an das mspgcc-System heran und lies die Manuals. @ Patrick: Die Memorymap bringt in diesem Fall nichts -- das Problem ist, daß pow() in der mathlib nicht vorhanden ist.
An dem Dateinamen erkenne ich schonmal, daß '$(TRG)' nicht so gesetzt wird, wie das eigentlich gedacht war, sonst würde diese Datei nämlich nicht nur .map, sondern <name>.map heissen. Darin enthalten sind informationen, welche Objekte wo wie viel Speicher belegen und welche Objektmodule eingebunden werden. Ist die Fehlermeldung noch da?
Uhu Uhuhu wrote: > Das dachte ich mir. Trotzdem macht der Einsatz dieser Funktion auf dem > MSP430 i.d.R. keinen Sinn, weil er einfach zu klein nund nicht > leistungsfähig genug ist, als daß man damit praktisch was anfangen > könnte. > > Sieh Dir den Quelltext von __ieee754_pow(x,y) -- das wird garantiert ein > ganz schöner Brocken. Und dann ist noch nicht eine Zeile Anwendung dabei > und der Flash des MSP430 fast voll. Der MSP430F149 hat 60K Flash.......und der soll dann voll sein? Ich habe einen Sensor hier für den ich die Potenzberechnung brauche!
Uhu Uhuhu wrote: > @ Patrick: > Die Memorymap bringt in diesem Fall nichts -- das Problem ist, daß pow() > in der mathlib nicht vorhanden ist. Nö, pow() ist vorhanden:
1 | [16:04:06,81] $ msp430-ar -t libm.a |
2 | <snip> |
3 | sf_tanh.o |
4 | ef_exp.o |
5 | ef_pow.o |
6 | kf_cos.o |
7 | <snip> |
Ausserdem ist in den Parametern, die (unter anderen) ich aufgelistet habe, die Option '-lm' korrekt für den Aufruf des Linker per *-gcc.
Patrick Dohmen wrote: > An dem Dateinamen erkenne ich schonmal, daß '$(TRG)' nicht so gesetzt > wird, wie das eigentlich gedacht war, sonst würde diese Datei nämlich > nicht nur .map, sondern <name>.map heissen. > > Darin enthalten sind informationen, welche Objekte wo wie viel Speicher > belegen und welche Objektmodule eingebunden werden. > > Ist die Fehlermeldung noch da? Ja, die Fehlermeldung ist noch da!
@ Patrick: OK, wenn der Modul da ist, dann heißt die Funktion vielleicht nicht pow(), sondern irgendwie anders, z.B. double __ieee754_pow(double x, double y) wie in der PalmPilot-Version. Kannst Du Dir irgendwie die von ef_pow.o exportierten Symbole ausgeben lassen? (Im Zweifelsfall kann man versuchen, ef_pow.o in einen Editor zu laden und gucken, ob man Namen findet. Besser machts wahrscheinlich der Librarian -- s.o.) Gibt es in der math.h vielleicht auch noch Deklarationen von anderen *pow*() - Funktionen? @ Peter: Mußt Du dafür tatsächlich double hoch double rechnen, oder würde auch double hoch int reichen? Letzteres ist nämlich deutlich weniger aufwendig.
> OK, wenn der Modul da ist, dann heißt die Funktion vielleicht > nicht pow(), sondern irgendwie anders Unwahrscheinlich. pow ist eine Standardfunktion. Die muss pow heissen.
Hi Leute, gibt es denn keine Lösung? Wer arbeitet den noch mit dem msp430 GCC Compiler und Eclipse? Es muss doch schon mal jemand mehr mit der math.h gemacht haben, sonst wäre ja der ganze Compiler, naja, sehr bescheiden. Als wäre es nicht schon blöd genug ,dass man mit printf keine Floatzahlen ausgeben kann. Warum wir der Compiler denn nich mehr gepusht?? Gruß Patti
> Als wäre es nicht schon blöd genug ,dass man mit printf keine > Floatzahlen ausgeben kann. Das ist wohl weniger blöd, als pragmatisch -- wer braucht sowas? Eine printf-Routine, die auch float kann, zieht den kompletten Code der Floatingpoint-Library mit herein -- auch wenn man sie nur ein einziges mal zur Ausgabe eines char benutzt. Gewisse Dinge sind eben theroetisch denkbar, aber in der Praxis sinnlos...
@Peter Und haben die Vorschläge funktioniert? Würde mich mal interessieren. Gruß & nen schönen Feierabend.
Puh, jetzt beiss' mir doch einen 'nen Hund!
1 | [ 7:46:16,63] $ msp430-objdump -t libm.a |
2 | msp430-objdump -t libm.a |
3 | In archive libm.a: |
4 | |
5 | <snip> |
6 | ef_pow.o: file format elf32-msp430 |
7 | |
8 | SYMBOL TABLE: |
9 | 00000000 l d .stabstr 00000000 .stabstr |
10 | 00000084 g F .text 00000006 powf |
11 | 0000008a g F .text 00000e5c __ieee754_powf |
12 | 00000000 *UND* 00000000 __addsf3 |
13 | 00000000 *UND* 00000000 __subsf3 |
14 | 00000000 *UND* 00000000 __divsf3 |
15 | 00000000 *UND* 00000000 __mulsf3 |
16 | 00000000 *UND* 00000000 scalbnf |
17 | 00000000 *UND* 00000000 __gtsf2 |
18 | 00000000 *UND* 00000000 __lesf2 |
19 | 00000000 *UND* 00000000 __floatsisf |
20 | 00000000 *UND* 00000000 __ieee754_sqrtf |
21 | |
22 | <snip> |
'pow()' gibt es tatsächlich nicht in der libm.a, der Prototyp existiert aber trotzdem in 'math.h'. Das ist Kurios. Möglicherweise wird das gemacht, damit man keine eigenen Header für eine selbst implementierte Standardfunktion schreiben muss (WIMRE nannte sich sowas "stubs"). Was es aber dennoch gibt: 'powf(float, float)', evtl. reicht das ja auch aus.
@Patrick Dohmen Besten Dank nochmal. powf() funktioniert nach hinzufügen der Linkeroption siehe Bild. Gruß Peter
Interessant wäre mal der FLASH- und RAM-Verbrauch sowie die Ausführungszeit für eine Potenzierung von 2 Float-Zahlen..... Mit einer Reihenentwicklung oder LUT wäre man sicher um Welten schneller....
Na dann ist das Mysterium ja gelöst... Daß Headerfiles von Compilern, die in so vielen verschiedenen Umgebungen verwendet werden, wie gcc, auch Funktionsdeklarationen enthalten, die nicht in den zur Portierung gehörenden Bibliotheken enthalten sind, ist nichts ungewöhnliches. Die Headerfiles werden nicht extra angepaßt - das würde den Aufwand, eine neue Compilerversion zu portieren einfach zu hoch treiben. @Peter: Gehe ich recht in der Annahme, daß Dein Sensor kein float- oder double-Format liefert, sondern int-Werte? Wenn er ganzzahlige Werte liefert - was die Regel ist -, dann solltest Du die nicht einfach nach Schema F in ein Fließkommaformat wandeln, um dann damit irgendwelche aus einem Lehrbuch oder Skript abgepfriemelten, aber nicht verstandenen Formeln zu füttern. Man kann z.B. die Ergebnisse komplizierter Berechnungen (oder Teilen davon) in Tabellen packen und damit dann eine Näherungslösung entwickeln, deren Fehler unter einer vorgegebenen Schranke liegt. Das setzt aber voraus, daß man die Aufgabenstellung sehr genau kennt und daß man die zugrundeliegende Mathematik verstanden hat. Ein schönes Beispiel für diese Herangehensweise sind Funktionsgeneratoren, die einen µC benutzen, um mit Hilfe eines PWM-Ausganges und einer minimalen Peripherie-Elektronik die gewünschte Funktion zu synthetisieren. In den Applikationsschriften zum MSP430 ist mindestens ein Beispiel dafür zu finden.
Uhu Uhuhu wrote: > Wenn er ganzzahlige Werte liefert - was die Regel ist -, dann solltest > Du die nicht einfach nach Schema F in ein Fließkommaformat wandeln, um > dann damit irgendwelche aus einem Lehrbuch oder Skript abgepfriemelten, > aber nicht verstandenen Formeln zu füttern. Der Sensor den ich benutze liefert ganzzahlige Werte, aber um den tatsächlichen Messwert zu erhalten muss man e^(-5,5*Sensorwertwert) rechnen! Eine Tabelle zu erstellen die eine gute Genauigkeit erreicht wäre meines Erachtens sehr aufwendig.
Patrick Dohmen wrote: > Warum das denn? > Lass' es Dir doch vom PC ausrechnen. Ich benutze keinen PC für die Datenverarbeitung!
Das hat ja auch keiner Vorgeschlagen, Du sollst Dir eine LUT (LookUpTable) mit angenäherten Werten auf dem PC erstellen, diese in Form eines Arrays in Dein Programm einbauen und anhand der Sensordaten den passenden Arrayindex bestimmen.
Patrick Dohmen wrote: > Das hat ja auch keiner Vorgeschlagen, Du sollst Dir eine LUT > (LookUpTable) mit angenäherten Werten auf dem PC erstellen, diese in > Form eines Arrays in Dein Programm einbauen und anhand der Sensordaten > den passenden Arrayindex bestimmen. Achso, ich dachte Du meintest im Bezug auf die Messwertberechnung! Ich habe 4 Variablen in meiner Berechnung und ich denke die LUT würde zu groß werden!
Hmpf! Ja, ich bezog mich auf die Messwertberechnung. Du sagst doch selber, daß: Messwert = e^(-5,5*Sensorwertwert) Da Dein Sensor einen begrenzten Wertebereich haben wird, kann 'Messwert' maximal 'e^(-5,5*Sensorwertwert_max)' und minimal 'e^(-5,5*Sensorwertwert_min)' werden. Jetzt entscheidest Du Dich noch für eine Auflösung innerhalb der Tabelle und schreibst diese in ein Array.
Da mußt Du dann eben etwas Hirnschmalz investieren, um einen Weg zu finden, wie man die Tabelle auf eine erträgliche Größe bekommt. Tipp: Du mußt nicht für jeden Wert, den der Sensor melden kann, einen Tabelleneintrag machen, sondern nur für Stützpunkte, zwischen denen Du dann linear interpolieren kannst, um einen im betreffenden Intervall liegenden Meßwert umzurechen. Aus dem zulässigen Fehler der Annäherung kann man die benötigten Stützpunkte berechen. Wenn Du das geschickt anstellst, brauchst Du noch nichtmal float-Arithmetik.
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.