Moin Männers, ich brauche mal eure Hilfe. Ich habe mich jetzt durchs Tut gelesen, gesucht und alle möglichen Bücher gewälzt, aber das Problem ist nach wie vor da. Eigentlich ist es ganz simpel, aber naja. Entweder sehe ich den Wald vor lauter Bäumen nicht, oder ich hab ne Bildungslücke! Also ich bin gerade dabei das Projekt an dem ich arbeite in handliche Stücke zu trennen. Sprich es soll eine Codesammlung herauskommen welche wiederverwendbar sein soll. Dazu sollten auch die ISR mit in die dazugehörigen Files. D.h. im Terminal-Programm sollen auch die UART-ISR mit abgelegt sein. Das macht ja Sinn. Frage: Kann ich ISR in andere Dateien, wo nicht die main-Schleife ist auslagern? Laut meinem C-Verständnis sollte das gehen. Also habe ich eine ISR (welche funktioniert) einfach in eine externe Datei verschoben, die Variablen mit in eine zugehörige h.-Datei verschoben und alles compiliert. Das Ergebnis: Build started 1.11.2007 at 23:26:34 ../terminal-routines.h:27: warning: 'send_buf' defined but not used avr-gcc.exe -mmcu=atmega128 main.o lcd-routines.o environment.o terminal-routines.o spi-routines.o -o main.elf terminal-routines.o: In function `usart_init': ../terminal-routines.c:44: multiple definition of `RxProducer' main.o:../main.c:31: first defined here terminal-routines.o: In function `usart_init': ../terminal-routines.c:44: multiple definition of `RxConsumer' main.o:../main.c:31: first defined here make: *** [main.elf] Error 1 Build succeeded with 3 Warnings... Wobei, jedes File für sich compiliert geht ohne Warnungen durch, nur das linken macht Probleme. Gibt es bei WinAVR noch versteckte Settings wo man drehen kann? Beide Programme sind up to date, ein Versions-Problem kann ich also ausschliessen. Ich habe wirklich nur die betreffenden Routinen ausgelagert!! :-( Woran könnte es noch liegen? Danke für eure Hilfe Asterix-007 P.S. Code liefere ich nach, wenn ihr meine erste Frage mit "ja" beantwortet.
O.k. dann gebe ich dir mal ein: Ja! Wenn du dir ein Beispiel ansehen willst, schau dir den Code des Webservers vom Ulrich Radig (Titelseite Link) an. Da liegt die ISR in der timer.c. >>../terminal-routines.h:27: warning: 'send_buf' defined but not used Eine Variable, die angelegt wurde aber nie verwendet wurde. Ist sie nötig? >>../terminal-routines.c:44: multiple definition of `RxProducer' >>../terminal-routines.c:44: multiple definition of `RxConsumer' Diese beiden wurden mehrfach definiert. Vielleicht in der terminal-routines.c und in der main.c? Welche ist gültig? Einmal reicht. Gruß Elektrikser
>../terminal-routines.c:44: multiple definition of `RxProducer' >main.o:../main.c:31: first defined here Da hast du RxProducer einmal in main.c und in terminal-routines.c definiert. Das mag der Linker nicht.
Hallo Gerd, die "send_buf" ist bekannt, wird später benötigt. Ich hab einfach alles wieder rausgeschmissen, was stören könnte. Die beiden anderen Variablen sind die Sorgenkinder. Ich hab sie einfach in die h.-Datei gezogen. Sie sind definitiv nicht doppelt eingebunden! Es sei denn, über das Einbinden der Files gab, bzw. gibt es diese "multiplen" Verknüpfungen. Hm, ich werd mir noch mal kurz den code vom Ullrich anschauen. Ich habe bis jetzt nichts passendes gefunden, weil alle ihre ISR im main-file hatten. Trotzdem danke!!!! Asterix
Hallo Asterix-007, ohne den Code geshen zu haben vermute ich, dass Du folgendes nicht gemacht hast: File terminal-routines.h:
1 | // Deklaration
|
2 | extern int RxProducer; |
File terminal-routines.c:
1 | // Definition
|
2 | int RxProducer; |
Setze für 'int' den zutreffenden Typ ein. Ohne das 'extern' wird die Definition (= Speicher dafür reservieren) durchs EInbinden von 'terminal-routines.h' zweimal gemacht (wie Holger schreibt) und der Linker mag das nicht. Hermann-Josef
Moin, korrekt Herrmann-Josef!! Das war des Problems Lösung! Es funzt!!!! Jetzt kann ich in Ruhe schlafen gehen!! Gute Nacht und Vielen Dank!!! Asterix-007
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.