www.mikrocontroller.net

Forum: Compiler & IDEs Komischer Fehler, wenn die Optimierung auf O0 gestellt wird


Autor: Be Mi (bemi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe ein kleines Programm. Wenn ich es mit Optimierung kompiliere, 
ist alles ok, aber wenn ich die Optimierung ausschalte -O0, dann erhalte 
ich folgendes.

avr-gcc.exe -mmcu=atmega644  AVRDebug.o AmadeusTraceAVR.o     -o 
AVRDebug.elf
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\lib 
c.a(fixsfsi.o):  In function `__fixunssfsi':
(.text.fplib+0x0): multiple definition of `__fixsfsi'
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/avr5\libgcc.a(_sf_to_si.o):( 
.text+0x0):  first defined here
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\lib 
c.a(fixsfsi.o):  In function `__fixunssfsi':
(.text.fplib+0x0): multiple definition of `__fixunssfsi'
c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/avr5\libgcc.a(_fixunssfsi.o) 
:(.text+0x0):  first defined here
make: *** [AVRDebug.elf] Error 1

und

16-Dec-2007 16:44:50  gcc plug-in: Error: Object file not found on 
expected location E:\Project\PIC Programmer MCU 
SW\AVRDebug\default\AVRDebug.elf

.

Ich habe jetzt herausgefunden, dass der Fehler nur auftritt, wenn ich 
die sin() Funktion verwende. Hat jemand einen Tip, was das sein kann?

Danke,
Bernd

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem und die Lösung ist möglicherweise bekannt, jedenfalls findet 
Goohle die Fehlermeldung *multiple definition of `__fixsfsi* 512 mal im 
WWW.

Zunächst sollte die Mathelibrary mitgelinkt werden (-lm). Genaueres 
müsste dein Makefile hergeben.

Ungewöhnlich ist, dass der Fehler nur bei -O0 auftritt. Kannst du den 
kleinsten, fehlerauslösenden Quelltext bereitstellen?

Autor: Be Mi (bemi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eigentlich nicht viel:

[c]
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
#include "AmadeusTraceAVR.h"

int main() {
volatile  unsigned long i= F_CPU;
  ATInit();
  float a = 3.1415926;
  a = sin (a);

  ATSendString("Als nächstes kommt die Ausgabe eines Float");

    if (ATTraceAllowed()){
      _ATActivate();
        ATSendByte(0x5);
        ATSendByte(0x0e);
        ATSendByte(*((unsigned char*)&a+3));
        ATSendByte(*((unsigned char*)&a+2));
        ATSendByte(*((unsigned char*)&a+1));
        ATSendByte(*((unsigned char*)&a+0));
      _ATMakeTristate();
    }

   return 0;
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel ist nicht ausreichend, um den Fehler nachzuvollziehen

-------- begin --------
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: main.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
In file included from main.c:2:
d:/winavr/bin/../avr/include/util/delay.h:89:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
main.c:4:29: error: AmadeusTraceAVR.h: No such file or directory
main.c:6: warning: function declaration isn't a prototype
main.c: In function 'main':
main.c:8: warning: implicit declaration of function 'ATInit'
main.c:12: warning: implicit declaration of function 'ATSendString'
main.c:14: warning: implicit declaration of function 'ATTraceAllowed'
main.c:15: warning: implicit declaration of function '_ATActivate'
main.c:16: warning: implicit declaration of function 'ATSendByte'
main.c:22: warning: implicit declaration of function '_ATMakeTristate'
main.c:7: warning: unused variable 'i'
MAKE.EXE: *** [main.o] Error 1

Ich probiere die Source soweit abzuändern, dass ich das eigentliche 
Problem unter die Lupe nehmen kann. Kann aber etwas dauern...

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So hier die geänderte Source, die ohne Probleme kompiliert wird und im 
Anhang das zugehörige Makefile (beim TARGETnamen, DEBUGformat, MCU und 
F_CPU ggf. anzupassen)

main.c
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>

#if 0
#include "AmadeusTraceAVR.h"
#else
// Dummyfunktionen
#define ATInit()
#define ATSendString(X)
#define ATTraceAllowed()  1
#define _ATActivate()
#define _ATMakeTristate()
#define ATSendByte(X)
#endif

int main() {
  volatile  unsigned long i= F_CPU;
  ATInit();
  float a = 3.1415926;
  a = sin (a);

  ATSendString("Als nächstes kommt die Ausgabe eines Float");

    if (ATTraceAllowed()){
      _ATActivate();
        ATSendByte(0x5);
        ATSendByte(0x0e);
        ATSendByte(*((unsigned char*)&a+3));
        ATSendByte(*((unsigned char*)&a+2));
        ATSendByte(*((unsigned char*)&a+1));
        ATSendByte(*((unsigned char*)&a+0));
      _ATMakeTristate();
    }

   return 0;
}

Achte im angehängten Makefile mal auf die Zeile 233
MATH_LIB = -lm

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

werde ich mal ausprobieren, aber warscheinlich nicht vor Donnerstag.

Grüße,
Bernd

Autor: Be Mi (bemi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vorlesung ist ausgefallen, da habe ich doch noch ein bischen Zeit :-)

Irgendwie mache ich mit Deinem makefile etwas falsch. Ich bekomme da 
immer:
make: *** No rule to make target `main.elf', needed by `elf'.  Stop.
Build failed with 1 errors and 0 warnings...

Ich muss zugeben, dass ich mich mit makefiles nicht wirklich auskenne. 
Vielleicht hänge ich einfach mal das ganze Projekt dran. Wenn Du da 
vielleicht noch einmal gucken könntest.

Danke

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ah, du arbeitest aus AVR Studio heraus. Ich nicht ;-)

Bei mir steht obiger Quelltext als Datei main.c im gleichen Verzeichnis 
wie das Makefile. Und ich mache das ELF-Programm dann durch die Eingabe 
von make auf der Kommandozeile.

Das Makefile in deinem AVR Studio Projekt enthält die Mathelibrary 
nicht und damit ist die Fehlerursache klar.

Schau in den Projekteinstellungen vom AVR Studio nach und ändere die 
Einstellungen so, dass die Mathelibrary hinzugebunden wird.

Siehe den Screenshot oben (ist aus der folgenden Anleitung)
http://robopoly.epfl.ch/webdav/site/robopoly/users...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:
> Schau in den Projekteinstellungen vom AVR Studio nach und ändere die
> Einstellungen so, dass die Mathelibrary hinzugebunden wird.
...oder stelle in AVRStudio unter Configuration Options "Use external 
Makefile" und gib den Pfad des Makefiles an.

Autor: Be Mi (bemi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktionniert.

Da muss man erst einmal drauf kommen, dass "multiple definition of 
`__fixsfsi'" das Fehlen der Library bedeutet.

Perfekt, ich denke, dass sind so die Anfängerfehler, die man so macht.

Danke und Grüße,
Bernd

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd M. wrote:

> Da muss man erst einmal drauf kommen, dass "multiple definition of
> `__fixsfsi'" das Fehlen der Library bedeutet.

Das ist ja auch ein Bug und kein Feature. ;-)  Leider einer, der aus
logistischen Gründen nicht so einfach zu reparieren ist.

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.