www.mikrocontroller.net

Forum: Compiler & IDEs ISR in andere Datei auslagern


Autor: Asterix-007 (Gast)
Datum:

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

Autor: Gerd G. (elektrikser)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Asterix-007 (Gast)
Datum:

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

Autor: Hermann-Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Asterix-007,

ohne den Code geshen zu haben vermute ich, dass Du folgendes nicht 
gemacht hast:

File terminal-routines.h:
// Deklaration
extern int RxProducer;

File terminal-routines.c:
// Definition
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

Autor: Gerd G. (elektrikser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre eine Möglichkeit.

Autor: Asterix-007 (Gast)
Datum:

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

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.