1.6 Basiskonzept für die objektorientierte Programmierung des ATmega32
Forderungen
Wiederverwendbarkeit: Reibungsfreies Zusammenarbeiten
- Bei Mikrocontroller-Programmen greifen viele Programmteile auf die integrierte Peripherie des Mikrocontrollers zu.
- Beispiele für diese Peripherie sind die A/D-Wandler, die RS232-Schnittstelle, Timerfunktionen etc.
- Es ist dabei wichtig zu gewährleisten, dass diese Programmteile reibungsfrei zusammenarbeiten.
|
Reversibilität: Zurücksetzen von Einstellungen
- Timer können z.B. sowohl benutzt werden, um PWM-Signale zu erzeugen, als auch dazu die Dauer von Ereignissen zu stoppen.
- Manchmal ist es erforderlich Ressourcen dieser Art auf mehrfache Weise in einer bestimmten zeitlichen Abfolge zu benutzen.
- Wie eine Ressource benutzt wird, wird über Registereinstellungen auf dem Mikrocontroller gesteuert.
- Ein sinnvolles Konzept sollte die Möglichkeit vorsehen, diese Registereinstellungen nach Verwendung einer Ressource auch wieder zurücksetzen zu können.
|
Transparenz: Einblick in die innere Konfiguration
- Im Gegensatz zum PC besitzen Mikrocontroller keinen Bildschirm, an dem alle Systemeinstellungen eingesehen werden können.
- Eine Alternative bietet die RS232-Schnittstelle des ATmega32.
- Diese kann genutzt werden, Daten an eine PC-Konsole zu schicken.
- Insbesondere können beim Starten des Mikrocontroller Angaben über die verwendeten Ressourcen / Peripherie gesendet werden.
- Das entspricht in etwa der Rückmeldung bei einem Bootvorgang am PC.
|
Umsetzung
Wiederverwendbarkeit: Verwendung von Klassen
- Grundsätzlich bietet die objektorientierte Programmierung bessere Möglichkeiten an, Teilprogramme voneinander zu kapseln und gegenseitige Störungen zu vermeiden.
- Eine große Gefahr geht in der prozeduralen Programmoierung von globalen Variablen und Funktionen aus.
- Werden zwei Programmteile getrennt entwickelt, wie die Verwendung der RS232-Schnittstelle und die des AD-Wandlers, erfordert es Mühe beide prozeduralen Programme miteinander zu verschmelzen, wenn man beide Features gleichzeitig einsetzen will.
- Methoden und Attribute in Klassen sind eindeutig den von der Klasse gebildeten Objekten zugeordnet.
- Bei konsequenter Anwendung der OOP können somit solche Schwierigkeiten nicht auftreten.
- Die Konfiguration des Mikrocontrollers und die Verwendung einzelner Peripherie soll deshalb in Klassen mit entsprechenden Methodne verborgen werden.
- Darüberhinaus kann eine spezielle Klasse PinWatchdog dazu eingesetzt werden, Konflikte bei Pinbelegungen zu überprüfen.
|
Reversibilität: start- und stop-Methoden
- Der derzeitige Compiler ist nicht in der Lage Objekte dynamisch zu erzeugen und wieder zu zerstören, wenn sie nicht gebraucht werden.
- Hier wäre auch der Speicherbedarf nicht immer vorhersehbar und es kann zu Programmabstürzen durch Speicherüberschreitung kommen.
- Der benötigte Speicher für alle benötigten Variablen und Objekte sollte deshalb beim Start festgesetzt werden.
- Statt dessen soll die notwendige Konfiguration und deren Zurücksetzung durch eine start- und eine stop-Methode realisiert werden, die nach Erzeugung eines Objektes für dieses beliebig oft benutzt werden können.
- Sa kann eine Objekt der Klasse Timer2PWM und eines der Klasse Timer2Stopuhr im Wechsel benutzt werden.
|
Transparenz: Konstruktoren schicken Informationen an den PC
- Jede Klasse soll einen Konstruktor haben, dem ein Zeiger auf ein Objekt vom Typ RS232 übergeben werden kann.
- Wird dieser Konstruktor ausgewählt, so soll das entstehende Objekt Auskünfte über sich an den PC erteilen, z.B.:
- Welche Funktion hat das Objekt, Welche Pins werden benutzt, welche Teilerrate für einen Timer wurde eingestellt.
|
UML Klassendiagramm
- Mit UML ist es u.a. möglich Klassen unabhängig von der Programmiersprache grafisch darzustellen.
- Eine Klasse hat einen Namen und beinhaltet Methoden und Attribute.
- Genau dies ist in den drei übereinanderliegenden Kästen des UML-Klassendiagramms zu sehen.
- Und wir finden die oben beschriebenen Elemente hierin wieder.
|
Bild 1.6-1: UML-Klassendiagramm für den Entwurf einer geeigneten Klassenstruktur bei allen verwendeten Klassen.