Softwareoptimierung

Hochoptimiertes Puzzle

9. Mai 2017, 13:56 Uhr | Matthias Bauer
© Bilder: Redlogix

Das Prinzip, Software aus wiederverwendbaren Komponenten zu entwickeln, hat sich in vielen Bereichen etabliert, beispielsweise für GUIs. Doch lässt sich dieses Prinzip auch problemlos in die Welt der Embedded-Systeme portieren?

Diesen Artikel anhören

Embedded-Anwendungen erfordern häufig extrem sparsamen Umgang mit den nur begrenzt verfügbaren Ressourcen. Software auf 8- bis 32-bit-Mikrocontrollern muss also meist hochoptimiert sein. Deshalb werden häufig teure Speziallösungen implementiert und Kompromisse hinsichtlich Wartbarkeit und Wiederverwendbarkeit der Software in Kauf genommen. Mit dem Konzept der Codegenerierung lässt sich hochoptimierte Embedded-Software hingegen aus vorgefertigten und generisch wiederverwendbaren Komponenten erstellen, so dass die Codequalität zunimmt und die Entwicklungskosten abnehmen.

Dieser Artikel betrachtet exemplarisch folgende Programmkomponente: eine Warteschlange, in der unterschiedlich große Nachrichten zwischengespeichert werden (z. B. für Kommunikationsstacks oder Intertask-Kommunikation). Typischerweise gibt es einen oder mehrere Datenproduzenten und genau einen Konsumenten. Die Warteschlange ist als Ringpuffer organisiert, so dass der Konsument jeweils den ältesten Eintrag liest (Bild 1). Um die Komponente flexibel nutzen zu können, soll sie folgendermaßen konfigurierbar sein:

Anbieter zum Thema

zu Matchmaker+
 Ringpuffer / Redlogix
Bild 1: Als Ringpuffer organisierte Warteschlange.
© Bilder: Redlogix

Ist der Pufferspeicher der Warteschlange voll, soll die Schreibmethode entweder die ältesten Daten löschen oder die Warteschlange so lange blockieren, bis der Konsument genügend Daten ausgelesen hat, so dass der erforderliche Platz für einen neuen Eintrag zur Verfügung steht.
Wird die Warteschlange so betrieben, dass mehrere Produzenten aus unterschiedlichen Ausführungskontexten Daten schreiben, sollen die Schreibzugriffe synchronisiert werden können.

Lösung 1: Fallunterscheidungen

Die geradlinigste Umsetzung der verschiedenen Varianten wäre, die Komponente mit sämtlichen Fähigkeiten auszustatten, um durch die richtigen Fallunterscheidungen zur Laufzeit das gewünschte Verhalten zu erreichen. Das Listing 1 zeigt beispielhaft Teile der Schreibmethode mit den relevanten Fallunterscheidungen (in C++-Syntax – die analoge Implementierung in C ist fast identisch): Wenn eine Mutex existiert, d. h. der Zeiger »mMutex« nicht »NULL« ist, dann werden beim Eintritt und Verlassen der kritischen Codeabschnitte die Methoden »lock« und »unlock« aufgerufen. Das unterschiedliche Verhalten, wenn die Warteschlange voll ist, wird durch die Membervariable »mBlockIfFull« bestimmt.

Listing 1
Listing 1: Code der Methode »write« mit Fallunterscheidungen.
© Redlogix

  1. Hochoptimiertes Puzzle
  2. Lösung 2: Dynamische Polymorphie
  3. Lösung 3: Codegenerator

Lesen Sie mehr zum Thema


Das könnte Sie auch interessieren

Jetzt kostenfreie Newsletter bestellen!

Weitere Artikel zu Componeers GmbH

Weitere Artikel zu Betriebssysteme