Forum: Compiler & IDEs Fehler bei exp()


von Erich F. (fler)


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

von Uwe .. (uwegw)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


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

von Erich F. (fler)


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

von Johann L. (gjlayde) Benutzerseite


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?
1
foo.c: In function 'get_pres':
2
foo.c:6: warning: implicit declaration of function 'exp'
3
foo.c:6: error: 'HOEHE' undeclared (first use in this function)
4
foo.c:6: error: (Each undeclared identifier is reported only once
5
foo.c:6: error: for each function it appears in.)
6
foo.c:7: error: 'g' undeclared (first use in this function)
7
foo.c:7: error: 'R' undeclared (first use in this function)
8
foo.c:8: error: expected ';' before '}' token

von Uwe .. (uwegw)


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.

von Johann L. (gjlayde) Benutzerseite


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)?

von Erich F. (fler)


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.

von Erich F. (fler)


Angehängte Dateien:

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.

von Erich F. (fler)


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

von Erich F. (fler)


Lesenswert?

Ich füge noch ein wie ich den aufruf in der main gemacht habe:
1
static double mpx_volt, tempm, temperat=24, abs_pres=0, rel_pres=0; //so die definition
2
3
  mpx_volt = (var_array[6]*adcv);//0.0763/1000; // hier rechne ich ad in volt
4
        get_pres(mpx_volt, temperat, &abs_pres, &rel_pres); //hier der aufruf


ich habe nur die relevanten zeilen eingefügt

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was sagt gcc, wenn du den Linklauf mit -v machst?

von Erich F. (fler)


Lesenswert?

wie mache ich das?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du machst den Linkaufruf
1
avr-gcc -mmcu=atmega644 -Wl,-Map=ETH_M32_EX.map wol.o analog.o base64.o
2
cmd.o dhcpc.o dnsc.o http_get.o httpd.o lcd.o main.o ntp.o sendmail.o
3
stack.o telnetd.o timer.o udp_lcd.o usart.o enc28j60.o servo.o cam.o
4
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

von Erich F. (fler)


Angehängte Dateien:

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.

von Johann L. (gjlayde) Benutzerseite


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:
1
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
2
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

von Erich F. (fler)


Angehängte Dateien:

Lesenswert?

So dies müsste richtig sein.Nun wird -v eingefügt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was hat dein Versuch mit -lm gebracht?

von Erich F. (fler)


Lesenswert?

Soll ich nun beim  statt -v , -lm eingeben?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Erich F. (fler)


Lesenswert?

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

von Erich F. (fler)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


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+truncated+to+fit%22+R_AVR_13_PCREL

von Erich F. (fler)


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

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.