Forum: Mikrocontroller und Digitale Elektronik Probleme mit float Berechnung in Funktion (WinAVR)


von Tom O. (fireblade)


Lesenswert?

Hallo Leute,
ich habe ein ganz übles Problem. Ich will in einer kleinen Funktion
eine float Berechnung durchführen, aber beim compilieren bekomm ich nur
Process Exit Code: 2 im WinAVR. Die Funktion sieht so aus:

...

volatile unsigned int int_count;  //Zähler für INT
...
float Speed()
{
  float result = 0.0;

  int_count = 0;
  NutSleep(1000);

  result = int_count  WHEELcirculation  3.6;


  return result;
}

void main(void)
{

...

}
Nun motzt mein Compiler. Wenn ich anstatt irq_count eine Zahl wie zB.
33.442 einsetze nicht mehr.
Ich programmiere unter WinAVR mit dem Programmers Notepad 2. Als
Betriebssystem des uC hab ich ethernut. Mein uC ist ein Atmega128.
Der Witz ist, das ich das gleiche mit dem ICCAVR Compiler funktioniert
hat. Da ich aber jetzt mit dem WinAVR weiter machen will klappt das
nicht. Ich bin schon am verzweifeln....

Vielen Dank für eure Mühe.
Thomas

von Monarch (Gast)


Lesenswert?

caste doch mal zum testen

(float)int_count

result = (float)int_count * (float) WHEELcirculation * 3.6;

gleiche Fehlermeldung?

volatile zwingend erforderlich?

von Tom O. (fireblade)


Lesenswert?

Danke für die rasche Antwort.
Mit Casten hab ichs auch schon versucht. Leider hat deine Möglichkeit
auch die gleichen Fehler gebracht.

Nach Make all bekomm ich:
> "make.exe" all
avr-gcc -c -mmcu=atmega128 -Os -fno-delete-null-pointer-checks -Wall
-Wstrict-prototypes -Wa,-ahlms=main.lst -DETHERNUT1 -D__HARVARD_ARCH__
-IC:/ethernut-4.1.5/nutbld/include  -IC:/ethernut-4.1.5/nut/include
main.c -o main.o
main.c: In function `Speed':
main.c:781: warning: use of cast expressions as lvalues is deprecated
avr-gcc main.o fat.o mmc.o -mmcu=atmega128
-Wl,--defsym=main=0,-Map=WebServer.map,--cref
-LC:/ethernut-4.1.5/nutbld/lib C:/ethernut-4.1.5/nutbld/lib/nutinit.o
-lnutpro -lnutos -lnutarch -lnutdev -lnutnet -lnutfs -lnutcrt -o
WebServer.elf
C:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\li 
bc.a(log.o):
In function `log':
: relocation truncated to fit: R_AVR_13_PCREL against symbol
`__addsf3' defined in .text section in
C:/Programme/WinAVR/lib/gcc/avr/3.4.6/avr5\libgcc.a(_addsub_sf.o)
make.exe: *** [WebServer.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:03

Ich weiß nicht, ob das weiterhilft?

Dennoch Danke.
Gruß
Thomas

von Monarch (Gast)


Angehängte Dateien:

Lesenswert?

So hab folgenden Programmcode (siehe Anhang)im AVRStudio compilieren
lassen.

Build started 25.9.2006 at 16:00:36
avr-gcc.exe  -mmcu=atmega128 -Wall -gdwarf-2   -DF_CPU=16000000UL -O0
-fsigned-char -MD -MP -MT Test.o -MF dep/Test.o.d  -c  ../Test.c
avr-gcc.exe -mmcu=atmega128  Test.o     -o Test.elf
avr-objcopy -O ihex -R .eeprom  Test.elf Test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load"
--change-section-lma .eeprom=0 -O ihex Test.elf Test.eep

AVR Memory Usage
----------------
Device: atmega128

Program:    2802 bytes (2.1% Full)
(.text + .data + .bootloader)

Data:         10 bytes (0.2% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

von Tom O. (fireblade)


Lesenswert?

hmm das heißt es muß an der Makefile liegen,
oder an dem ethernut Betriebssystem des Controllers...

Das erklärt auch warum es im ICCAVR Compiler auch gegangen ist.

von Monarch (Gast)


Angehängte Dateien:

Lesenswert?

Hab dir mal das entsprechende Makefile angehängt.
Eventuell hilft dir das beim Durchgehen deines eigenen.

von JojoS (Gast)


Lesenswert?

von welchem Typ ist den WHEELcirculation ? Wenn das eine Funktion ist
fehlen die (). Oder fehlt die floating point lib im makefile? Wie sieht
denn die Fehlermeldung aus nach dem 1. Beispiel?

von Tom O. (fireblade)


Lesenswert?

vielen Dank,
ich hab gerade ein neues Projekt in WinAVR gemacht.

#define WHEEL 3.6


volatile unsigned int int_count;


float speed(void)
{

return int_count  WHEEL  3.6;
}
void main(void)
{

int_count = 23;


speed();

}

das hat mit der Makefile des anderen auch wunderbar geklappt. Ich
versteh nur nicht warum das in dem Fall geht und beim anderen nicht.
Aber ich schau mir mal das Makefile an.
Vielen Dank nochmals
Gruß
Tom

von Tom O. (fireblade)


Lesenswert?

@JojoS
WHEELcirculation is nur ein #define mit 1.25 also float. Die Float lib
ist in der makefile drin.
Ich kann ja einfache Berechnungen wie 3.4 + 4.5 * 3.7 oder so
durchführen.
Die Fehlermeldung zum 1. Bsp ist in meinem 2. Beitrag oben:

> "make.exe" all
avr-gcc -c -mmcu=atmega128 -Os -fno-delete-null-pointer-checks -Wall
-Wstrict-prototypes -Wa,-ahlms=main.lst -DETHERNUT1 -D__HARVARD_ARCH__
-IC:/ethernut-4.1.5/nutbld/include  -IC:/ethernut-4.1.5/nut/include
main.c -o main.o
main.c: In function `Speed':
main.c:781: warning: use of cast expressions as lvalues is deprecated
avr-gcc main.o fat.o mmc.o -mmcu=atmega128
-Wl,--defsym=main=0,-Map=WebServer.map,--cref
-LC:/ethernut-4.1.5/nutbld/lib C:/ethernut-4.1.5/nutbld/lib/nutinit.o
-lnutpro -lnutos -lnutarch -lnutdev -lnutnet -lnutfs -lnutcrt -o
WebServer.elf
C:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\li 
bc.a(log.o):
In function `log':
: relocation truncated to fit: R_AVR_13_PCREL against symbol
`__addsf3' defined in .text section in
C:/Programme/WinAVR/lib/gcc/avr/3.4.6/avr5\libgcc.a(_addsub_sf.o)
make.exe: *** [WebServer.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:03

von Tom O. (fireblade)


Lesenswert?

Nabend,
also ich hab mich mal weiter schlau gemacht.
So wie ich das überblicke, bekomm ich den Fehler sobald ich einen Float
Wert als Return zurückgebe.
Der Make Error ist scheinbar ein Bug der AVR C Runtime Library.
Näheres gibts hier.
https://savannah.nongnu.org/bugs/?14855


Grüße
Tom

von Tom O. (fireblade)


Lesenswert?

sooo ich hab das Problem gelöst.
Lösung war ein Weg, den ein Kollege im Forum schon gefunden hat.
Ich mußte einfach die Lib libm.a in die Makefile einbinden.

Dennoch danke für eure Hilfe.

Gruß
Tom

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.