mikrocontroller.net

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


Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Monarch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
caste doch mal zum testen

(float)int_count

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

gleiche Fehlermeldung?

volatile zwingend erforderlich?

Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Monarch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Monarch (Gast)
Datum:
Angehängte Dateien:

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

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom O. (fireblade)
Datum:

Bewertung
0 lesenswert
nicht 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

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.