www.mikrocontroller.net

Forum: Compiler & IDEs .S-Files mit avr-eclipse


Autor: Gerry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte in einem C++-Projekt, welches ich für den ATMEGA32 mit 
avr-eclipse entwickle, Assembler-Quellcode in .S-Files einsetzen.

Nun weiß ich aber nicht, wie ich dem Linker in der Eclipse-IDE 
verklickern soll, dass er diesen Quellcode einbindet.


Das Projekt enthält die Datei main.cpp:

extern void asmfn (void);

int main (void)
{
  //asmfn();
  while(1);
  return 0;
}


sowie asmpart.S:

 .section .text
 .global asmfn

asmfn:  
    ret


Beide Dateien werden kompiliert, es wird asmpart.o sowie main.o erzeugt, 
und die asmfn taucht auch im .map-File mit dem Verweis auf asmpart.o 
auf.
Wenn ich jedoch die Auskommentierung vor "asmfm()" entferne, erhalte ich 
die Fehlermeldung:
Building target: asmtest.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,asmtest.map,--cref -mmcu=atmega32 -o"asmtest.elf"  ./asmpart.o ./main.o   
./main.o: In function `main':
../main.cpp:5: undefined reference to `asmfn()'
make: *** [asmtest.elf] Error 1

Und wenn ich unter Project->Properties->AC/C++ Build->Settings->AVR C++ 
Linker->Objects die Datei asmpart.o manuell unter "Other Objects" 
eintrage, erhalte ich die Fehlermeldung
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,asmtest.map,--cref -mmcu=atmega32 -o"asmtest.elf"  ./asmpart.o ./main.o  asmpart.o 
asmpart.o: In function `asmfn':
../asmpart.S:(.text+0x0): multiple definition of `asmfn'
./asmpart.o:../asmpart.S:(.text+0x0): first defined here
./main.o: In function `main':
../main.cpp:5: undefined reference to `asmfn()'
make: *** [asmtest.elf] Error 1

Kann mir bitte jemand einen Tip geben?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir gehts völlig problemlos. Aktuulltes Eclipse-plugin, und 
WinAVR20071221. main.c und asmpart.S als sourcefiles.
extern void asmfn (void);
geht auch ohne extern.

Oliver
**** Build of configuration Debug for project test ****

make all 
Building file: ../asmpart.S
Invoking: AVR Assembler
avr-gcc -x assembler-with-cpp -g2 -gstabs -mmcu=atmega16 -MMD -MP -MF"asmpart.d" -MT"asmpart.d" -c -o"asmpart.o" "../asmpart.S"
Finished building: ../asmpart.S
 
Building file: ../main.c
Invoking: AVR Compiler
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=1000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
Finished building: ../main.c
 
Building target: test.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,test.map -mmcu=atmega16 -o"test.elf"  ./asmpart.o ./main.o   
Finished building target: test.elf
 
Invoking: AVR Create Extended Listing
avr-objdump -h -S test.elf  >"test.lss"
Finished building: test.lss
 
Invoking: Print Size
avr-size --format=avr --mcu=atmega16 test.elf
AVR Memory Usage
----------------
Device: atmega16

Program:     164 bytes (1.0% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)


Finished building: sizedummy

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir gehts völlig problemlos. Aktuellstes Eclipse-plugin, und 
WinAVR20071221. main.c und asmpart.S als sourcefiles.
extern void asmfn (void);
geht auch ohne extern.

Oliver
**** Build of configuration Debug for project test ****

make all 
Building file: ../asmpart.S
Invoking: AVR Assembler
avr-gcc -x assembler-with-cpp -g2 -gstabs -mmcu=atmega16 -MMD -MP -MF"asmpart.d" -MT"asmpart.d" -c -o"asmpart.o" "../asmpart.S"
Finished building: ../asmpart.S
 
Building file: ../main.c
Invoking: AVR Compiler
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=1000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
Finished building: ../main.c
 
Building target: test.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,test.map -mmcu=atmega16 -o"test.elf"  ./asmpart.o ./main.o   
Finished building target: test.elf
 
Invoking: AVR Create Extended Listing
avr-objdump -h -S test.elf  >"test.lss"
Finished building: test.lss
 
Invoking: Print Size
avr-size --format=avr --mcu=atmega16 test.elf
AVR Memory Usage
----------------
Device: atmega16

Program:     164 bytes (1.0% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)


Finished building: sizedummy

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Hatte übersehen, daß es um C++ geht.

[/c]extern "C" void asmfn (void);[c]

tuts.

Oliver

Autor: Gerry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

herzlichen Dank Oliver, jetzt gehts! Das sind Fehler, die kann man 
tagelang suchen, wenn man einmal auf der falschen Fährte ist.

Danke.

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.