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
Wie GENAU lautet die Fehlermeldung? Mein avr-gcc (GCC) 4.2.2 (WinAVR 20071221) kompiliert das ohne zu meckern...
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
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...
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 |
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.
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)?
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.
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.
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
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
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
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.
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
Ja, link die libm hinzu, aber nach den Objekten (wommer man das in AVR-Studio drehen muss, kann ich nix zu sagen).
ja jetzt funktioniert es zumindest konnte ich ein .hex ohne fehler bilden. Der fehler von vorhin ist weg. Kannst du mir schreiben warum?
Ich habe es nun auch am uP es lauft Danke. Aber ich würde trotzdem gerne wissen was die libm bewirkt
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.