mikrocontroller.net

Forum: Compiler & IDEs Fehler bei exp()


Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte den Drucksensor MXP4115A verwenden und habe eine lib für 
Atmega8 gefunden. Ich habe diese in meinen bestehenden sour code 
einbegaut und der absolut druck funktioniert auch jedoch bei der relativ 
druckmessung wird die funktion exp() von math.h verwendet
und damit habe ich ein compilierungsproblem.
jedes mal bekomme ich die gehlermeldung 1 error in der datei xxx.elf
wenn ich diese funktion ausklammere bekomme ich die fehlermeldung nicht 
und die software (ohne relativ druck) funktioniert auch.
Die funktion ist:

void get_pres(double u_val, double tempm, double *abs_pres, double 
*rel_pres)
{
  *abs_pres = ((u_val/5)+0.095)/0.0009;
  tempm += 273.15;
  *rel_pres = *abs_pres/exp(-(0.0342*HOEHE)/(tempm+(0.00325*HOEHE))); // 
0.0342 = g / R
}

wie gesagt der fehler ist weg wenn ich die letzte zeile auskommentiere.

kann mir jemand sagen was hier falsch ist?
das problem für mich ist das der Compiler nur einen error in der datei 
xxxxxx.elf meldet, und das sagt mir nichts
mfg erich

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie GENAU lautet die Fehlermeldung?
Mein avr-gcc (GCC) 4.2.2 (WinAVR 20071221) kompiliert das ohne zu 
meckern...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erich Floh wrote:

> 0.0342 = g / R

> kann mir jemand sagen was hier falsch ist?
> das problem für mich ist das der Compiler nur einen error in der datei
> xxxxxx.elf meldet, und das sagt mir nichts

1) Da ein Semikolon zwischen R und }
2) Der Compiler kann nicht eine elf anmeckern, das tut der Linker. Du 
hast also irgendwelche Variablen nicht richtig deklariert (g und/oder 
R), oder es fehlen die Definitionen von g und/oder R. Die Variablen nur 
zu deklarieren bringt nix, irgendwo müssen sie auch angelegt werden.
3) Links vom = muss ein L-Value stehen, also ein Wert, dem etwas 
zugewiesen werden kann. Für 0.0342 ist das nicht der Fall, es sollt ein 
Syntaxfehler geben.

Ergo: Wahrscheinlich steigt der Compiler aus und ein Modul, das zum 
Erzeugen der elf gebraucht wird, wird nicht erzeugt und fehlt. Behebe 
Fehler/Warnungen am besten von vorne nach hinten, und nicht umgekehrt: 
Die Fehler/Warnungen die zuerst gemeldet werden, also zuerst beheben.

Johann

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier alle meldungen die er auswirft:

Build started 11.4.2009 at 20:05:37
avr-gcc -I"C:\Dokumente und Einstellungen\Erich\Eigene 
Dateien\Arthurneu\newStack1_2_1\." -I"C:\Dokumente und 
Einstellungen\Erich\Eigene Dateien\Arthurneu\newStack1_2_1\camera" 
-I"C:\Dokumente und Einstellungen\Erich\Eigene 
Dateien\Arthurneu\newStack1_2_1\
networkcard"  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99 
-DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT MPX4115A.o -MF dep/MPX4115A.o.d 
-c  ../MPX4115A.c

avr-gcc -mmcu=atmega644 -Wl,-Map=ETH_M32_EX.map wol.o analog.o base64.o 
cmd.o dhcpc.o dnsc.o http_get.o httpd.o lcd.o main.o ntp.o sendmail.o 
stack.o telnetd.o timer.o udp_lcd.o usart.o enc28j60.o servo.o cam.o 
MPX4115A.o     -o ETH_M32_EX.elf
c:/winavr-20090306rc1/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5\ 
libc.a(inverse.o):  In function `inverse':
(.text.fplib+0xc): relocation truncated to fit: R_AVR_13_PCREL against 
symbol `__divsf3' defined in .text section in 
c:/winavr-20090306rc1/bin/../lib/gcc/avr/4.3.2/avr5\libgcc.a(_div_sf.o)
c:/winavr-20090306rc1/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5\ 
libc.a(modf.o):  In function `modf':
(.text.fplib+0x3e): relocation truncated to fit: R_AVR_13_PCREL against 
symbol `__subsf3' defined in .text section in 
c:/winavr-20090306rc1/bin/../lib/gcc/avr/4.3.2/avr5\libgcc.a(_addsub_sf. 
o)
make: *** [ETH_M32_EX.elf] Error 1
Build failed with 1 errors and 0 warnings...

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe ... wrote:
> Wie GENAU lautet die Fehlermeldung?
> Mein avr-gcc (GCC) 4.2.2 (WinAVR 20071221) kompiliert das ohne zu
> meckern...

äh. das ist jetzt ein Witz, oder?
foo.c: In function 'get_pres':
foo.c:6: warning: implicit declaration of function 'exp'
foo.c:6: error: 'HOEHE' undeclared (first use in this function)
foo.c:6: error: (Each undeclared identifier is reported only once
foo.c:6: error: for each function it appears in.)
foo.c:7: error: 'g' undeclared (first use in this function)
foo.c:7: error: 'R' undeclared (first use in this function)
foo.c:8: error: expected ';' before '}' token

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe natürlich math.h inkludiert, HOEHE definiert und die letzte 
Zeile rauskommentiert. Ich habe mal angenommen, dass sie eigentlich in 
der Zeile davor als Kommentar stehen sollte und hier im Forum verrutscht 
ist.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe ... wrote:
> Ich habe natürlich math.h inkludiert, HOEHE definiert und die letzte
> Zeile rauskommentiert. Ich habe mal angenommen, dass sie eigentlich in
> der Zeile davor als Kommentar stehen sollte und hier im Forum verrutscht
> ist.

Schreibe die Quelle in [c]-Tags, dann verrückt da auch nix.

Was HOEHE ist weiß alleine die berühmte Kristallkugel: ne Variable (wie 
deklariert, wo definiert) ein Makro (wie define'd?) undefiniert? Äpfel? 
Tomaten? ...?

Linkst du die libm dazu (mit -lm)?

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Uwe
Du hast anscheinen keine deklarationen gemacht.
und hast übersehen das g und R nur eine Info ist lange zeilen haben sich 
beim einspielen ins Forum geteilt.
Deklarationen haben ich natürlich alle gemacht sonst würde es andere 
Fehlermeldungen geben.
Die oben genannen meldungen bekomme ich beim Compilieren.

Autor: Erich Floh (fler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende Winavr und Win studio habe beide files in Projekt 
eingefügt.
Die funktion im der main aufgerufen und die notwendigen daten zur 
verfügung gestellt.
wenn ich die zeile mit der exp() funktion aufrufe kann ich am LCD den 
Absdruck lesen
Also soweit stimmt auch alles.

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe natürlich gemeint wenn ich die zeile mit der exp() funktion 
auskommentiere dann compiliere, dann auf den Atmega644 brenne kann ich 
den absdruck lesen

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich füge noch ein wie ich den aufruf in der main gemacht habe:
static double mpx_volt, tempm, temperat=24, abs_pres=0, rel_pres=0; //so die definition

  mpx_volt = (var_array[6]*adcv);//0.0763/1000; // hier rechne ich ad in volt
        get_pres(mpx_volt, temperat, &abs_pres, &rel_pres); //hier der aufruf


ich habe nur die relevanten zeilen eingefügt

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt gcc, wenn du den Linklauf mit -v machst?

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie mache ich das?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du machst den Linkaufruf
avr-gcc -mmcu=atmega644 -Wl,-Map=ETH_M32_EX.map wol.o analog.o base64.o
cmd.o dhcpc.o dnsc.o http_get.o httpd.o lcd.o main.o ntp.o sendmail.o
stack.o telnetd.o timer.o udp_lcd.o usart.o enc28j60.o servo.o cam.o
MPX4115A.o     -o ETH_M32_EX.elf
zusätzlich mit -v.

gcc delegiert nur an den Linker. Mit der Option sieht man den 
eigentlichen Linkeraufruf. Auf den Ablauf selbst hat es keinen Einfluß.

Johann

Autor: Erich Floh (fler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe -v bei custom options (AVR Studio 4 mit winavr) eingetragen
bei Build sind folgende Meldungen gekommen ich habe es in ein textfile 
gepackt.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, der Linklauf sieht noch aus wie immer. Mal abgesehen davon, daß es 
ziemlich sinnfrei ist, dem Linker Include-Pfade mitzugeben, ist da immer 
noch kein -v das den eigentlichen Linker-Aufruf zeigt:
avr-gcc -mmcu=atmega644 -Wl,-Map=ETH_M32_EX.map wol.o analog.o base64.o cmd.o dhcpc.o dnsc.o http_get.o httpd.o lcd.o main.o ntp.o sendmail.o stack.o telnetd.o timer.o udp_lcd.o usart.o enc28j60.o servo.o cam.o MPX4115A.o   -L"C:\WinAVR-20090306rc1\avr\inc
lude\avr" -L"C:\WinAVR-20090306rc1\avr\include" -L"C:\WinAVR-20090306rc1\avr\include\util"   -o ETH_M32_EX.elf

Ausserdem verwendest du keine "offizielle" Release von avr-gcc oder 
WinAVR. Du verwendest offenbar einen "Release Candidate" (rc1), also nur 
einen Kandidaten für eine Release, der idR mehr Fehler enthält.

Johann

Autor: Erich Floh (fler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So dies müsste richtig sein.Nun wird -v eingefügt.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat dein Versuch mit -lm gebracht?

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll ich nun beim  statt -v , -lm eingeben?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, link die libm hinzu, aber nach den Objekten (wommer man das in 
AVR-Studio drehen muss, kann ich nix zu sagen).

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja jetzt funktioniert es zumindest konnte ich ein .hex ohne fehler 
bilden.
Der fehler von vorhin ist weg.
Kannst du mir schreiben warum?

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es nun auch am uP es lauft Danke.
Aber ich würde trotzdem gerne wissen was die libm bewirkt

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einige Funktionen sind wohl mehrfach vorhanden, und ohne die libm werden 
Offsetz zu groß und können vom Linker nicht mehr relaxt werden, wenn ich 
das richtig verstehe.

http://www.google.de/search?q=%22relocation+trunca...

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Achso ist das. Ich bedanke mich auf alle fälle für deine Hilfe.
Ich habe die Software schon fleissig am laufen.
mfg Erich

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.