Forum: Compiler & IDEs error: redefinition of 'ISR'


von klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich bekomme bei meinem Avr Projekt immer den Fehler:
"redefinition of ISR".

Habe auch schon 2 Stunden gegoogelt, bin aber nicht auf den Fehler 
gekommen.
Auch unter dem Link:
Beitrag "ISR() ->error: redefinition of 'ISR'"
habe ich keine Lösung gefunden.
<avr/interrupt.h> ist includiert
ich benutze die version 1.7.1

Mikrocontroller: Atmega16
Ich verwende Eclipse unter Fedora 16

Ich hoffe ihr könnt mir helfen ;)

lg
klaus

von frame (Gast)


Lesenswert?

Kein Wunder, du hast ja auch zwei Mal in deinem Quellcode eine Funktion 
ISR() deklariert.
Benenne eine davon um, und der Fehler wird verschwinden...

von Peter II (Gast)


Lesenswert?

frame schrieb:
> Kein Wunder, du hast ja auch zwei Mal in deinem Quellcode eine Funktion
> ISR() deklariert.

schön das sich auch leute zu wort melden die keine Ahnung von AVR und 
GCC haben.

ISR ist ein Makro und ist an dieser stelle auch 2 mal richtig.


Ich würde mal die ausgabe nach dem Preprozesor anschauen, ob das makro 
ISR auch wirklich aufgelöst wird.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

klaus schrieb:

> Ich bekomme bei meinem Avr Projekt immer den Fehler:
> "redefinition of ISR".

Das ist doch bestimmt ne Zeilennummer dabei?

Und was soll das da sein?

> #include <avr/stdio.h>

Das heisst #include <stdio.h>

von Peter II (Gast)


Lesenswert?

Johann L. schrieb:
> Das heisst #include <stdio.h>

woher willst du wissen in welchen Verzeichniss er diese Datei hat? Wenn 
das nicht stimmen würde  hatte sich der compiler schon darüber 
beschwert.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter II schrieb:
> Johann L. schrieb:
>> Das heisst #include <stdio.h>
>
> woher willst du wissen in welchen Verzeichniss er diese Datei hat?

stdio.h hat in avr/ nix zu suchen.

Wenn es ein avr/stdio.h gibt, ist die Installation gründlich 
verbrazzelt.

Ausserdem: Will der OP die Wiki-Artikel volatile sowie atomar 
lesen :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> woher willst du wissen in welchen Verzeichniss er diese Datei hat?

<stdio.h> ist ein C-Standard-Header.  Wenn dieser nicht über
die Standard-Suchverzeichnisse direkt gefunden wird, würde ich
der ganzen Toolchain-Installation nicht mehr über den Weg
trauen.  Vermutlich ist das dann auch was ganz anderes als ein
C-Compiler. ;-)

Andererseits würde das natürlich prima dazu passen, dass trotz
des #include <avr/interrupt.h> ja ISR offenbar nicht als Makro
aufgelöst wird …

von Peter II (Gast)


Lesenswert?

Johann L. schrieb:
> Ausserdem: Will der OP die Wiki-Artikel volatile sowie atomar
> lesen :-)

auch falsch - er verwendest sie nicht in der main also braucht er kein 
volatil - es hätte dann nur nachteile.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> er verwendest sie nicht in der main also braucht er kein
> volatil

Er verwendet sie in zwei voneinander unabhängigen Threads.

Allerdings sind ISRs zwangsweise sequence points (weil der Compiler
ihren Aufruf nie "sieht"), insofern muss es hier wohl wirklich nicht
sein.  Dem Compiler bleibt keine andere Wahl, als die jeweiligen
globalen Variablen innerhalb der ISR zu lesen.

Trotzdem vermute ich mal, dass klaus sich keine derartigen Gedanken
überhaupt gemacht hat, sondern nur Glück gehabt hat.  Insofern sollte
er sich die Artikel wohl trotzdem durchlesen.

von Peter II (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Dem Compiler bleibt keine andere Wahl, als die jeweiligen
> globalen Variablen innerhalb der ISR zu lesen.
und auch wegzuschreiben - er kann sie auch nicht im einem Register 
belassen.

> Trotzdem vermute ich mal, dass klaus sich keine derartigen Gedanken
> überhaupt gemacht hat, sondern nur Glück gehabt hat.  Insofern sollte
> er sich die Artikel wohl trotzdem durchlesen.
kann schon sein.

Wollte nur damit sagen das man volatile mit bedacht einsetzen sollte und 
nicht einfach pauschal.

von Peter III (Gast)


Lesenswert?

Peter II schrieb:
> Wollte nur damit sagen das man volatile mit bedacht einsetzen sollte und
> nicht einfach pauschal.
hat das hier jemand gesagt?
der einzige, der hier pauschal mist erzählt, bist du.

einem Johann L. oder Jörg Wunsch was über C erzählen zu können, wirst du 
in deinem leben nicht mehr fertig bringen.
ich auch nicht.

von klaus (Gast)


Lesenswert?

Hallo

Wegen dem "<avr/stdio.h>":
zuerst hatte ich <stdio.h> includiert, aber die Eclipse markierte dies 
mit einer Wellenlinie. Diese verschwindet, wenn ich "avr/" davor 
schreibe.

Jedoch ist trotzdem "<stdio.h>" richtig, denn nach dem umändern hats 
Funktioniert.

Aufgrund der Fehlermeldung habe ich an der falschen Stelle nach einer 
Lösung gesucht.
Wäre für mich einfacher gewesen, wenn der Fehler auf die "<avr/stdio.h>" 
bezogen gewesen wäre.

Danke für die schnelle Hilfe

lg Klaus

von Peter II (Gast)


Lesenswert?

Peter III schrieb:
> hat das hier jemand gesagt?
ja

> Johann L. schrieb:
> > Ausserdem: Will der OP die Wiki-Artikel volatile sowie atomar
> > lesen :-)

zumindest ist der Hinweis hier falsch, es ist hier nicht notwenig

> einem Johann L. oder Jörg Wunsch was über C erzählen zu können, wirst du
> in deinem leben nicht mehr fertig bringen.
naja hier lag Johann L. schon mal falsch.

von Peter III (Gast)


Lesenswert?

klaus schrieb:
> Ich bekomme bei meinem Avr Projekt immer den Fehler:
> "redefinition of ISR".
Wie sehen deine Projekteinstellungen bei Eclipse aus? Hast du da 
vielleicht globale includes?
Wenn du ein statisches makefile hast, lad das doch mal mit hoch.

Kriegst du andere warnings oder errors? Und vor allem in welchen Zeilen.


Und dir fehlt mindestens ein sei() zum Freigeben der Interrupts.

von Peter II (Gast)


Lesenswert?

das hier finde ich mehr bedenktlich

static char ausgabe[10];
int s=0, m=0 ,std=0, z=0, h=0;

strcat(ausgabe,m);

ausgabe wird nie wieder leer gemacht und auch m sollte sich so nicht 
umwandeln lassen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> naja hier lag Johann L. schon mal falsch.

Nein.  Der OP sollte ganz sicher diese Artikel lesen.  Johann hat
nicht dazu geschrieben, dass er deshalb gleich alle globalen
Variablen "volatile" machen soll oder überall atomare Zugriffe
drumrum bauen.

Allerdings sind weder Johann noch Jörg irgendwelche Götter, auch
wir können selbstverständlich Fehler machen wie jeder andere Mensch.

von Peter II (Gast)


Lesenswert?

Jörg Wunsch schrieb:
>> naja hier lag Johann L. schon mal falsch.
> Nein.  Der OP sollte ganz sicher diese Artikel lesen.  Johann hat
> nicht dazu geschrieben, dass er deshalb gleich alle globalen
> Variablen "volatile" machen soll oder überall atomare Zugriffe
> drumrum bauen.

warum hat er dann nicht nicht gleich artikel wie itoa oder ähnliches 
erwähnt. Auf einen Artikel zu verweisen der für den aktuellen code 
keinerlei auswirkung hat ist ein wenig verwirrent.

Eventuell kann ja Johann  mal schreiben, worauf er hinaus wollte.

von frame (Gast)


Lesenswert?

Makros sind die Kapitulationserklärung des SW-Entwicklers.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

frame schrieb:
> Makros sind die Kapitulationserklärung des SW-Entwicklers.

Sinnlose Phrasen sind die Kapitulationserklärung des Forenteilnehmers …

von HildeK (Gast)


Lesenswert?

Peter II schrieb:
> das hier finde ich mehr bedenktlich
>
> static char ausgabe[10];
> int s=0, m=0 ,std=0, z=0, h=0;
>
> strcat(ausgabe,m);

Ja, das wird zumindest nicht das gewünschte Ergebnis bringen.

Warum nicht mit
1
sprintf(ausgabe, "%d:%d:%d:%d%d",std,m,s,z,h);
in einem Statement?

Bei Verwendung von strcat fehlt auch
1
#include <string.h>.

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.