Ein Angebot von

Fünf weitere Tipps zur Programmierung von Embedded-Software

| Autor / Redakteur: Colin Walls * / Sebastian Gerstl

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)

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.

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.

Fünf Tipps zur Programmierung von Embedded-Software

Fünf Tipps zur Programmierung von Embedded-Software

27.03.18 - Die meisten Softwareentwickler verfügen über eine Art von Ausbildung oder Training, andere sind eher Autodidakten. Aber das wirkliche Lernen in der Programmierung erfolgt durch praktische Erfahrung - und den Austausch von Wissen. Hier sind einige bewährte Tipps, die Autor Colin Walls in langjähriger Erfahrung gesammelt hat. lesen

Software-Tipp: C++ mit einem Echtzeitbetriebssystem verwenden

Software-Tipp: C++ mit einem Echtzeitbetriebssystem verwenden

13.03.18 - Bei Einsatz eines Echtzeitbetriebssystens in Embedded-Anwendungen kann die hohe Anzahl komplexer APIs, die zum Abrufen vieler RTOS-Funktionen nötig sind, unerfahrene Entwickler unter Einsatz von C abschrecken. Die Eigenschaften von C++ lassen sich hier aber gut nutzen, um auf einfache Weise zu sauberen und lesbaren Code zu kommen. lesen

Software-Tipp: Weitere Programmiertechniken zu C++ mit einem RTOS

Software-Tipp: Weitere Programmiertechniken zu C++ mit einem RTOS

20.03.18 - Im letzten C++ Tipp haben wir eine interessante Technik für Embedded-Anwendungen geschildert, die einen Embedded-Block mit einem lokalen Objekt verwendete, in dem der zugehörige Konstruktor und Destruktor auf neuartige Weise eingesetzt wurde. Dies kann sich aber auch drastisch auf das Verhalten eines Echtzeitsystems auswirken. Hier einige nähere Details. lesen

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.

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 45211326 / Implementierung)