Outsourcen von Programmcode = Programmtod

Gast #1852647
Lesenswert?

Moin!

Mein Problem: nachdem ich nun verschiedene Interrupts auf dem Atmega8535 
hinbekommen habe, möchte ich die ISRs in eine eigene Interrupts.c Datei 
verlagern.
Doch der Compiler meckert, klagt über fehlende Deklarationen, egal, wo 
ich die Variablendeklarationen hinschiebe, ausser, sie stehen direkt 
"über" der main-loop als globale Variable.

Wie sieht eine vernünftige Lösung hierfür aus?
Gast #1852895
Lesenswert?

Es will nicht klappen!!
Wenn nicht ISR und Variablendekaration direkt nebeneinanderstehen, 
behauptet er, die Variable wäre nicht deklariert!

Nebenbei: muss ich für eine ausgelagerte ISR einen Prototypen im 
Headerfile anlegen? Und ohne Auslagerung?
Sähe der Prototyp für ISR(TIMER0_COMP_vect) dann so 
ISR(TIMER2_COMP_vect);
aus?
Fragen über Fragen. Zeit fürs erste Flens..
Moderator Persönliche Seite #1852909
Lesenswert?

Stephan R. schrieb:

> Wenn nicht ISR und Variablendekaration direkt nebeneinanderstehen,
> behauptet er, die Variable wäre nicht deklariert!

Dann mach Nägel mit Köpfen und poste (minimalen!) Code, der das
Problem aufzeigt.

> Nebenbei: muss ich für eine ausgelagerte ISR einen Prototypen im
> Headerfile anlegen?

Nein.  Eine ISR ist komplett eigenständig und wird nur durch ihren
Vektornamen eindeutig zugeordnet (das macht erst der Linker).
Persönliche Seite #1852917
Lesenswert?

Stephan R. schrieb:

> Es will nicht klappen!!
> Wenn nicht ISR und Variablendekaration direkt nebeneinanderstehen,
> behauptet er, die Variable wäre nicht deklariert!

Code zeigen wäre hilfreich.

my_int.c:
1
#include "my_int.h"
2

3
// Globale Variable für den Datenaustausch 
4
// zwischen ISR und main()
5
volatile char foo; 
6

7
ISR(TIMER2_COMP_vect)
8
{
9
  foo = 1;
10
}

my_main.c:
1
#include "my_int.h"
2

3
int main(void)
4
{
5
  // TIMER2_COMP aufsetzen...
6
  while (1)
7
  {
8
    if (foo != 0)
9
    {
10
      // auf TIMER2_COMP reagieren...
11
      // Gemeinsame Variable zurücksetzen
12
      foo = 0;
13
    }
14
  }
15
}

my_int.h:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
extern volatile char foo;

> Nebenbei: muss ich für eine ausgelagerte ISR einen Prototypen im
> Headerfile anlegen? Und ohne Auslagerung?
> Sähe der Prototyp für ISR(TIMER0_COMP_vect) dann so
> ISR(TIMER2_COMP_vect);
> aus?
> Fragen über Fragen. Zeit fürs erste Flens..

Nein für die ISR brauchst du keinen Prototypen anzulegen.

Die avr/interrupt.h hast du includiert, damit ISR und TIMER2_COMP_vect 
beim Kompilieren bekannt sind?
Gast #1852935
Lesenswert?

Super. Mein liebevoll zusammengeschnipelter Code ist wieder weg.
Aber nach einpaar Experimenten mit "extern" wurden sie Fehler immer 
weniger und sind schließlich ale weg, muss mir noch bissel was über 
extern und volatile anlesen, dnek ich.
Vielen Dank!
Gast #1853269
Lesenswert?

Moin,

also ich pflege immer folgendes:
- die main-Funktion und der ISR in ein Main-Modul.
- da kommen dann auch die globalen Attribute hin.
- in der ISR kannst Du dann eine Funktion aus einem
  anderen Modul aufrufen und Parameter uebergeben oder
  Attribute importieren.
ungefaehr so:

main.c
-------------------------------
#include "my_int.h"

char foo;

ISR(...){
 ...
 what_ever(foo);
 ...
}

int main(void){
 ...
 foo='c';
 ..
}
-------------------------------

my_int.c
-------------------------------
// extern char foo;

int what_ever(int param){
 ...
 // Zugriff auf importiertes foo oder param
 ...
}
-------------------------------

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