Ich habe hier ein mit dem Arduino verbundenes IC. In dem gibt es
Register, die ich lesen und schreiben kann. Jedes dieser Register hat
eine Nummer (Adresse). Die Bits in den Registern haben natürlich jeweils
ihre Bedeutung.
Jetzt wollte ich das in C++ abbilden. Eine Klasse, die die
Gemeinsamkeiten aller Register darstellt. Dazu soll es
Funktionen/Methoden geben, um den Registerwert ins IC zu schreiben und
um ihn auszulesen. Denen will ich dann ein Objekt eines Erben dieser
Klasse übergeben.
Von dieser Klasse müssen also andere Klassen erben.
Die Registeradresse soll öffentlich nur lesbar sein, da ja für jedes
Register konstant. Sie ist bei jedem Erben anders.
Der Registerwert als Ganzes soll öffentlich les- und schreibbar sein.
Jeder Erbe soll zusätzlich noch Methoden bekommen, um einzelne Bits zu
lesen und/oder zu setzen. Diese Methoden sollen nach der Bedeutung der
Bits/Bitfelder im IC benannt sein. Sie lesen bzw. verändern erstmal den
im Objekt gespeicherten Registerwert. Sprich man gibt, wenn nötig, vor
deren Benutzung das Objekt an die Leseroutine und danach an die
Schreibroutine, die ja alle Erben der Registerklasse schlucken können
sollen. Diese Routinen sollen dann auf Registeradresse und Registerwert
des Objekts zugreifen, um damit ihre Arbeit zu verrichten.
Erstmal hat der C++ Compiler meine Versuche ohne Warnungen oder gar
Fehler geschluckt. Aber sobald ich ein Objekt eines Erben nur mal als
Ahnen ablegen wollte, ging das Gemeckere los, dass er mir den Operator=
gelöscht hätte, weil der ja doch nur Mist machen würde. Oder die Erben
hatten die Registeradresse des Vorfahren übernommen. Wild verteilte
"virtual" führten zu noch mehr Gemeckere beim Kompilieren.
1 | class AS5X47_Register {
|
2 | public:
|
3 | const uint16_t addr = 0x0042U;
|
4 | uint16_t raw = 0U;
|
5 | uint16_t get_raw_value() const;
|
6 | void set_raw_value(uint16_t val);
|
7 | AS5X47_Register();
|
8 | };
|
9 |
|
10 | class AS5X47_Prog : public AS5X47_Register {
|
11 | public:
|
12 | const uint16_t addr = 0x0003U;
|
13 | uint_fast8_t get_prog_ver() const;
|
14 | void set_prog_ver(uint_fast8_t val);
|
15 |
|
16 | uint_fast8_t get_prog_otp() const;
|
17 | void set_prog_otp(uint_fast8_t val);
|
18 | };
|
Kann mir von Euch jemand helfen, daraus gültigen und funktionierenden
C++ - Code zu machen ?