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
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
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.