ISRs in Include / C-File ausgliedern

Gast #3099817
Lesenswert?

Hallo zusammen,

ich schreibe gerade ein Programm für die Eingabe über ein Tastenfeld und 
die Anzeige über ein 4x7 Display. Das Programm besteht aus folgenden 
Komponenten:

- global.h: an mehreren Stellen verwendete globale Variablen etc.
- main.c: übergreifende Steuerung
- Key_panel.c: Entprellung des Tastenfelds und zwei weiterer Tasten
- LED_display.c: Multiplexing eines 4x7 Displays
- LED_row.c: Steuerung zweier LED-Reihen über SPI

Das Programm funktioniert soweit. Nun versuche ich, die ISRs 
(Entprellung und Multiplexing) in ein File ISR.c auszugliedern. (Grund 
ist u. a., dass ich später eine gemeinsame ISR für beide Funktionen 
machen möchte - und dann möchte ich die Funktion in einer "neutralen" 
Datei).

Wenn ich die ISRs ausgliedere, funktioniert zeigt das LED Display keine 
Reaktion mehr. --> Code siehe IR_Multi_Test01.zip

Zum Vergleich auch die Originalversion: IR_Multi_Test02.zip

Der einzige Unterschied ist, dass die beiden ISRs (aus Key_panel.c und 
aus LED_display.c) in das File ISR.c verschoben wurden.

Irgendetwas passt wohl nicht mit der Verknüpfung der Datein über die 
includes? Oder ein sonstiger Denk-/Strukturfehler? Habe schon die 
verschiedensten Konstellationen getestet, aber finde nicht den 
Fehler....

Vielen Dank
Angehängte Dateien:
#3099869
Lesenswert?

In deinem global.h gehören nur DEKLARATIONEN rein, also das 
Bekanntmachen von Variablen. Die DEFINITIONEN, also das Anlegen im 
Speicher, gehören in ein noch nicht existentes global.c

Und dann müssen dein globalen Variablen in globals.h als extern 
definiert werden. Das klappts auch mit den ausgelagerten ISRs.

globals.h

extern volatile uint16_t key_state;
extern volatile uint16_t key_press;



globals.c

volatile uint16_t key_state;
volatile uint16_t key_press;
#3099952
Lesenswert?

Eine "global.h" ist grundsätzlich eine schlechte Idee. Pack die 
Definitionen der globalen Variablen in die c-Dateien der Module und die 
Deklaration (mit extern) in die dazugehörige h-Datei. Dann brauchst Du 
keine global.h.

Die ISRs gehören in der Form auch nicht in eine eigene Datei. Wenn Du 
eine ISR für beide Module (Display und Tasten) nutzen willst, wäre es 
sinnvoller, von der gemeinsamen ISR aus zwei Funktionen aufzurufen. Die 
ISR ist dann nur zwei Zeilen lang und kann in main.c:
1
ISR(TIMER2_OVF_vect)
2
{
3
  keys_isr_handler();
4
  display_isr_handler();
5
}

Die eigentliche Funktionalität (keys_isr_handler und 
display_isr_handler) kommt in die entsprechenden c-Dateien, wo auch die 
Modulvariablen liegen, die sie nutzen. Dann brauchst Du die globalen 
Variablen überhaupt nicht.

Grundsätzlich: Modularer Code bedeutet lose Kopplung, starke Bindung. 
Sprich: Nicht alles auf so viele Dateien wie möglich aufteilen, sondern 
das zusammen lassen, was zusammen gehört. Alles was mit den Tasten zu 
tun hat, kommt in keys.c/h, alles was mit dem Display zu tun hat in 
display.c/h. Diese Module müssen so weit wie möglich eigenständig sein 
und keine gegenseitigen Abhängigkeiten, vor allem keine zum 
Hauptprogramm haben. Nur so kann man diese Module sinnvoll in anderen 
Programmen wiederverwenden.

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