Ich bin gerade dabei eine Klassenbibliothek für Mikrocontroller zu erstellen.
Es handelt sich dabei um Atmel avr 8 Bit Mikrocontroller.
Ich habe folgende Überlegung angestellt ein Mikrocontroller besteht zunächst ein mal aus Registern, bei den AVRs gibt es 8-Bit Register und 16-Bit Register.
Des weiteren besitzt ein Mikrocontroller noch verschiedene Schnittstellen wie z.b. :
- UART
- SPI
- GPIO
- ADC
Bis jetzt habe ich eine Superklasse namens register geschrieben diese beinhaltet ein Bitfeld um ein 8-Bit Register abzubilden und eine union um ein 16-Bit Register abzubilden.
Zu dem enthält die Klasse register noch einige rein - virtuelle Methoden mit denen man bits setzen bzw. löschen kann.
Die Hirarchie soll folgendermaßen aussehen:
Die Superklasse register steht in der Hirarchie ganz oben, direkt unter der Superklasse befinden sich die Klassen, die Perepherie Klassen (UART, SPI, GPIO, ADC, TIMER, etc.).
Polymorphismus bedeutet ja, dass man eine Superklasse definiert die alles allgemein abbildet und man nach unten hin spezialisiert.
Da man jetzt z.b. den UART nur über bestimmte Register steuern kann ist mir jetzt nicht ganz klar, wie man es realisiert, dass für die UART Klasse zwar die das 8-Bit Bitfeld von der superklasse register nutzt aber die Register sollen in der UART klasse spezialisiert werden.
Das gleiche gillt auch für Methoden es soll zwar setBit bzw. clearBit aus der Superklasse register genutzt werden, aber die Metthoden sollen in der UART Klasse anderst heißen, z.b. enableUartTransmitter.
Kann mir bitte jemand ein paar Tips geben ?
Anbei mal die register Klasse
gruß gizno
Code: Alles auswählen
#ifndef M32_H
#define M32_H
#include "types.h" // -> word = uint16_t, byte = uint8_t
class register
{
protected:
struct register8Bit
{
byte bit0:1;
byte bit1:1;
byte bit2:1;
byte bit3:1;
byte bit4:1;
byte bit5:1;
byte bit6:1;
byte bit7:1;
}
union register16Bit
{
word sizeOfUnion16Bit; //groeÃe der union festlegen
struct
{
byte hiByte;
byte lowByte;
};
};
virtual void setBit(byte registerName, byte bitName) const = 0;
virtual void clearBit(byte registerName, byte bitName) const = 0;
virtual bool isBitSet(byte registerName, byte bitName) const = 0;
virtual bool isBitClear(byte registerName, byte bitName) const = 0;
virtual void setByte(byte registerName, byte bitName) const = 0;
virtual void clearByte(byte registerName, byte bitName) const = 0;
};
#endif