Forum: Compiler & IDEs Wohin mit dem Variablendefinitionen für gute Struktur/Ordnung


von Martin (Gast)


Lesenswert?

Hallo,

ich bin recht neu dazu gestoßem im Mikrocontroller-Programmieren. 
Beschäftige mich derzeit mit AVRs und programmiere in C.

Ich habe nun ein Programm,dass doch mehrere Interrupts hat (Timer OVF, 
Compare Match, UART), 2-3 selbstgeschriebene Funktionen, dazu noch 
fertige Funktionen zum ADC einlesen und Tasten-Entprellen aus dem 
Tutorial.

Dazu noch das Hauptprogramm.

Das Programm ist soweit nun auch fertig und funktioniert. Aber es ist 
total übersichtlich hinsichtlich der Variablen. Es fehlt im Prinzip die 
Übersicht, welche Variable gehört zu welchem Programmteil oder 
Interrupt... da die Variablen "überall" gelesen oder geschrieben werden.

Variablen auf die die ISRs und das Hauptprogramm zugreifen stehen ganz 
oben mit volatile, dann sind teilweise in den Funktionen ein paar 
Variablen verstreut, auf die aber auch wo anders zu gegriffen wird, etc.

Wie machen das erfahrene Programmierer. Wo werden die Variablen 
definiert, gibt es hier Regeln um etwas mehr Ordnung zu schaffen?

Danke

von Fabian O. (xfr)


Lesenswert?

Du musst das Programm in mehrere Module (C-Dateien) aufteilen. In Deinem 
Fall beispielsweise eins für UART, eins für die Tasten, eins für den 
ADC, eins für den Timer und eins für das Hauptprogramm. Die Module 
sollten möglichst in sich geschlossen sein, also eine bestimmte, klar 
abgrenzbare Teilaufgabe lösen.

Die Variablen und ISRs kommen in das Modul, in dem sie gebraucht werden. 
Der Datenaustausch zwischen den Modulen findet nur über Funktionen statt 
und nicht über globale Variablen.

Wie das Aufteilen in mehrere C- und H-Dateien funktioniert ist hier gut 
beschrieben:
http://www.mikrocontroller.net/articles/FAQ#Header_File.2C_wie_geht_das.3F

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:

> dann sind teilweise in den Funktionen ein paar
> Variablen verstreut, auf die aber auch wo anders zu gegriffen wird, etc.

Das kann nicht sein.
Variablen innerhalb gehören zur Funktion und sind auch nur innerhalb 
dieser Funktion sichtbar. Das ist ja der ganze Witz an funktionslokalen 
Variablen!
In
1
void foo()
2
{
3
  uint8_t i;
4
5
  for( i = 0; i < 10; i++ )
6
    mach irgendwas
7
}
8
9
void foo()
10
{
11
  uint8_t i;
12
13
  for( i = 0; i < 8; i++ )
14
    mach noch was
15
}

sind das i in foo() und das i in bar() 2 völlig verschiedene Variablen, 
die nichts miteinander zu tun haben. Sie haben zufällig den gleichen 
Namen, aber das stört nicht weiter, da keine der beiden Variablen 
ausserhalb seiner Funktion sichtbar ist. D.h. wenn ich i in foo() 
manipuliere, dann hat das keinerlei Auswirkungen auf das i in bar(). 
Ganz im Gegenteil. In dieser Konstallation gibt es keine Möglichkeit, 
gewollt aus der einen Funktion die Variable der anderen Funktion zu 
manipulieren. D.h. im Umkehrschluss: Wenn ich eine Funktion schreibe, 
dann kann ich dort lokale Variablen erzeugen (die beim Funktionsaufruf 
erzeugt werden und beim Verlassen der Funktion wieder verschwinden), 
ohne dass ich mir darüber Gedanken machen muss, dass ich absichtlich 
oder unabsichtlich irgendwelche funktionslokale Variablen anderer 
Funktionen verändere. (Durch schwere Programmfehler gelingt das 
unabsichtlich, allerdings nicht gezielt und eher zufällig).

von Bronco (Gast)


Lesenswert?

Martin schrieb:
> Es fehlt im Prinzip die
> Übersicht, welche Variable gehört zu welchem Programmteil oder
> Interrupt... da die Variablen "überall" gelesen oder geschrieben werden.

Das kann man z.B. über geschickte Namensgebung der Variable lösen.
Beispiel:
Du hast drei Module ("Main", "Motor", Uart"), dann kannst Du Variablen 
ja nach Zugehörigkeit zu den Modulen benennen:
Main_HauptStatus_u8
Uart_Puffer_au8
Motor_Drehzahl_s16
usw.

Über diesen Thema wurden schon Bücher geschrieben, Stichwort "Software 
Architektur"...

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.