mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mspgcc pow()


Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <math.h>
und -libm
pow() ist doch afaik 'ne Funktion aus der Mathe Lib.,

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: KoF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine lib ;-) die wird beim link-befehl angefügt
math.h sagt nur, das es sie gibt und libm ist ihre "heimat"

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, sry!
es heißt nur "-lm"
siehe hier: 
http://www.mikrocontroller.net/articles/MSPGCC#Sou...

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,
hast du unter http://mspgcc.sourceforge.net/manual/ schon mal 
nachgeschaut?
Manchmal gibnt es hier auch hilfreiche Tipps.

Gruß Patti

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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%20MSP... 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 ;) )

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patti (Gast)
Datum:

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

Autor: Joerg X. (Gast)
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich gibt es die, sie ist aber vollständig im Compiler 
integriert.....d.h. du kannst Sie dir nicht ansehen!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man sich 
http://www.mikrocontroller.net/Eclipse%20und%20MSP... 
ansieht, dann gibt es da unter "msp gcc linker" einen Menüpunkt 
"Libraries" ... was werden denn dort für Optionen angeboten?

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optionen gibts da keine, Du kannst nur Dateien einbinden.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ... was passiert, wenn Du dort libmath.a (oder wie sie nun im 
gegebenen Falle genau heißen mag) angibst?

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es kommt immer eine Fehlermeldung das er die Datei nicht finden 
kann....obwohl ich sie ja auswählen musste! Komisch!?

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uhu
Das bringt mich nicht weiter! Es gibt jedenfall keine Funktion in der 
man sieht wie in pow(x,y) potenziert wird!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal schätzen:

  pow(x,y):   exp(y*ln(x))

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patti (Gast)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht 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!
double a=0;
a=pow(2.0,2.0);

Fehlermeldung: undefined reference to 'pow'

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:
Angehängte Dateien:
  • _map (28,7 KB, 175 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Was kann ich aus diesem Speicherlayout ersehen?

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
[16:04:06,81] $ msp430-ar -t libm.a
<snip>
sf_tanh.o
ef_exp.o
ef_pow.o
kf_cos.o
<snip>

Ausserdem ist in den Parametern, die (unter anderen) ich aufgelistet 
habe, die Option '-lm' korrekt für den Aufruf des Linker per *-gcc.

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Patti (Gast)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Patti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Und haben die Vorschläge funktioniert? Würde mich mal interessieren.

Gruß & nen schönen Feierabend.

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider nicht!

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Puh, jetzt beiss' mir doch einen 'nen Hund!
[ 7:46:16,63] $ msp430-objdump -t libm.a
msp430-objdump -t libm.a
In archive libm.a:

<snip>
ef_pow.o:     file format elf32-msp430

SYMBOL TABLE:
00000000 l    d  .stabstr  00000000 .stabstr
00000084 g     F .text  00000006 powf
0000008a g     F .text  00000e5c __ieee754_powf
00000000         *UND*  00000000 __addsf3
00000000         *UND*  00000000 __subsf3
00000000         *UND*  00000000 __divsf3
00000000         *UND*  00000000 __mulsf3
00000000         *UND*  00000000 scalbnf
00000000         *UND*  00000000 __gtsf2
00000000         *UND*  00000000 __lesf2
00000000         *UND*  00000000 __floatsisf
00000000         *UND*  00000000 __ieee754_sqrtf

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

Autor: Msp 430_crew (msp430_crew)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Patrick Dohmen
Besten Dank nochmal. powf() funktioniert nach hinzufügen der 
Linkeroption siehe Bild.

Gruß Peter

Autor: Christian R. (supachris)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum das denn?
Lass' es Dir doch vom PC ausrechnen.

Autor: Msp 430_crew (msp430_crew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Dohmen wrote:
> Warum das denn?
> Lass' es Dir doch vom PC ausrechnen.

Ich benutze keinen PC für die Datenverarbeitung!

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Msp 430_crew (msp430_crew)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

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.