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?
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:
            
                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.