Forum: Mikrocontroller und Digitale Elektronik Frage an die C++ Spezialisten


von Frank (Gast)


Lesenswert?

Hallo ihr alle,

für ein komplexes Embedded-System möchte ich mehrere Untersysteme 
bilden, die jeweils einer Klasse entspringen. Jedes System arbeitet z.B. 
im Zustand INIT ein eigenes Programm ab.

Class Untersystem
{
public:
   void statemachine (void);
private:
   enum state;
}

Untersystem Untersys0
Untersystem Untersys1
Untersystem Untersys2


Nun mein Problem:
Alle Unterprogramme haben den selben Rahmen, sie sind eine Statemachine 
mit den Zuständen BEGIN, STATE1, STATE2, END. Also möchte ich gerne eine 
Klasse machen, die für jedes Untersystem und jeden state instanziert 
wird.

Class SubProgram
{
public:
   void runMe (void);
private:
   enum SubState;
}

Im Idealfall möchte ich, dass in der Methode Untersys0.statemachine()
nur noch steht:
{
   SubSubProgram[state].runMe();
}

* Kann ich dazu in die Klasse SubProgram einfach
 SubProgram SubSubProgram[n] eintragen?
* Was passiert, wenn die Instanz [n] gar nicht existiert?
 Kann ich mich dagegen schützen?

Vielen Dank im Voraus,
Frank

von Peter (Gast)


Lesenswert?

if (! SubSubProgram[state] ) {
   SubSubProgram[state] = new ...
}

SubSubProgram[state].runMe();

von Gs S. (gs-scarnight)


Lesenswert?

Bei komplexen Zustandsmaschinen hilft das State-Machine-Pattern:

http://www.eventhelix.com/RealtimeMantra/HierarchicalStateMachine.htm

von Frank (Gast)


Lesenswert?

Danke, Peter!
Sehe ich es richtig, dass die Klasse so zur Laufzeit im RAM instanziert 
wird und nicht wie bei "Untersystem Untersys0" außerhalb von Funktionen 
im Flash?
Da in der erzeugten Klasse kein Code steckt sollte sie dann auch 
(fast)keinen Speicher benötigen, oder?

Viele Grüße,
Frank

von Frank (Gast)


Lesenswert?

Hat wirklich niemand von euch eine Antwort?
Als bisher reiner C'ler habe ich leider wirklich
schlechte Karten ohne Hilfe.
Gruß,
Frank

von Peter (Gast)


Lesenswert?

Hallo,
je mit new wird ein neues Object der Klasse anglegt, das object ist so 
gross wie die member Variablen der Klasse (wenn nicht noch virtuelle 
Funktionen vorhanden sind). Das object ist dann auf dem Heap.

Wenn die Klasse also 10 Methoden und eine Variable vom type int, dann 
wird mit new nur sizeof(int) belegt.
Die frage ist um Welches embeddet system es geht, für ein Atmel würde 
ich nicht c++ nehmen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Peter wrote:
> für ein Atmel würde
> ich nicht c++ nehmen.

Soll die Aussage auch nur irgendeinen Sinn haben? AVR32 können sehr gut 
in C++ programmiert werden.

von Peter (Gast)


Lesenswert?

> AVR32 können sehr...
Ja sollte sie, für mich sind Atmel die 8bit dinger (tiny/mega ..) und 
die programmiere ich immer noch gerne in ASM, C ist auch noch ok. Aber 
wenn ich "richtiges" C++ schreibe dann will ich auch z.b. die STL 
verwenden und der Code wird dann sehr schnell sehr gross.

von I_ H. (i_h)


Lesenswert?

Ohne dein Problem zu kennen wird es schwierig 'ne Aussage zu treffen, ob 
die Strukturierung dafür geeignet ist. Sieht mir auf den ersten Blick 
eher nicht so aus, als wäre das am Ende schön und elegant.

Was macht Untersystem::statemachine()? Macht das einen Durchlauf, sollen 
da mehrere Funktionen parallel laufen, ... ???

SubSubProgram soll wohl ein Array sein (könnte auch überladenes [] 
sein). Der Code von Peter funktioniert so sicher nicht, new gibt einen 
Zeiger zurück, also "->" statt ".".


Ist alles ziemlich unklar.

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.