Forum: Compiler & IDEs ISR in andere Datei auslagern


von Asterix-007 (Gast)


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.

von Gerd G. (elektrikser)


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

von holger (Gast)


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.

von Asterix-007 (Gast)


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

von Hermann-Josef (Gast)


Lesenswert?

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

von Gerd G. (elektrikser)


Lesenswert?

Das wäre eine Möglichkeit.

von Asterix-007 (Gast)


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

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
Noch kein Account? Hier anmelden.