Fünf weitere Tipps zur Programmierung von Embedded-Software

Autor / Redakteur: Colin Walls * / Sebastian Gerstl

Im letzten Teil unserer Software-Tipp-Reihe gab Colin Walls praktische Erfahrungen in der Embedded-Software-Entwicklung weiter, unter anderem zu Null-Pointern oder Rekursivem Code. Hier folgen fünf weitere Hilfestellungen für Embedded-Programmierer.

Anbieter zum Thema

Welche Probleme macht die Anweisung malloc() in einem Echtzeitsystem? Wie gehen Sie richtig mit dem [ ] Operator in C um? Fünf weitere Tipps zur Embedded-Software-Entwicklung aus dem Erfahrungsschatz von Colin Walls.
Welche Probleme macht die Anweisung malloc() in einem Echtzeitsystem? Wie gehen Sie richtig mit dem [ ] Operator in C um? Fünf weitere Tipps zur Embedded-Software-Entwicklung aus dem Erfahrungsschatz von Colin Walls.
(Bild: gemeinfrei / CC0 )

Heute folgt ein weiterer Beitrag aus meiner sporadischen Reihe mit nützlichen Tipps für Entwickler von Embedded-Software. Ich habe einige gute Rückmeldungen zum letzten Beitrag erhalten und hoffe daher, dass diese Tipps ebenso brauchbar sind.

Benutzen Sie einen [ ] Operator mit einem Array, nicht mit einem Zeiger

In C/C++ wird auf ein Array folgendermaßen zugegriffen: x = myarray[3];

Zwei Dinge sind nicht sofort offensichtlich. Erstens ist ein Array-Name nur ein [konstanter] Zeiger. Zweitens sind [ ] nur Operatoren, die einfacher zu lesen sind als herkömmliche Zeiger-Notationen. Der obige Code könnte also folgendermaßen umgeschrieben werden: x = *(myarray + 3);

In ähnlicher Weise könnten die [ ] Operatoren mit einem normalen Zeiger [Variable] verwendet werden. Aus Gründen der Übersichtlichkeit ist es jedoch im Allgemeinen eine bewährte Praxis, [ ] mit Arrays und konventionelle Zeigeroperatoren mit Zeigern zu verwenden.

Erstellen Sie keinen benutzerdefinierten USB-Klassentreiber, wenn es sich vermeiden lässt

Wenn Sie ein Gerät mit einer USB-Schnittstelle entwerfen, verwenden Sie sehr wahrscheinlich einen kommerziellen USB-Stack – vielleicht von Ihrem RTOS-Anbieter. Der Teil des Stacks, der ein Gerät charakterisiert – definiert, um welche Art von Peripherie es sich handelt – ist der Klassentreiber.

Wenn Ihr Design vollständig benutzerdefiniert ist, könnten Sie versucht sein, dafür einen benutzerdefinierten Klassentreiber zu erstellen. Obwohl das eine Option ist, sollten Sie besser überlegen, ob Ihr Gerät einem Standardartikel ähnelt, so dass Sie einen handelsüblichen Klassentreiber einsetzten können. Abgesehen davon, dass Sie in diesem Stadium weniger Arbeit haben, befreit Sie die Verwendung eines Standard-Target-Klassentreibers von der Pflicht, einen Host-Treiber oder in Wirklichkeit mehrere Host-Treiber zu erstellen (für Windows, Mac, Linux usw.).

Wenn Sie eine leere while-Schleife in C benötigen, setzen Sie das Semikolon selbstständig auf die nächste Zeile

Manchmal ist es sinnvoll, eine leere while-Schleife zu haben, die ausgeführt wird, während man auf etwas wartet. Achten Sie beim Code-Layout darauf, dass die leere Anweisung [nur ein Semikolon] nicht „verloren“ geht:

while (!dataready() && !timeout())
    ; //wait for device

Nicht auf diese Weise:

while (!dataready() && !timeout()); //wait for device

Überlegen Sie genau, bevor Sie malloc() in einem Echtzeitsystem verwenden

Dynamischer Speicher ist in einem Echtzeitsystem eine Herausforderung. Dies hat zwei Hauptgründe: Standard-Implementierungen von malloc() sind nicht deterministisch (das heißt, die Ausführungszeit ist nicht vorhersehbar) und Allokationsfehler (möglicherweise als Folge von Heap-Fragmentierung) sind schwer zu bewältigen. Die meisten Echtzeitbetriebssysteme enthalten Funktionen zur Speicherzuweisung, die diese Probleme vermeiden.

Stellen Sie sicher, dass die Unterstützung der C++-Ausnahmebehandlung in Ihrem Compiler ausgeschaltet ist, wenn Sie EHS nicht verwenden

Die Ausnahmebehandlung ist eine sehr nützliche Funktion von C++. Sie bietet eine einfache Möglichkeit, um einen Mechanismus zu programmieren und mit unerwarteten (Fehler-) Situationen umzugehen, ohne auf sehr komplexe bedingte Blockstrukturen oder GOTOs zurückgreifen zu müssen. Allerdings ist die Ausnahmebehandlung mit einem Overhead verbunden: Es wird zusätzlicher Code für die Prüfung und das Routing einer Ausnahme hinzugefügt. Dieser Overhead mag akzeptabel sein und lässt sich minimieren, viele Entwickler wollen aber keinen Overhead. Also verzichten sie auf EHS. Manche Compiler schalten die Ausnahmebehandlung standardmäßig auf ON, so dass selbst wenn die Ausnahmebehandlung nicht verwendet wird, der Zusatzcode vorhanden ist. Stellen Sie sicher, dass Ihr Compiler keine EHS-Unterstützung benötigt, um ausgeschaltet zu werden.

Der Autor

Colin Walls, Embedded-Software-Technologist bei Mentor, a Siemens business.
Colin Walls, Embedded-Software-Technologist bei Mentor, a Siemens business.
(Bild: Caroline Mann)

* Colin Walls verfügt über fast 40 Jahre Erfahrung in der Elektronikindustrie, hauptsächlich im Bereich Embedded Software. Er ist Embedded-Software-Technologist bei Mentor, a Siemens business, mit Sitz in Großbritannien. Walls hält regelmäßig Vorträge auf Konferenzen und Seminaren. Zudem ist er Autor zahlreicher Fachartikel sowie zweier Bücher über Embedded Software und betreibt ein Blog auf http://blogs.mentor.com/colinwalls.

(ID:45211326)