Komischer Fehler, wenn die Optimierung auf O0 gestellt wird

OP #729337
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
Persönliche Seite #729359
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?
OP #729388
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;
}
Persönliche Seite #729422
Lesenswert?

Das Beispiel ist nicht ausreichend, um den Fehler nachzuvollziehen
1
-------- begin --------
2
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
3
Copyright (C) 2006 Free Software Foundation, Inc.
4
This is free software; see the source for copying conditions.  There is NO
5
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6

7

8
Compiling C: main.c
9
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
10
In file included from main.c:2:
11
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"
12
main.c:4:29: error: AmadeusTraceAVR.h: No such file or directory
13
main.c:6: warning: function declaration isn't a prototype
14
main.c: In function 'main':
15
main.c:8: warning: implicit declaration of function 'ATInit'
16
main.c:12: warning: implicit declaration of function 'ATSendString'
17
main.c:14: warning: implicit declaration of function 'ATTraceAllowed'
18
main.c:15: warning: implicit declaration of function '_ATActivate'
19
main.c:16: warning: implicit declaration of function 'ATSendByte'
20
main.c:22: warning: implicit declaration of function '_ATMakeTristate'
21
main.c:7: warning: unused variable 'i'
22
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...
Persönliche Seite #729426
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
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <math.h>
4

5
#if 0
6
#include "AmadeusTraceAVR.h"
7
#else
8
// Dummyfunktionen
9
#define ATInit()
10
#define ATSendString(X)
11
#define ATTraceAllowed()  1
12
#define _ATActivate()
13
#define _ATMakeTristate()
14
#define ATSendByte(X)
15
#endif
16

17
int main() {
18
  volatile  unsigned long i= F_CPU;
19
  ATInit();
20
  float a = 3.1415926;
21
  a = sin (a);
22

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

25
    if (ATTraceAllowed()){
26
      _ATActivate();
27
        ATSendByte(0x5);
28
        ATSendByte(0x0e);
29
        ATSendByte(*((unsigned char*)&a+3));
30
        ATSendByte(*((unsigned char*)&a+2));
31
        ATSendByte(*((unsigned char*)&a+1));
32
        ATSendByte(*((unsigned char*)&a+0));
33
      _ATMakeTristate();
34
    }
35

36
   return 0;
37
}

Achte im angehängten Makefile mal auf die Zeile 233
MATH_LIB = -lm
Angehängte Dateien:
OP #730200
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
Angehängte Dateien:
Persönliche Seite #730239
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/171145/public/guide_prog%20v1.0.0.pdf
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren