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
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.
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>
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.
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 :-)
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 …
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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