Forum: Mikrocontroller und Digitale Elektronik MSP430 mspgcc Wurzel ziehen und Winkelfunktionen


von reflection (Gast)


Lesenswert?

Salu zusammen

Ich arbeite mit einem MSP430F149 und dem mspgcc Compiler für Eclipse. 
Nun muss ich in einer Rechnung die Quadratwurzel ziehen. Geht das mit 
dem Befehl sqrt? Habe gehört dass es da zu Problemen kommen kann, oder 
mache ich mir da unnötige Gedanken? Weiter muss ich noch 
Winkelfunktionen ala sin, cos, asin, acos verwenden. Muss ich da was 
einbinden oder stehen mir die Funktionen einfach zur Verfügung? Hoffe 
nicht das ich das noch über Reihen realisieren muss. Wäre über eine 
Antwort dankbar

Merci im Voraus

Greets reflection

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

#include <math.h>

Diese Headerdatei mal im Editor aufmachen und ansehen.

Eine Floating-Point-Emulation belegt viel Flash-ROM, Du wirst nicht mit 
jedem MSP430 nutzen können.

von Gast (Gast)


Lesenswert?

Schau Dir mal bei IAR.com die Application Note bzgl. Wurzel an. Diese 
wirst Du sicher auch mit mspgcc nutzen können.

=> Es ist eine schöne kurze Wurzelfkt. mit hinreichender Genauigkeit.

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Apl.-Note

von reflection (Gast)


Lesenswert?

Vielen Dank für die Antworten

Ich werde es einmal versuchen

Gruss reflection

von reflection (Gast)


Lesenswert?

Ich habe nun folgendes versucht:

float acc_result = sqrt _PARAMS((acc_x * acc_x) + (acc_y * acc_y) + 
(acc_z * acc_z));

wollte es einmal mit der math.h lösen. Habe diese auch eingebunden, aber 
er bringt immer die Fehlermeldung: Undefined reference to 'sqrt'
Was mich ich denn nu wieder falsch. :o)

Gruss reflection

PS: Auch die sin Funktion kann ich nicht verwenden, erscheint die selbe 
Fehlermeldung beim Compilieren

von Christian R. (supachris)


Lesenswert?

Dann ist die Funktion nicht implementiert, sonder nur der Funktionsrumpf 
in der Header-Datei. Die muss dann vom User selbst in geeigneter Weise 
bereitgestellt werden. ist genau wie bei printf(), da muss man putc() 
auch selber machen, der Compiler kann ja nicht wissen, wohin man die 
printf() Ausgabe haben will.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein, das ist eher unüblich. Linkst Du auch mit libm.a?

von reflection (Gast)


Lesenswert?

rufus wrote: Nein, das ist eher unüblich. Linkst Du auch mit libm.a?

Sorry, traue mich fast nicht das zu sagen, aber ich weiss nicht was Du 
meinst. Bin noch rel. neu mit dem ganzen Thema. Wo sehe ich mit was ich 
linke, in den Project Options?

Greets

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Damit Floatingpoint-Arithmetik genutzt werden kann, muss die dafür 
zuständige Library zum Programm gelinkt werden (ganz schicke sagen "das 
Programm muss gegen die Library gelinkt werden").
In dieser Library ist der Code enthalten, der erforderlich ist, um 
Floating-Point-Arithmetik auszuführen, also auch der Code für die 
Grundrechenarten etc.
Und die Implementierung der Funktion sqrt gehört auch in diese Library.

Das Linken mit einer Library geschieht beim gcc mit der 
Kommandozeilenoption

  -l<libraryname>

Die Library heißt libm.a, allerdings ist sowohl das Präfix "lib" als 
auch die Dateinamenserweiterung ".a" wegzulassen, so daß die 
Kommandozeilenoption so aussieht:

  -lm

Viel Erfolg.

von reflection (Gast)


Lesenswert?

Was meinst Du mit Kommandozeilenoption?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Frage meinst Du jetzt nicht ernst, oder?

Du verwendest einen Compiler. Das ist ein Programm, das aufgerufen wird, 
um irgendwelche Dinge zu tun. Und welche das sind, wird ihm mit 
Kommandozeilenargumenten/optionen mitgeteilt.

Und die stehen beispielsweise im Makefile.

von reflection (Gast)


Lesenswert?

Tja, wie gesagt, mir hat noch nie jemand etwas über uP erzählt. Habe ich 
mir selber irgendwie zusammengeschustert, anders kann man es nicht 
sagen. Ich habe was versucht aber jetzt geht gar nichts mehr :o( Er 
bringt nur noch einen Error, nämlich das er nichts macht... So long, 
wird wohl wieder ein riesen Akt werden. Also langsam frage ich mich ja 
schon. Kann doch nicht so schwer sein ein Tool zu entwickeln wo ich 
einfach eine Wurzel ziehen kann ohne tausend Sachen zu wissen. Langsam 
aber sicher denke ich, dass ich von uP's die Finger lasse und mich 
wieder der Analog Technik widme, da hab ich wenigstens einigermassen nen 
Plan.

Danke aber für Hilfe, auch wenn ichs nicht hin kriege

Greets

von reflection (Gast)


Angehängte Dateien:

Lesenswert?

So, der Fehler ist raus. Ich habe einfach unter den Project Preferences 
beim ersten Fenster dort wo msp430-gcc steht noch ein -m angehängt. Der 
Fehler mit dem sqrt ist behoben, aber dafür habe ich 5 neue Errors.

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Jo, Irrtum von mir, man muss dem Linker "nur" passend sagen, er soll die 
libm.a einbinden. Das ist über das Eclipse-Plugin ganz schön russisch 
gelöst, aber naja, Open-Source-Gefrickel eben.

Siehe Bild, so klappts bei mir dann mit sqrtf(..) kann ich Wurzel aus 
float ziehen. Frisst aber auch mal locker 3,5kByte ROM für eine einzige 
Wurzel :-/

von Christian R. (supachris)


Lesenswert?

Wie kommst du darauf, eine ominöse Option -m an den Compiler-Aufruf zu 
kleben? Wir haben doch die ganze Zeit vom Linker geschrieben. Dem musst 
du das -lm mitgeben. Siehe oben.
Mit -m beim Kompiler kommen bei mir natürlich auch massig unsinnge 
Fehler....

von reflection (Gast)


Lesenswert?

Salu zusammen

Sorry, aber wir haben wohl aneinander vorbeigeredet. Ich habs natürlich 
im Linker eingetragen. Das Problem war bei mir, dass er mir einen Fehler 
bringt mit sqrt. Wechsle ich den Befehl zu sqrtf funktioniert es. Ist 
sqrt nur für Integer zulässig?

Danke für die Hilfe, hats also doch noch geklappt :o) Tut mir echt leid 
für Euch, bin sonst schon der der sich einliest ect. aber im Moment 
fehlt mir die Zeit um lange zu probieren, auch wenn es interessant wäre.

Greets und hoffentlich bis "nicht" so bald, sonst gibts wieder Arbeit 
:o)

reflection

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte sqrt eine Funktion sein, die die Quadratwurzel eines 
double-Wertes berechnet? Und sqrtf die float-Variante?

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
Noch kein Account? Hier anmelden.