{"id":3074,"date":"2026-01-30T00:00:00","date_gmt":"2026-01-29T23:00:00","guid":{"rendered":"https:\/\/kunden.weissblaumedia.de\/microconsult\/2017\/03\/23\/rs-c-embeddedc\/"},"modified":"2026-06-17T13:17:47","modified_gmt":"2026-06-17T11:17:47","slug":"rs-c-embeddedc","status":"publish","type":"post","link":"https:\/\/www.microconsult.de\/en\/rs-c-embeddedc\/","title":{"rendered":"From C to Embedded-C: The goal determines the path"},"content":{"rendered":"<p><strong>Nat\u00fcrlich ist Embedded-C auch C. Der Umstieg von C auf Embedded-C bedeutet aber, dass der Programmierer sich beim Einsatz an den Erfordernissen der jeweiligen Embedded-Anwendung orientieren muss. Dies sind beispielsweise Echtzeitf\u00e4higkeit, geringer Speicherbedarf oder hohe Betriebssicherheit. Gleichzeitig stellt die Wiederverwendbarkeit von Software auch in der Embedded-Welt ein wichtiges Qualit\u00e4tsmerkmal dar. Die richtige Anwendung der C-Schl\u00fcsselw\u00f6rter spielt dabei eine bedeutende Rolle.<\/strong><\/p>\n<p><!--more--><\/p>\n<p>Wer ein Haus bauen m\u00f6chte, hat eine Vorstellung auf welchem Grund es gebaut wird, welche Fl\u00e4che oder Raumeinteilung es haben sollte und vieles mehr. Aus den Vorgaben entsteht mit Hilfe des Architekten der Bauplan. Und danach wird \u2013 in einer vorher festgelegten Reihenfolge der Gewerke \u2013 das Haus gebaut.<\/p>\n<p>Wer ein Embedded-System bestehend aus Hardware und Software entwickelt, braucht auch einen Plan. F\u00fcr die Hardware besteht an dieser Notwendigkeit kein Zweifel, aber wie sieht es mit der nicht sichtbaren oder greifbaren Software aus?<\/p>\n<p>Ja, auch das muss geplant werden. Ein Vorgehensmodell (Prozessmodell) legt fest, <strong>wer wann wof\u00fcr<\/strong> zust\u00e4ndig ist.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-119\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2017\/03\/softwaretest-v-modellXT-300x225.jpg\" alt=\"\" width=\"450\" height=\"338\" \/><\/p>\n<p><em>Bild 1: Das V-Modell wird im Umfeld von Embedded-Entwicklungen h\u00e4ufig als Vorgehensmodell eingesetzt. Der linke Schenkel zeigt von oben nach unten die Arbeitsschritte der Entwicklungsphase, der rechte Schenkel die verschiedenen Tests.<\/em><\/p>\n<p>Der Weg, den die Softwareentwickler von der Anforderungsanalyse \u00fcber Design und Implementierung bis hin zum Test gehen, wird durch die Aufgabenstellung vorgegeben. Und was hat das alles mit der Programmiersprache C oder Embedded-C zu tun?<\/p>\n<p>Nun, die Anforderungen m\u00fcssen vom Programmierer richtig umgesetzt werden, und dabei helfen unter anderem eine Reihe von C-Schl\u00fcsselw\u00f6rtern.<\/p>\n<p>Beginnen wir mit dem ersten Schritt, dem Festlegen der Anforderungen an die Software.<\/p>\n<h4>Anforderungen an die Software<\/h4>\n<p>In der Software-Analysephase m\u00fcssen die unterschiedlichen Anforderungen an die Software &#8211; die funktionalen und die nicht-funktionalen Qualit\u00e4tsmerkmale &#8211; festgelegt werden.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-120\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2017\/03\/sw-qualitaet-300x183.jpg\" alt=\"\" width=\"450\" height=\"275\" \/><\/p>\n<p><em>Bild 2: Tabelle der Software-Qualit\u00e4tsmerkmale nach ISO 9126<\/em><\/p>\n<p>Funktionale Anforderungen sind vergleichsweise einfach zu definieren: <strong>Was<\/strong> soll\/muss die Software leisten? Die Herausforderung sind bei Embedded-Systemen h\u00e4ufig die nicht-funktionalen Anforderungen. Sie beziehen sich oft auf die Randbedingungen (Vorschriften, Normen, Zeitvorgaben, etc.) eines Embedded-Systems.<\/p>\n<p>Ein Beispiel daf\u00fcr ist das Software-Qualit\u00e4tsmerkmal Effizienz. \u00dcber wie viel Programm- und Datenspeicher verf\u00fcgt das System? Muss bei der Programmierung \u201egespart\u201c werden, weil sehr wenig Speicher zur Verf\u00fcgung steht? Kann es Laufzeitprobleme geben, weil die Echtzeitanforderungen nur unter bestimmten Bedingungen einhaltbar sind? Stellen die Spannungsversorgung bzw. Stromaufnahme oder die W\u00e4rmeerzeugung ein Problem dar, das durch die Art der Programmierung beeinflusst werden kann oder muss?<\/p>\n<p>Wenn eine oder mehrere dieser Fragen mit JA beantwortet werden, dann <strong>muss<\/strong> das in den Anforderungen stehen. Der Programmierer setzt dann die Anforderungen mit geeigneten Ma\u00dfnahmen um, und der Tester muss sie testen.<\/p>\n<p>Diese Anpassungen an die spezifischen Erfordernisse der Systemoptimierung hat nicht nur Einfluss auf die Art der Programmierung sondern auch auf die Wiederverwendbarkeit der Software. Funktionsaufruf und -r\u00fcckkehr kosten zum Beispiel zus\u00e4tzlich Laufzeit, also gilt es, diese zu vermeiden. Darunter leidet die Modularisierung, die ihrerseits jedoch f\u00fcr gut wiederverwendbare Software wichtig ist.<\/p>\n<p>Auch die Zuordnung von Programmcode in den physikalisch vorhandenen Programmspeicher kann eine wichtige Rolle spielen. Verf\u00fcgt der Mikrocontroller \u00fcber Cache, muss schon im C-Quellcode daf\u00fcr gesorgt werden, dass im Linker\/Locator die Zuordnung der Funktionen zum cacheable und nicht-cacheable Speicher erfolgen kann. Gibt es unterschiedliche Zugriffszeiten auf verschiedene Arten von Programm- oder Datenspeicher, muss ebenfalls schon im C-Quellcode vorgesehen werden, dass im Linker\/Locator die Zuordnung richtig durchgef\u00fchrt werden kann.<\/p>\n<p>Hat eine CPU nichts zu tun, au\u00dfer zum Beispiel auf ein Ereignis zu warten, kann sie entweder in einer Warteschleife weiterarbeiten oder abgeschaltet werden. Nichtstun in einer Warteschleife kostet Strom, und Abschalten reduziert die Stromaufnahme erheblich, doch das Zuschalten kostet nat\u00fcrlich Zeit. Was ist wichtiger \u2013 Strom sparen oder die sehr schnelle Reaktion auf ein Ereignis? Die Antwort auf diese Frage hat bedeutende Auswirkungen darauf, wie die Software implementiert wird.<\/p>\n<p>Eine ebenfalls sehr wichtige Anforderung an viele Embedded-Systeme stellt die Betriebssicherheit (Safety) dar. Schauen wir uns als erstes an, was der Programmierer dazu beitragen kann.<\/p>\n<h4>Betriebssicherheit \u2013 Safety<\/h4>\n<p>Die Ma\u00dfnahmen, um eine komplexe Steuerung f\u00fcr sicherheitskritische Aufgaben ausreichend betriebssicher zu machen, sind sehr umfangreich und betreffen das Konzept (Anforderungsanalyse, Design) sowie den gesamten Entwicklungs- und Testprozess.<\/p>\n<p>Die Programmiersprache C l\u00e4sst unterschiedliche Syntaxformen zu. Schl\u00fcsselw\u00f6rter k\u00f6nnen zum Teil ganz weggelassen werden, Datentypen sind nicht typsicher, Variable und Zeiger m\u00fcssen vor ihrer Nutzung nicht initialisiert werden. All das kann zu Missverst\u00e4ndnissen, Fehlinterpretation oder sogar schwerwiegenden Fehlern f\u00fchren (beispielsweise nicht initialisierte Zeiger). Eines von vielen Beispielen daf\u00fcr ist die Nutzung eines booleschen Ausdrucks in verschiedenen C-Kontrollstrukturen (if, while, \u2026).<\/p>\n<pre>int32_t i = 5;\r\n\r\nstatic int32_t a;\u00a0\u00a0 \/\/ Variable a ist nicht initialisiert\r\n\r\n\r\n\r\n\r\nif (a = i)\r\n\r\n{\r\n\r\na = STARTVALUE;\r\n\r\n}<\/pre>\n<p><em>Bild 3: Die if-Anweisung pr\u00fcft einen booleschen Ausdruck auf TRUE oder FALSE, hier wird aber eine Zuweisung (Variable <\/em><em>a<\/em><em> wird mit dem Inhalt von Variable <\/em><em>i<\/em><em> beschrieben) ausgef\u00fchrt und anschlie\u00dfend das Ergebnis der Zuweisung (ein ganzzahliger 32-Bit Wert) auf TRUE\/FALSE gepr\u00fcft; au\u00dferdem fehlt hier der <\/em><em>else<\/em><em>-Zweig.<\/em><\/p>\n<p>Solche unsicheren Syntaxformen sind unbedingt zu vermeiden, da sie leicht zu Folgefehlern f\u00fchren k\u00f6nnen. Hier empfiehlt sich der Einsatz von Programmierregeln. Fertige Programmier-Regelwerke f\u00fcr C-Programmierer gibt es zum Beispiel in Form der MISRA<sup>[1]<\/sup> C-Regeln.<\/p>\n<p>Bekannterma\u00dfen sind Regeln jedoch nur gut, wenn sie auch eingehalten werden. Deshalb ist die Einhaltung der Programmierregeln zu \u00fcberwachen, z.B. durch unterschiedliche Arten von Tests. Eine M\u00f6glichkeit sind Reviews, eine andere, sehr effiziente (und unbestechliche), sind statische Testtools, wie sie von verschiedenen Toolherstellern angeboten werden. Teilweise sind sie schon in den C-Compiler integriert.<\/p>\n<p>Die Anwendung von Regelwerken, Standards und Normen hilft auf der einen Seite, qualitativ bessere Softwaresysteme zu bauen, f\u00fchrt aber andererseits zu einem Mehraufwand in allen Entwicklungsphasen und Beeintr\u00e4chtigungen der Effizienz. Das f\u00fchrt uns zur Frage, wie bedeutend das Software-Qualit\u00e4tsmerkmal Effizienz tats\u00e4chlich ist.<\/p>\n<h4>Effizienz<\/h4>\n<p>Die Embedded-C-Compiler oder der dazugeh\u00f6rige C-Pr\u00e4prozessor verf\u00fcgen \u00fcber besondere Schl\u00fcsselw\u00f6rter (zum Beispiel __attributes__ bzw. #pragma), um die gezielte Zuordnung zu bestimmten Adressbereichen durch den Linker\/Locator zu unterst\u00fctzen.<\/p>\n<p>Mit dem Compiler-Schl\u00fcsselwort inline k\u00f6nnen C-Funktionen wie Makros direkt an der Aufrufstelle eingef\u00fcgt werden. Bei sehr kleinen Funktionen mit wenigen Assemblerbefehlen kann das viel Laufzeit sparen, kostet bei h\u00e4ufigen Aufrufen aber auch mehr Speicherplatz.<\/p>\n<p>Ein weiteres Problem stellt bei vielen Mikrocontrollern die Nutzung von Floating-Point-Arithmetik dar, weil die einfache ALU (arithmetisch-logische Einheit der CPU) keine geeignete Logik f\u00fcr die schnelle Abarbeitung von Floating-Point-Operationen bietet. Die Verwendung von C-Bibliotheksfunktionen kostet sehr viel Laufzeit. Hat ein Mikrocontroller eine Floating-Point-Unit FPU in Hardware implementiert, beherrscht diese oft nur einfache Genauigkeit. In diesem Fall sollten alle Operationen nur in einfacher Genauigkeit ausgef\u00fchrt werden, damit die Hardware-FPU auch genutzt wird. Diese Einschr\u00e4nkungen m\u00fcssen f\u00fcr Floating-Point-Variable, Floating-Point-Konstanten und Floating-Point-Berechnungen angegeben werden.<\/p>\n<p>Neben dem Steuerparameter des Compilers f\u00fcr das Abschalten der Berechnungen mit doppelter Genauigkeit gibt es in der Programmiersprache C auch noch die M\u00f6glichkeit, Floating-Point-Konstanten (standardm\u00e4\u00dfig doppelte Genauigkeit) mit dem Buchstaben f f\u00fcr float (einfache Genauigkeit) zu kennzeichnen.<\/p>\n<pre>\/\/ Single-Precision Floating Point\r\n\r\nstatic float f = 2.3f;\r\n\r\n\r\n\r\n\r\nf = f + 1.2f;<\/pre>\n<p><em>Bild 4: Beispielcode f\u00fcr die Kennzeichnung von Floating-Point-Konstanten in C<\/em><\/p>\n<p>Aber nicht nur der Programmierer kann etwas zur Effizienz beitragen. Moderne C-Compiler optimieren den zu erzeugenden Maschinencode. Typisch gibt es mehrere Optimierungsstufen (-O0\/-O1\/-O2\/-O3), die vom Zusammenfassen von Konstanten-Ausdr\u00fccken bis hin zum Umstellen der Assembler-Befehlsreihenfolge unterschiedliche Stufen von Code-Optimierung durchf\u00fchren. Viele Embedded-C-Compiler bieten dar\u00fcber hinaus Speed- und Size-Optimierung an. Wie gut C-Compiler wirklich optimieren, h\u00e4ngt allerdings ma\u00dfgeblich vom Compiler-Hersteller ab.<\/p>\n<p>C-Compiler versuchen unter anderem auch, Zugriffe auf Speicherzellen oder Steuer-\/Status-\/ Arbeitsregister von Peripheriemodulen zu optimieren.<\/p>\n<p><strong>Ein Beispiel: <\/strong><\/p>\n<p>Der Mikrocontroller enth\u00e4lt eine serielle Schnittstelle. In einer Software-Warteschleife soll gewartet werden, bis \u00fcber diese serielle Schnittstelle ein Zeichen vollst\u00e4ndig empfangen wurde. Der C-Compiler \u00fcbersetzt diese Warteschleife in der Regel als folgende Befehlsfolge:<\/p>\n<ol>\n<li>Lies einmal das Statusregister der seriellen Schnittstelle in ein CPU-Arbeitsregister ein.<\/li>\n<li>Frage im Arbeitsregister der CPU, ob sich das entsprechende Statusbit ver\u00e4ndert.<\/li>\n<\/ol>\n<p>Das Statusbit \u00e4ndert sich allerdings nur im Statusregister, nicht aber im CPU-Arbeitsregister. Die Schleife wird aufgrund der Compiler-Optimierung zu einer unendlichen Warteschleife.<\/p>\n<p>Abhilfe schafft hier das C-Schl\u00fcsselwort volatile. Es sorgt daf\u00fcr, dass immer die Original-Speicherzelle gelesen\/beschrieben wird. Sobald sich das Statusbit \u00e4ndert, wird der ver\u00e4nderte Wert im Arbeitsregister der CPU zu sehen sein. Die Schleife wird verlassen.<\/p>\n<pre>static volatile int32_t status = STARTVALUE;\r\n\r\n\r\n\r\n\r\nvoid waitForEvent(void)\r\n\r\n{\r\n\r\nwhile (status == STARTVALUE)\u00a0\u00a0\u00a0 \/\/ wait for status change\r\n\r\n;\r\n\r\n}<\/pre>\n<p><em>Bild 5: Die Variable status wird asynchron, zum Beispiel in einer Interrupt-Service-Routine, ver\u00e4ndert und muss deshalb volatile sein. So ist sichergestellt, dass bei jedem Durchlauf der Warteschleife die Originalspeicherzelle gelesen wird.<\/em><\/p>\n<p>Mithilfe eines weiteren C-Schl\u00fcsselwortes, n\u00e4mlich inline (das im \u00dcbrigen von C++ \u00fcbernommen wurde), kann der C-Programmierer einen Beitrag zur Code- und\/oder Laufzeit-Optimierung leisten. Bei C-Funktionen mit kompaktem Code kann inline zu wesentlichen Laufzeitverk\u00fcrzungen f\u00fchren. Der Compiler f\u00fcgt dann an der Aufrufstelle der Funktion direkt den kompletten Funktionscode ein. Das geht nat\u00fcrlich nur, wenn der Compiler den C-Quellcode kennt. Deshalb m\u00fcssen inline-Funktionen im Headerfile implementiert und als inline gekennzeichnet werden. Allerdings h\u00e4ngt die Umsetzung des Schl\u00fcsselwortes inline von der Compiler-Optimierung ab. Infolgedessen hat es der Programmierer wieder nicht selbst in der Hand, wie optimiert wird.<\/p>\n<p>Viele Compiler-Hersteller haben das Problem erkannt und mittlerweile Abhilfe geschaffen. Sie bieten zus\u00e4tzliche Optimierungseinstellungen (zum Beispiel in Form von Pragma-Direktiven) an, mit deren Hilfe der Compiler gezwungen wird, inline-Funktionen unabh\u00e4ngig von der eingestellten Optimierung immer als solche zu \u00fcbersetzen.<\/p>\n<p>inline-Funktionen k\u00f6nnen auch als C-Makros programmiert werden. Der Vorteil besteht darin, dass sich der Aufruf der Funktionen nicht vom Aufruf \u201erichtiger\u201c Funktionen unterscheidet. Deshalb kann jederzeit ohne gro\u00dfen Aufwand zwischen inline und nicht-inline umgestellt werden.<\/p>\n<p>Aber Vorsicht! Das Debuggen \u00e4ndert sich durch inline-Funktionen. Es gibt keinen Breakpoint in der Funktion, da der Funktionsk\u00f6rper ja nicht mehr nur an einer Stelle, sondern an vielen Stellen existiert. Der Breakpoint muss demnach an der Aufrufstelle gesetzt werden.<\/p>\n<pre><strong>#ifndef<\/strong> TESTEMBC_H_\r\n\r\n<strong>#define<\/strong> TESTEMBC_H_\r\n\r\n\r\n\r\n\r\n<strong>#include<\/strong> &lt;stdint.h&gt;\r\n\r\n\r\n\r\n\r\n<strong>typedef<\/strong> <strong>struct<\/strong>\r\n\r\n{\r\n\r\nuint32_t state;\r\n\r\n} STATE_t;\r\n\r\n\r\n\r\n\r\n<strong>inline<\/strong> <strong>void<\/strong> <strong>setState<\/strong>(STATE_t* <strong>const<\/strong> pSTATE_t, uint32_t value)\r\n\r\n{\r\n\r\n<strong>if<\/strong> (value &gt; 0 &amp;&amp; value &lt;= 100)\r\n\r\n{\r\n\r\npSTATE_t-&gt;state = value;\r\n\r\n}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n<strong>inline<\/strong> int32_t <strong>getState<\/strong>(<strong>const<\/strong> STATE_t* <strong>const<\/strong> pSTATE_t)\r\n\r\n{\r\n\r\n<strong>return<\/strong> pSTATE_t-&gt;state;\r\n\r\n}\r\n\r\n\r\n\r\n\r\n<strong>#endif<\/strong> \/* TESTEMBC_H_ *\/<\/pre>\n<p><em>Bild 6: Einfache Schreiboperationen wie <\/em><em>setState()<\/em><em> oder Leseoperationen wie <\/em><em>getState()<\/em><em> bieten sich<\/em> <em>als<\/em> <em>inline<\/em><em>&#8211;<\/em><em>Funktionen an.<\/em><\/p>\n<pre><strong>#include<\/strong> \"TestEmbC.h\"\r\n\r\n\r\n\r\n\r\n<strong>int<\/strong> <strong>main<\/strong>(void)\r\n\r\n{\r\n\r\nuint32_t temp;\r\n\r\n<strong>static<\/strong> STATE_t locObj;\r\n\r\nsetState(&amp;locObj, 20);\r\n\r\ntemp = getState(&amp;locObj);\r\n\r\n\r\n\r\n\r\n<strong>return<\/strong> temp;\r\n\r\n}<\/pre>\n<p><em>Bild 7: inline-Funktionen werden wie \u201enormale\u201c Funktionen aufgerufen; nur am \u00fcbersetzten Code ist erkennbar, ob es sich um inline-Funktionen handelt.<\/em><\/p>\n<h4>Sichtbarkeit und G\u00fcltigkeit von Variablen<\/h4>\n<p>C-Programmierer neigen dazu, viele \u2013 oder alle \u2013 Variable als globale Variable anzulegen. So sind sie f\u00fcr alle Funktionen von au\u00dfen sichtbar. Verf\u00fcgt ein Softwaresystem \u00fcber viele solcher globalen Variablen, stellt jede \u00c4nderung oder Erweiterung ein Risiko dar. Es ist bei komplexer Software schwer zu durchschauen, wer wann und warum auf welche Variable lesend oder schreibend zugreift. Der einzelne Entwickler verliert dabei den \u00dcberblick, da er selten alle Systemzusammenh\u00e4nge kennt.<\/p>\n<p>Deshalb muss der Programmierer sorgf\u00e4ltig bedenken, was global sein muss bzw. lokal bleiben sollte. Die Programmiersprache C stellt daf\u00fcr das Schl\u00fcsselwort static zur Verf\u00fcgung. Damit k\u00f6nnen Variable von \u201ef\u00fcr jeden sichtbar\u201c auf \u201enur im Modul sichtbar\u201c eingeschr\u00e4nkt werden, oder lokale Variable innerhalb von Funktionen k\u00f6nnen von dynamisch auf statisch umgestellt werden.<\/p>\n<p>Dynamisch bedeutet, dass die Variable im Stack (oder einem Arbeitsregister der CPU) abgelegt wird und bei Beenden des Blocks wieder freigegeben wird. Statisch bedeutet, dass die Variable eine feste RAM-Adresse bekommt und die Speicherzelle \u00fcber das Blockende hinaus belegt bleibt.<\/p>\n<p>Lokale statische Variable haben Vor- und Nachteile. Der Vorteil ist, dass der Inhalt erhalten bleibt und beim n\u00e4chsten Eintritt in den Block wiederverwendet werden kann. Der Nachteil ist, dass RAM-Speicher belegt wird (und bleibt), auch wenn auf den Inhalt nicht zugegriffen werden kann.<\/p>\n<pre>int32_t globalVar = STARTVALUE;\u00a0 \/\/ Application-global visibility,\r\n \/\/ global validity\r\n\r\nstatic int32_t localVar = 0;\u00a0\u00a0\u00a0\u00a0 \/\/ Module-local visibility,\r\n\r\n\/\/ global validity\r\n\r\n\r\n\r\n\r\nint main(void)\r\n\r\n{\r\n\r\nint32_t i;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Function-local visibility, local validity\r\n\r\nstatic int32_t a;\u00a0\u00a0 \/\/ Function-local visibility, global validity\r\n\r\n\r\n\r\n\r\nreturn 0;\r\n\r\n}<\/pre>\n<p><em>Bild 8: Globale und lokale Variable k\u00f6nnen mit <\/em><em>static<\/em><em> deklariert werden, um die Sichtbarkeit und G\u00fcltigkeit zu ver\u00e4ndern.<\/em><\/p>\n<p>Auch Variable, die von mehreren Funktionen genutzt werden, k\u00f6nnen lokal bleiben, wenn die Funktionen, die auf sie zugreifen, in dasselbe Modul gepackt werden. Falls das nicht m\u00f6glich ist, muss \u00fcber globale Variable (oder \u00fcber Zeiger) nachgedacht werden.<\/p>\n<p>Eine Programmierregel sollte festlegen, dass globale Variable gut dokumentiert werden m\u00fcssen:<\/p>\n<ul>\n<li>Welchen Zweck hat die Variable, und wer stellt sie zur Verf\u00fcgung?<\/li>\n<li>Gibt es Einschr\u00e4nkungen (z.B. Wertebereich, etc.)?<\/li>\n<li>Wer darf nur lesend, wer nur schreibend oder wer lesend und schreibend zugreifen?<\/li>\n<\/ul>\n<p>Wenn der Aufwand f\u00fcr die Dokumentation hoch ist, wird der Programmierer gerne auf die \u00fcbertriebene Nutzung verzichten.<\/p>\n<p>Auch C-Funktionen k\u00f6nnen static, also modul-lokal sein. Sie lassen sich dann nur innerhalb eines Moduls aufrufen. Dies sollte f\u00fcr reine Hilfsfunktionen festgelegt werden, die nicht von au\u00dferhalb des Moduls genutzt werden. W\u00e4ren sie global, verf\u00fchrt das den einen oder anderen Programmierer dazu, sie doch zu nutzen. \u00c4nderungen an diesen Funktionen k\u00f6nnen jedoch schwer absehbare Auswirkungen auf das System nach sich ziehen.<\/p>\n<p>Das f\u00fchrt uns zum Aspekt der \u00c4nderbarkeit. Er tritt h\u00e4ufig gepaart mit Wiederverwendbarkeit und Anpassbarkeit auf, weil diese Software-Qualit\u00e4tsmerkmale oft durch die gleichen Ma\u00dfnahmen bei der Programmierung angestrebt werden.<\/p>\n<h4>Wiederverwendbarkeit, Anpassbarkeit, \u00c4nderbarkeit<\/h4>\n<p>In der heutigen schnelllebigen Zeit gilt auch f\u00fcr Software: F\u00fcr die Erstellung steht sehr begrenzt Zeit zur Verf\u00fcgung, f\u00fcr \u00c4nderungen und Erg\u00e4nzungen noch weniger. Also sind gute Wiederverwendbarkeit sowie leichte Anpassbarkeit und \u00c4nderbarkeit ein MUSS, um im Wettbewerb bestehen zu k\u00f6nnen.<\/p>\n<p>Allerdings kostet Wiederverwendbarkeit Speicherplatz und Laufzeit. Bei modernen 32-Bit-Multicore-Mikrocontrollern steht relativ viel Speicherplatz und Rechenleistung zur Verf\u00fcgung, bei 8-Bit-Singlecore-Mikrocontrollern ist beides nur sehr begrenzt verf\u00fcgbar.<\/p>\n<p>F\u00fcr gute Wiederverwendbarkeit und Erweiterbarkeit eignet sich der objektorientierte Ansatz sehr gut. Aber wir sprechen hier \u00fcber prozedurale Programmierung in C, nicht \u00fcber objektorientiert und C++.<\/p>\n<p>Die L\u00f6sung k\u00f6nnte lauten: Wir kombinieren prozedurale und objektorientierte Ans\u00e4tze und arbeiten objektbasiert. Das hei\u00dft praktisch, dass Strukturen und Zeiger in den Vordergrund r\u00fccken. Dabei werden mehrere Variable, auch unterschiedlichen Typs, die einen logischen Zusammenhang haben, zu einer Struktur zusammengefasst. Der Zugriff erfolgt ausschlie\u00dflich \u00fcber daf\u00fcr zur Verf\u00fcgung gestellte Funktionen. Und diese wiederum verwenden Zeiger, um auf die im Speicher erzeugten Objekte zuzugreifen.<\/p>\n<pre><strong>typedef<\/strong> <strong>struct<\/strong> stm\r\n\r\n{\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> CLC;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Clock Control Register\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> RESERVED0;\u00a0 \/\/ reserved (0x04)\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> ID;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ ASCLIN Identification Register\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> RESERVED1;\u00a0 \/\/ reserved (0x0C)\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM0; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[31:0]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM1; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[35:4]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM2; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[39:8]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM3; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[43:12]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM4; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[47:16]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM5; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[51:20]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM6; \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[63:32]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> CAP; \u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ STM[63:32]\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> CMP0;\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ Compare Register 0\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> CMP1;\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ Compare Register 1\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> CMCON; \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\/\/ Compare Match Control Register\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> ICR_;\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 \/\/ Flags Clear Register\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> ISCR;\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 \/\/ Flags Enable Register\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> RESERVED2[3];\u00a0 \/\/ reserved (0x44 - 0x4C)\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> TIM0SV;\u00a0\u00a0\u00a0\u00a0 \/\/ Timer 0 Register Second View\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> CAPSV;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Capture Register Second View\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> RESERVED3[2];\u00a0\u00a0 \/\/ reserved (0x58, 0x5C)\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> RESERVED4[9*4]; \/\/ reserved (0x60 ... 0xD0)\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> RESERVED5[2];\u00a0\u00a0 \/\/ reserved (0xE0, 0xE4)\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> OCS;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ OCDS Control and Status Register\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> KRSTCLR;\u00a0\u00a0\u00a0 \/\/ Reset Status Clear Register 12\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> KRST1;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Kernel Reset Control Register 1\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> KRST0;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Kernel Reset Control Register 0\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> ACCEN1;\u00a0\u00a0\u00a0\u00a0 \/\/ ASCLIN Access Enable Register 1\r\n\r\n<strong>volatile<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> ACCEN0;\u00a0\u00a0\u00a0\u00a0 \/\/ ASCLIN Access Enable Register 0\r\n\r\n} STM_t;<\/pre>\n<p><em>Bild 9: Definition einer Struktur f\u00fcr die Register des System Timers (STM) des Infineon 32-Bit-Multicore-Mikrocontrollers AURIX TC277<\/em><\/p>\n<p>Gibt es mehrere Peripheriemodule vom gleichen Typ, muss hier nur die Anfangsadresse des jeweiligen Moduls in einem Zeiger vom Typ der Struktur verwendet werden, um auf alle Register eines Moduls zugreifen zu k\u00f6nnen. Die Struktur l\u00e4sst sich ohne \u00c4nderung f\u00fcr weitere Module dieses Typs wiederverwenden. Wenn es eine neue Bausteinvariante gibt, kann die Struktur h\u00e4ufig ebenfalls ohne \u00c4nderung, unter Umst\u00e4nden mit nur kleinen Anpassungen, wiederverwendet werden.<\/p>\n<pre><strong>void<\/strong> <strong>stmInit<\/strong>(STM_t* <strong>const<\/strong> pSTM, <strong>const<\/strong> STMInitStruct_t* <strong>const<\/strong> pInit)\r\n\r\n{\r\n\r\npSTM-&gt;CMP0\u00a0\u00a0 = pInit-&gt;compVal0;\r\n\r\npSTM-&gt;CMP1\u00a0\u00a0 = pInit-&gt;compVal1;\r\n\r\npSTM-&gt;CMCON\u00a0 = pInit-&gt;cmcon0 | pInit-&gt;cmcon1;\r\n\r\npSTM-&gt;ICR_\u00a0\u00a0 = pInit-&gt;cmp0Icr | pInit-&gt;cmp1Icr;\r\n\r\n\r\n\r\n\r\n<strong>if<\/strong>(pInit-&gt;isr0 != 0)\r\n\r\n{\r\n\r\nSRC_STM0SR0 = pInit-&gt;isr0;\r\n\r\n}\r\n\r\n\r\n\r\n\r\n<strong>if<\/strong>(pInit-&gt;isr1 != 0)\r\n\r\n{\r\n\r\nSRC_STM0SR1 = pInit-&gt;isr1;\r\n\r\n}\r\n\r\n}<\/pre>\n<p><em>Bild 10: Initialisierungsfunktion f\u00fcr den im Headerfile definierten Datentyp STM_t<\/em><\/p>\n<p>Die Zugriffsfunktionen haben als \u00dcbergabeparameter konstante Zeiger vom Typ der Struktur. F\u00fcr die Initialisierung gibt es zus\u00e4tzlich eine Struktur, die die Initialisierungswerte enth\u00e4lt. So kann eine Initialisierungsfunktion f\u00fcr unterschiedliche Betriebsarten genutzt werden.<\/p>\n<p>Bei den f\u00fcr die Parameter\u00fcbergabe genutzten Zeigern ist das C-Schl\u00fcsselwort const sehr wichtig. Der Zeiger auf die Register-Struktur soll nicht ver\u00e4ndert werden k\u00f6nnen \u2013 auch nicht unbeabsichtigt. Deshalb sollte er selbst immer konstant (also read-only) sein. Der Quellspeicher selbst, aus dem die Initialisierungswerte gelesen werden, sollte ebenfalls als konstant (read-only) gekennzeichnet werden. So kann der Compiler sicherstellen, dass dort, wo nur gelesen werden darf, auch wirklich nur gelesen wird. Ohne das Schl\u00fcsselwort const f\u00fchrt ein versehentlich eingebauter schreibender Zugriff oder eine Zeigerver\u00e4nderung unter Umst\u00e4nden zu aufw\u00e4ndiger Fehlersuche.<\/p>\n<h4>Fazit<\/h4>\n<p>Das Ziel bestimmt den Weg! Das richtig funktionierende (sichere) Embedded-System ist das Ziel. Der Weg dahin muss geplant werden, und wer auf dem richtigen Weg bleibt, erreicht sein geplantes Ziel einfacher und schneller. Embedded-Systeme unterscheiden sich voneinander und von klassischen IT-Systemen durch ihre speziellen Qualit\u00e4tsmerkmale. Standards, Normen und insbesondere die nichtfunktionalen Anforderungen stellen f\u00fcr den Embedded-C-Programmierer eine besondere Herausforderung dar. Wer ihnen gewachsen sein will, sollte die richtige Anwendung der C-Schl\u00fcsselw\u00f6rter, die passenden Optimierungseinstellungen und die korrekte Compilersteuerung beherrschen.<\/p>\n<p>Vor der Implementierung ist eine sorgf\u00e4ltige Planung auf Basis der Anforderungen und im Sinne einer \u00e4nderungsfreundlichen Software-Architektur empfehlenswert. Nachtr\u00e4gliche \u00c4nderungen und Erweiterungen d\u00fcrfen keine Gefahr f\u00fcr das Gesamtsystem darstellen. Programmierregeln sind sinnvolle Hilfen bei der Erstellung von Quellcode; ihre Einhaltung muss strikt gefordert und nat\u00fcrlich auch \u00fcberpr\u00fcft werden.<\/p>\n<p>Wenn der Tester schlie\u00dflich die geforderte Qualit\u00e4t des Systems ohne gro\u00dfen Aufwand f\u00fcr Korrekturen und weitere Tests best\u00e4tigen kann, hat sich der Mehraufwand im Vorfeld mehrfach bezahlt gemacht.<\/p>\n<h4>Literatur<\/h4>\n<p>[1] MISRA C ist ein Programmierstandard aus der Automobilindustrie f\u00fcr die Sprache C<br \/>\n<strong><a href=\"https:\/\/www.misra.org.uk\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.misra.org.uk\/<\/a><\/strong><\/p>\n<h4>Mehr Information<\/h4>\n<p><a href=\"https:\/\/www.microconsult.de\/trainings-beratung\/trainings\/embedded-und-echtzeit-programmierung\/AAAAJYK\" target=\"_blank\" rel=\"noopener\"><strong>MicroConsult Training &amp; Coaching zu Embedded- und Echtzeitprogrammierung<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/www.microconsult.de\/embedded-und-echtzeit-softwareentwicklung\/\" target=\"_blank\" rel=\"noopener\"><strong>MicroConsult Fachwissen Embedded- und Echtzeit-Softwareentwicklung<\/strong><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nat\u00fcrlich ist Embedded-C auch C. Der Umstieg von C auf Embedded-C bedeutet aber, dass der Programmierer sich beim Einsatz an den Erfordernissen der jeweiligen Embedded-Anwendung orientieren muss. Dies sind beispielsweise Echtzeitf\u00e4higkeit, geringer Speicherbedarf oder hohe Betriebssicherheit. Gleichzeitig stellt die Wiederverwendbarkeit von Software auch in der Embedded-Welt ein wichtiges Qualit\u00e4tsmerkmal dar. Die richtige Anwendung der C-Schl\u00fcsselw\u00f6rter [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":3075,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[9,15],"tags":[32,33,34,35,36,37,38,39,40,41],"class_list":["post-3074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-embedded_und_echtzeit-softwareentwicklung","category-softwareentwicklung_windows_linux_mobile","tag-c-schluesselwoerter","tag-embedded-c","tag-embedded-entwicklung","tag-embedded-programmierung","tag-embedded-softwareentwicklung","tag-programmierregeln","tag-programmiersprache-c","tag-software-qualitaetsmerkmale","tag-umstieg-embedded-c","tag-v-modell"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Von C nach Embedded-C: Das Ziel bestimmt den Weg - MicroConsult Academy GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microconsult.de\/en\/rs-c-embeddedc\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Von C nach Embedded-C: Das Ziel bestimmt den Weg - MicroConsult Academy GmbH\" \/>\n<meta property=\"og:description\" content=\"Nat\u00fcrlich ist Embedded-C auch C. Der Umstieg von C auf Embedded-C bedeutet aber, dass der Programmierer sich beim Einsatz an den Erfordernissen der jeweiligen Embedded-Anwendung orientieren muss. Dies sind beispielsweise Echtzeitf\u00e4higkeit, geringer Speicherbedarf oder hohe Betriebssicherheit. Gleichzeitig stellt die Wiederverwendbarkeit von Software auch in der Embedded-Welt ein wichtiges Qualit\u00e4tsmerkmal dar. Die richtige Anwendung der C-Schl\u00fcsselw\u00f6rter [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microconsult.de\/en\/rs-c-embeddedc\/\" \/>\n<meta property=\"og:site_name\" content=\"MicroConsult Academy GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-29T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-17T11:17:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Fotolia_139863849_M.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1378\" \/>\n\t<meta property=\"og:image:height\" content=\"1378\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Renate Schultes\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Renate Schultes\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/\"},\"author\":{\"name\":\"Renate Schultes\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/89c1748f96b6c21197360a857fa79c5a\"},\"headline\":\"Von C nach Embedded-C: Das Ziel bestimmt den Weg\",\"datePublished\":\"2026-01-29T23:00:00+00:00\",\"dateModified\":\"2026-06-17T11:17:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/\"},\"wordCount\":2718,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Fotolia_139863849_M.jpg\",\"keywords\":[\"C-Schl\u00fcsselw\u00f6rter\",\"Embedded-C\",\"Embedded-Entwicklung\",\"Embedded-Programmierung\",\"Embedded-Softwareentwicklung\",\"Programmierregeln\",\"Programmiersprache C++\",\"Software-Qualit\u00e4tsmerkmale\",\"Umstieg Embedded-C\",\"V-Modell\"],\"articleSection\":[\"Embedded- und Echtzeit-Softwareentwicklung\",\"Softwareentwicklung (Windows, Linux)\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/\",\"name\":\"Von C nach Embedded-C: Das Ziel bestimmt den Weg - MicroConsult Academy GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Fotolia_139863849_M.jpg\",\"datePublished\":\"2026-01-29T23:00:00+00:00\",\"dateModified\":\"2026-06-17T11:17:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/89c1748f96b6c21197360a857fa79c5a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Fotolia_139863849_M.jpg\",\"contentUrl\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Fotolia_139863849_M.jpg\",\"width\":1378,\"height\":1378},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/rs-c-embeddedc\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.microconsult.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Von C nach Embedded-C: Das Ziel bestimmt den Weg\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/\",\"name\":\"MicroConsult Academy GmbH\",\"description\":\"Professionelle Schulungen, Beratung und Projektunterst\u00fctzung\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.microconsult.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/89c1748f96b6c21197360a857fa79c5a\",\"name\":\"Renate Schultes\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d82a4cfd395ce164dcf90fd5ee5f4eaf9bb9761c3283213fb2ce891033c5c771?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d82a4cfd395ce164dcf90fd5ee5f4eaf9bb9761c3283213fb2ce891033c5c771?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d82a4cfd395ce164dcf90fd5ee5f4eaf9bb9761c3283213fb2ce891033c5c771?s=96&d=mm&r=g\",\"caption\":\"Renate Schultes\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"From C to Embedded-C: The goal determines the path - MicroConsult Academy GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microconsult.de\/en\/rs-c-embeddedc\/","og_locale":"en_GB","og_type":"article","og_title":"Von C nach Embedded-C: Das Ziel bestimmt den Weg - MicroConsult Academy GmbH","og_description":"Nat\u00fcrlich ist Embedded-C auch C. Der Umstieg von C auf Embedded-C bedeutet aber, dass der Programmierer sich beim Einsatz an den Erfordernissen der jeweiligen Embedded-Anwendung orientieren muss. Dies sind beispielsweise Echtzeitf\u00e4higkeit, geringer Speicherbedarf oder hohe Betriebssicherheit. Gleichzeitig stellt die Wiederverwendbarkeit von Software auch in der Embedded-Welt ein wichtiges Qualit\u00e4tsmerkmal dar. Die richtige Anwendung der C-Schl\u00fcsselw\u00f6rter [&hellip;]","og_url":"https:\/\/www.microconsult.de\/en\/rs-c-embeddedc\/","og_site_name":"MicroConsult Academy GmbH","article_published_time":"2026-01-29T23:00:00+00:00","article_modified_time":"2026-06-17T11:17:47+00:00","og_image":[{"width":1378,"height":1378,"url":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Fotolia_139863849_M.jpg","type":"image\/jpeg"}],"author":"Renate Schultes","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Renate Schultes","Estimated reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#article","isPartOf":{"@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/"},"author":{"name":"Renate Schultes","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/89c1748f96b6c21197360a857fa79c5a"},"headline":"Von C nach Embedded-C: Das Ziel bestimmt den Weg","datePublished":"2026-01-29T23:00:00+00:00","dateModified":"2026-06-17T11:17:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/"},"wordCount":2718,"commentCount":0,"image":{"@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Fotolia_139863849_M.jpg","keywords":["C-Schl\u00fcsselw\u00f6rter","Embedded-C","Embedded-Entwicklung","Embedded-Programmierung","Embedded-Softwareentwicklung","Programmierregeln","Programmiersprache C++","Software-Qualit\u00e4tsmerkmale","Umstieg Embedded-C","V-Modell"],"articleSection":["Embedded- und Echtzeit-Softwareentwicklung","Softwareentwicklung (Windows, Linux)"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microconsult.de\/rs-c-embeddedc\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/","url":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/","name":"From C to Embedded-C: The goal determines the path - MicroConsult Academy GmbH","isPartOf":{"@id":"https:\/\/www.microconsult.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#primaryimage"},"image":{"@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Fotolia_139863849_M.jpg","datePublished":"2026-01-29T23:00:00+00:00","dateModified":"2026-06-17T11:17:47+00:00","author":{"@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/89c1748f96b6c21197360a857fa79c5a"},"breadcrumb":{"@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microconsult.de\/rs-c-embeddedc\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#primaryimage","url":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Fotolia_139863849_M.jpg","contentUrl":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Fotolia_139863849_M.jpg","width":1378,"height":1378},{"@type":"BreadcrumbList","@id":"https:\/\/www.microconsult.de\/rs-c-embeddedc\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microconsult.de\/"},{"@type":"ListItem","position":2,"name":"Von C nach Embedded-C: Das Ziel bestimmt den Weg"}]},{"@type":"WebSite","@id":"https:\/\/www.microconsult.de\/#website","url":"https:\/\/www.microconsult.de\/","name":"MicroConsult Academy GmbH","description":"Professional training, consulting and project support","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microconsult.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/89c1748f96b6c21197360a857fa79c5a","name":"Renate Schultes","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/d82a4cfd395ce164dcf90fd5ee5f4eaf9bb9761c3283213fb2ce891033c5c771?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d82a4cfd395ce164dcf90fd5ee5f4eaf9bb9761c3283213fb2ce891033c5c771?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d82a4cfd395ce164dcf90fd5ee5f4eaf9bb9761c3283213fb2ce891033c5c771?s=96&d=mm&r=g","caption":"Renate Schultes"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/3074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/comments?post=3074"}],"version-history":[{"count":3,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/3074\/revisions"}],"predecessor-version":[{"id":11477,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/3074\/revisions\/11477"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media\/3075"}],"wp:attachment":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media?parent=3074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/categories?post=3074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/tags?post=3074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}