Compiler-Fehler bei ISR

Gast #363956
Lesenswert?

Hallo zusammen,

zur Zeit arbeite ich mich in die C-Programmierung ein.
Bisher habe ich in Assembler programmiert.

Nachfolgend ein kleiner Programm-Rumpf:


#include <avr/interrupt.h>


ISR(SIG_INTERRUPT0)
{
  // TODO Code
}


ISR(SIG_INTERRUPT1)
{
  // TODO Code
}


int main()
{
  // TODO Interrupts initialisieren
  sei();

  // Endlos-Schleife
  while (1)
  {
    // TODO Code
  }

  return (0);
}



Mein Problem ist folgendes:
Wenn ich ISR(SIG_INTERRUPT1) auskommentiere, läuft der Compiler
problemlos durch.
Wenn ich beide ISRs programmiere, habe ich den Compiler-Fehler:
../TestISR.c:14: error: redefinition of 'ISR'

Meine Frage: Warum? Was mache ich falsch? Wie kann ich mehrere ISRs
programmieren.


Vielen Dank für eure geschätzte Hilfe.

Gruss Manfred
Gast #363958
Lesenswert?

Vielen Dank für die schnelle Antwort:

Habe den Code abgeändert:

#include <avr/interrupt.h>


SIGNAL(SIG_INTERRUPT0)
{
}


SIGNAL(SIG_INTERRUPT1)
{
}


int main()
{
  while (1)
  {
  }

  return (0);
}


Die Fehlermeldung hat auch geändert:
../TestISR2.c:10: error: redefinition of 'SIGNAL'


Das Problem ist somit geblieben.

Gruss Manfred
Gast #363959
Lesenswert?

@PEBCAC:

>> ISR ist eine Registerdefinition.
>> ...
>> Interrupts werden so programmiert:
>>   SIGNAL(SIG_INTERRUPT0) {
>>      /* hier was sinnvollen */
>>   }

Falsch! Zusammen mit der neuen Version von WinAVR wurde "SIGNAL"
durch "ISR" ersetzt. "SIGNAL" wird aber aus Kompatibilitätsgründen
bis auf weiteres noch von WinAVR unterstützt (aber nicht mehr
empfohlen).


@Manfred:

Leider unterschlägst Du uns deinen eigentlichen "TODO Code". Ich gehe
davon aus, dass irgendwo in diesem (nicht geposteten) Code eine
geschweifte Klammer, oder ein Semikolon fehlt. Mir hatten derartige
Flüchtigkeitsfehler in der Vergangenheit bereits die tollsten
Fehlermeldungen beschert ;)

Also: Suche in deinem Code noch einmal GENAU nach fehlenden/falschen
Zeichen. Vergiss auch nicht, eingebundene Makros und Routinen /
Bibliotheken zu checken.

Viel Erfolg,
Magnetus
Gast #363962
Lesenswert?

Um den Fehler einzuschränken, sieht mein Code sehr bescheiden aus.

Hier der VOLLSTÄNDIGE Code:


#include <avr/interrupt.h>


SIGNAL(SIG_INTERRUPT0)
{
  int i = 1;
  int j;
  j = i;
}


SIGNAL(SIG_INTERRUPT1)
{
  int i = 1;
  int j;
  j = i;
}


int main()
{
  while (1)
  {
    int i = 1;
    int j;
    j = i;
  }

  return (0);
}


Nebenbei: Ich setze AVR-Studio 4.12:460 udn WinAVR ein.

Gruss Manfred
Gast #363964
Lesenswert?

Sorry, ich meinte natürlich:

#include <avr/interrupt.h>


ISR(SIG_INTERRUPT0)
{
  int i = 1;
  int j;
  j = i;
}


ISR(SIG_INTERRUPT1)
{
  int i = 1;
  int j;
  j = i;
}


int main()
{
  while (1)
  {
    int i = 1;
    int j;
    j = i;
  }

  return (0);
}


Hatte den Vorschlag von smay4finger getestet, und dann die Änderung
nicht mehr rückgängig gemacht.
Gast #363965
Lesenswert?

@Manfred:

Räusper Na ja... ich glaube immer noch nicht, dass DAS dein
vollständiger Code sein soll schmunzel

Aber um beim Thema zu bleiben: Ich gehe davon aus dass du den Code, so
wie du ihn oben geposted hast, nicht per Copy&Paste hier reingesetzt,
sondern separat hier eingetippt hast.

Worauf ich hinaus will: überprüfe ob am Ende deiner Blöcke auch
wirklich eine GESCHLOSSENE geschweifte Klammer steht.

Beispiel (richtig):

   SIGNAL(SIG_INTERRUPT0)
   {
     int i = 1;
     int j;
     j = i;
   }


Beispiel (falsch):

   SIGNAL(SIG_INTERRUPT0)
   {
     int i = 1;
     int j;
     j = i;
   {            <-- FEHLER !
Gast #363968
Lesenswert?

Ja, Leute, ich suche nämlich schon lange am Fehler...

Ich weiss, der Code macht ja nicht Sinn, aber um den Fehler
einzuschränken habe ich ihn bewusst einfach gemacht.

Den Code habe ich WIRKLICH mit Copy&Paste reinkopiert:

#include <avr/interrupt.h>


ISR(SIG_INTERRUPT0)
{
  int i = 1;
  int j;
  j = i;
}


ISR(SIG_INTERRUPT1)
{
  int i = 1;
  int j;
  j = i;
}


int main()
{
  while (1)
  {
    int i = 1;
    int j;
    j = i;
  }
  return (0);
}


Und ich habe WIRKLICH folgende Fehlermeldung:
../TestISR2.c:13: error: redefinition of 'ISR'


Vielen Dank für eure Hilfe
Gruss Manfred
Gast #363969
Lesenswert?

@Manfred:

Du schreibst auch

>> ISR(SIG_INTERRUPT0)

...und...

>> ISR(SIG_INTERRUPT1)

Wenn ich mich nicht irre gibt es zusammen mit der Einführung von
"ISR" auch neue Namen für die Vektoren (die neuen enden jetzt alle
mit "_vect"). Schlag nochmal im "avr-libc Manual.pdf" nach. Dort
sind alle(?) neuen Namen aufgeführt.

Kannst Du auch nochmal deinen verwendeten AVR nennen? Dann könnten wir
Deinen Code mal probehalber compilieren.

Thx
Magnetus
Gast #363973
Lesenswert?

Ich habe in der Doku noch was gefunden: INTERRUPT().
Da tönt auch logisch und kompiliert sogar.

Nochmals an alle: DANKE für die Hilfe.

Ich wünsche eine gute Nacht. Gruss Manfred



#include <avr/interrupt.h>
#include <avr/signal.h>


INTERRUPT(SIG_INTERRUPT0)
{
  int i = 1;
  int j;
  j = i;
}


INTERRUPT(SIG_INTERRUPT1)
{
  int i = 1;
  int j;
  j = i;
}


int main()
{
  while (1)
  {
    int i = 1;
    int j;
    j = i;
  }

  return (0);
}
Gast #363976
Lesenswert?

Moin moin...

Also... ich hab den Code auch nochmal compiliert und (eigentlich)
keinen Fehler gehabt. Einzige Ausnahme: Bei mir gabs Mecker, weil "int
main()" eigentlich "int main(void)" lauten sollte.

Ich hab darauf hin mal versucht, durch bewusstes Einfügen der von mir
genannten Flüchtigkeitsfehler, deinen Fehler zu provozieren. Aber
leider scheint mein Geschwätz wohl doch nichts damit zu tun gehabt
haben rotwerd ;)

Nun zum Unterschied zwischen "INTERRUPT" und "ISR" (bzw.
"SIGNAL"):

Deklarierst du deinen Interrupthandler als "ISR" bzw. "SIGNAL" wird
dieser Handler mit gestperrten Global Interrupt Enable ausgeführt, was
verhindert, dass dein Handler von einem anderen Interrupt unterbrochen
wird. Erst beim Rücksprung aus dem Handler werden die Interrupts wieder
freigegeben.

Deklarierst du deinen Interrupthandler als "INTERRUPT" werden die
Interrupts gleich zu Beginn des Handlers wieder freigegeben. Dein
Handler kann dann von anderen Interrupts unterbrochen werden.

Gruß
Magnetus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren