www.mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (! SubSubProgram[state] ) {
   SubSubProgram[state] = new ...
}

SubSubProgram[state].runMe();

Autor: Gs Scarnight (gs-scarnight)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei komplexen Zustandsmaschinen hilft das State-Machine-Pattern:

http://www.eventhelix.com/RealtimeMantra/Hierarchi...

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.