mspgcc pow()

#526879
Lesenswert?

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
#526949
Lesenswert?

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
Gast #527467
Lesenswert?

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 ;) )
#527482
Lesenswert?

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!
Gast #527483
Lesenswert?

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
Gast #527485
Lesenswert?

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 ;)
#527523
Lesenswert?

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.
#527540
Lesenswert?

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!
#527547
Lesenswert?

> 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.)
#527605
Lesenswert?

> 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.
Persönliche Seite #527607
Lesenswert?

 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 ;-)
#527622
Lesenswert?

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'
#527644
Lesenswert?

> 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?
Persönliche Seite #527645
Lesenswert?

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).
#527654
Lesenswert?

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!
#527660
Lesenswert?

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
#527679
Lesenswert?

@ 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.
#527683
Lesenswert?

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!
Persönliche Seite #527685
Lesenswert?

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.
#527686
Lesenswert?

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!
#527708
Lesenswert?

@ 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.
Gast #527810
Lesenswert?

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
#527835
Lesenswert?

> 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...
Persönliche Seite #528038
Lesenswert?

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.
#528341
Lesenswert?

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.
#528378
Lesenswert?

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.
#528426
Lesenswert?

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!
Persönliche Seite #528436
Lesenswert?

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.
#528440
Lesenswert?

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.

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