{"id":8047,"date":"2025-11-29T09:19:55","date_gmt":"2025-11-29T08:19:55","guid":{"rendered":"https:\/\/web-dev-weissblau.de\/microconsult\/?p=8047"},"modified":"2026-02-11T06:28:53","modified_gmt":"2026-02-11T05:28:53","slug":"low-level-software-development","status":"publish","type":"post","link":"https:\/\/www.microconsult.de\/en\/hardwarenahe-softwareentwicklung\/","title":{"rendered":"Hardware-level software development"},"content":{"rendered":"<h2>Wie entwickle ich Software mit R\u00fccksicht auf Hardware?<\/h2>\n<p>Autor: Christian Siemers, Technische Universit\u00e4t Clausthal, Institut f\u00fcr Prozess- und Produktionstechnik<\/p>\n<h3>Beitrag &#8211; Embedded Software Engineering Kongress 2015<\/h3>\n<h2>Einleitung<\/h2>\n<p class=\"Flietext\">Ein Thema wie\u00a0<em>Hardwarenahe Programmierung<\/em>\u00a0(in einer Hochsprache) sollte es eigentlich gar nicht geben, denn Hochsprache impliziert Hardware<em>unabh\u00e4ngigkeit<\/em>\u00a0\u2013 und nicht ein spezifisches Eingehen auf die Eigenheiten selbiger. Dennoch ist dieses Thema aus der Praxis aus folgenden Gr\u00fcnden nicht wegzudenken:<\/p>\n<ul>\n<li>Ressourcenbeschr\u00e4nkungen (gerade in eingebetteten Systemen)<\/li>\n<li>Umst\u00e4ndliche Konfiguration von Peripherieelementen (diese ist eher auf Bit- und Byte-Ebene zu sehen)<\/li>\n<li>Extreme Anpassung der Software auf Hardwaregegebenheiten, z.B. bei spezialisierter Hardware oder fehlenden Hardwarekomponenten<\/li>\n<li>Echtzeitprogrammierung bei sehr knappen Rechenzeiten<\/li>\n<\/ul>\n<p class=\"Flietext\">Bei hardwarenaher Programmierung handelt es sich oftmals auch um eine Systementwicklung mit Elementen aus dem Bereich Hardware-\/Software-Co-Design.<\/p>\n<h2>Ressourcenbeschr\u00e4nkungen am Beispiel der diskreten Fouriertransformation<\/h2>\n<p class=\"Flietext\"><strong>Fouriertransformation (FT)<\/strong>:<br \/>\nDie Fouriertransformation ist die Analyse eines (meist zeit-) konti\u00adnuierlichen Signals auf die beinhalteten Frequenzen. Hierbei geht man zun\u00e4chst von periodischen Signalen aus, die sich also nach einer bestimmten Zeit wiederholen. Diese Wiederholungsfrequenz ergibt dann die so genannte Grundfrequenz, das Frequenzspektrum ist diskret.<\/p>\n<p class=\"Flietext\">Der \u00dcbergang von periodischen auf aperiodische Signalformen ergibt dann den \u00dcbergang vom diskreten auf das kontinuierliche Spektrum. Umgekehrt kann man die urspr\u00fcngliche Signalform g(x) durch phasen- und amplitudenkorrektes \u00dcberlagern der im Spektrum vorhandenen Frequenzen wieder erzeugen (Fourier-Synthese). Hier die Formeln zur Berechnung in der reellen Schreibweise, wobei angenommen wird, dass g(x) eine reellwertige Funktion ist (siehe Abbildung 1a,\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>).<\/p>\n<p class=\"Flietext\"><strong>Diskrete Fouriertransformation (DFT)<\/strong>:<br \/>\nIn Rechnern ist die &#8222;Zeitachse&#8220; niemals kontinuierlich, sondern immer diskret. Dies liegt u.a. daran, dass selbst die AD-Wandler niemals zeitkontinuierlich, sondern immer nur zeitdiskret von der analogen in die digitale Welt \u00fcbertragen k\u00f6nnen. AD-Wandler diskretisieren sowohl Daten- als auch Zeitwerte.<\/p>\n<p class=\"Flietext\">Damit werden die Berechnungsintegrale der allgemeinen Fouriertransformation zu Berechnungs\u00adsummen, die vergleichsweise einfach in Form von Algorithmen implementiert werden k\u00f6nnen [1]. T bezeichnet in den Gleichungen (Bild 1b, siehe\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>) die Periode des Signals, Dt den zeitlichen Abstand zweier aufeinanderfolgender Messpunkte.<\/p>\n<p class=\"Flietext\">Die DFT wird genutzt, wenn die Zahl der Messpunkte pro Periode nicht vorherbestimmt oder ungleich einer Zweierpotenz ist. Bei Zweierpotenzen wie 512 oder 1024 jedoch bietet sich die Implementierung als Fast Fourier Transformation (FFT) an. Die Komplexit\u00e4t der DFT liegt bei O(N\u00b2), die der FFT bei O(N*log(N)).<\/p>\n<h3 class=\"Flietext\">DFT-Algorithmus mit Flie\u00dfkommazahlen<\/h3>\n<p class=\"Flietext\">Die Formeln in Bild 1 b) (s.\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>) k\u00f6nnen vergleichsweise leicht in einem Algorithmus aufgenommen werden, z.B. in C:<\/p>\n<p class=\"quellcode\">void vComputeDFT( unsigned int uiNumOfPoints, int *iValue )<\/p>\n<p class=\"quellcode\">{<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 unsigned int k, m;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 double dCoeffAtemp, dCoeffBtemp;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 for( k = 0; k &lt; NUM_OF_COEFFICIENTS; k++ )<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 {<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 dCoeffAtemp = 0.L;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 dCoeffBtemp = 0.L;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 for( m = 0; m &lt; uiNumOfPoints; m++ )<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dCoeffAtemp += (double)*(iValue+m) *<br \/>\ncos(2.L * PI * m * k \/ uiNumOfPoints);<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dCoeffBtemp += (double)*(iValue+m) *<br \/>\nsin(2.L * PI * m * k \/ uiNumOfPoints);<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 \u00a0\u00a0\u00a0}<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 dCoeffA[k] = dCoeffAtemp \/ (double)uiNumOfPoints;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 dCoeffB[k] = dCoeffBtemp \/ (double)uiNumOfPoints;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 }<\/p>\n<p class=\"quellcode\">}<\/p>\n<p class=\"Flietext\">Dieses Programm beinhaltet mit NUM_OF_COEFFICIENTS eine Konstante, die anzeigt, wie viele Koeffizienten a und b aus Bild 1 (siehe\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\">PDF<\/a>) berechnet werden sollen; diese Konstante kann nat\u00fcrlich auch leicht als Variable formuliert werden. Was man aber sehr leicht beurteilen kann: Hier sind eine Menge an Additionen und Multiplikationen enthalten, von der Berechnung der Sinus- und Cosinuswerte ganz abgesehen. Dieser Algorithmus auf einem Mikroprozessor oder DSP implementiert, der keine Floating-Point-Unit aufweist, kann schon \u00fcberraschend gro\u00dfe Laufzeiten aufweisen, da das Floating-Point-Format recht umst\u00e4ndlich emuliert werden muss.<\/p>\n<h3 class=\"Flietext\">Umsetzung in ein Festkommaformat<\/h3>\n<p class=\"Flietext\">Es liegt also nahe, die Umsetzung in ein Festkommaformat durchzuf\u00fchren und dann mit erh\u00f6hter Performance zu rechnen. Eine weitere Verbesserung ist z.B. geringerer Platzbedarf, was aber ggf. zweitrangig ist. Die grunds\u00e4tzliche Formel zur Umsetzung ist (siehe Gleichung 1,\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>)<\/p>\n<p class=\"Flietext\">wobei mit \u0394 der so genannte Offset (Versatz des Nullpunkts) und mit Q zun\u00e4chst ein linearer Skalierungsfaktor bezeichnet wird. Diese Abbildung betrifft aber zun\u00e4chst nur das Mapping einer physikalischen (Prozess-) Gr\u00f6\u00dfe auf eine analoge (!) Gr\u00f6\u00dfe. Interpretiert man die Formel (1) jedoch so, dass Q eine Quantisierungsgr\u00f6\u00dfe darstellt, und dass die Abbildung in Quanten erfolgt, dann erhalten wir die gew\u00fcnschte Abbildung von physikalischen Gr\u00f6\u00dfen in Darstellungen in Computer-verwendbaren Datenwerten.<\/p>\n<p class=\"Flietext\">Gleichung (2, siehe\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>) wird gerne noch dahingehend vereinfacht, dass man den Offset \u0394 zu Null setzt. Hierdurch werden arithmetische Operationen wie Addition, Subtraktion usw. erheblich vereinfacht.<\/p>\n<p class=\"Flietext\">So sch\u00f6n einfach die Formel (2) auch erscheint, sie birgt noch einen Pferdefu\u00df in sich, denn sie gilt nur f\u00fcr einen eingeschr\u00e4nkten Wertebereich von x<sub>phys<\/sub>. Diese Gr\u00f6\u00dfe repr\u00e4sentiert ja die physikalische Au\u00dfenwelt bzw. eine Messgr\u00f6\u00dfe, und da der Zahlenbereich aller Darstellungen im Rechner beschr\u00e4nkt ist, ist auch die Messgr\u00f6\u00dfe in einem zul\u00e4ssigen Intervall zu halten.<\/p>\n<p class=\"Flietext\">Mehr noch, wenn man x<sub>phys<\/sub>\u00a0durch x<sub>float<\/sub>\u00a0ersetzt \u2013 genau dies soll hier ja geschehen, es soll die Flie\u00dfkomma- durch eine Fixkomma-Darstellung ersetzt werden \u2013, dann gelten f\u00fcr beide Zahlenformate Intervallgrenzen f\u00fcr die Zul\u00e4ssigkeit, aber eben unterschiedliche. Dies muss bei der Umsetzung unbedingt ber\u00fccksichtigt werden.<\/p>\n<h3>Das Qm.n-Format<\/h3>\n<p class=\"Flietext\">Das verwendbare Festkommaformat muss man sich als Abwandlung des bekannten Integer-Formats denken, bei dem der Abstand zwischen zwei benachbarten darstellbaren Werten eben nicht 1, sondern z.B. 0,5, 0,25 oder 0,1 ist. \u00dcblicherweise nimmt man in der digitalen Welt auch hierf\u00fcr Zweier-Potenzen, und das resultierende Format wird als Qn.m bezeichnet.<\/p>\n<p class=\"Flietext\">Der Index\u00a0<em>n<\/em>\u00a0steht hierbei f\u00fcr die Anzahl der Bits vor dem Komma,\u00a0<em>m<\/em>\u00a0f\u00fcr die Anzahl danach. Ferner wird wie im Integer-Fall zwischen vorzeichenlosen und vorzeichenbehafteten Darstellungen unterschieden, wobei dies nicht in der Formatbezeichnung sichtbar wird.<\/p>\n<p class=\"Flietext\">Rechnen mit Qn.m unterscheidet sich nicht sonderlich vom Rechnen mit Integerzahlen, solange das Komma bei den Operanden immer an der gleichen Stelle steht. Sind die Darstellungen der Operanden allerdings unterschiedlich, d.h., stimmen n und m f\u00fcr die jeweiligen Operanden untereinander nicht mehr \u00fcberein, dann ist Gehirnarbeit und Bitschieberei angesagt.<\/p>\n<h3>Sinus und Cosinus<\/h3>\n<p class=\"Flietext\">Und es wartet noch eine Aufgabe im Sourcecode (Listing 2), die f\u00fcr eine \u00dcbersetzung gel\u00f6st werden muss: Die transzendenten Funktionen Sinus und Cosinus. Diese Funktionen sind \u00fcblicherweise f\u00fcr Flie\u00dfkommawerte in Bibliotheken vorhanden, aber genau dieser Datentyp soll hier nicht verwendet werden.<\/p>\n<p class=\"quellcode\">#define PI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3.14159265358979L<\/p>\n<p class=\"quellcode\">#define LIMIT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2048<\/p>\n<p class=\"quellcode\">#define FRACTION_BITS\u00a0\u00a0 30<\/p>\n<p class=\"quellcode\">\/* This results in a Q1.30 format with sign\u00a0 *\/<\/p>\n<p class=\"quellcode\">#define LIMIT_TEST\u00a0\u00a0\u00a0\u00a0\u00a0 960<\/p>\n<p class=\"quellcode\">void main()<\/p>\n<p class=\"quellcode\">{<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 int k;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 long int lResult;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 double dfResult;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 for( k = 0; k &lt; LIMIT; k++ )<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 {<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 dfResult = sin( 2.L * PI * (double)k \/ (double)LIMIT );<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 lResult = (long int) (dfResult * (1 &lt;&lt; FRACTION_BITS));<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 printf( \u201e%lf\u00a0 %08x \u201c, dfResult, lResult );<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 }<\/p>\n<p class=\"quellcode\">}<\/p>\n<p class=\"Flietext\">Die L\u00f6sung besteht z.B. darin, die Sinus- und Cosinuswerte\u00a0<em>vor<\/em>\u00a0der Laufzeit zu berechnen und in einem Datenbereich im Qn.m-Format (hier z.B. vorzeichenbehaftetes Q1.30) zu speichern (siehe Listing 2). Um dann zur Laufzeit pr\u00e4zise Werte zu allen Eingangsparameter verf\u00fcgbar zu haben, kann man sich aus der Grundtabelle eine zweite Tabelle (oder direkt die Werte) durch lineare Interpolation erstellen. Dieses Verfahren ist sehr schnell, auch f\u00fcr einfache Prozessoren.<\/p>\n<h3>&#8230; und nun die DFT<\/h3>\n<p class=\"Flietext\">Mit den gerade diskutierten Ans\u00e4tzen zur hardwarenahen Softwareentwicklung wird nun die Transformation des Algorithmus aus Listing 1 in eine Version, die lediglich Integer-Wert nutzt, durchgef\u00fchrt. Folgende Details sind dabei wichtig:<\/p>\n<ul>\n<li>Alle Rechnungen werden als Integerberechnungen durchgef\u00fchrt, kein Casting!<\/li>\n<li>Eine (Muster-)Sinuskurve wird in Form von 513 (= 512 + 1) Werten im signed-Q1.30-Format gespeichert, und zwar nur das erste Viertel (weil sich daraus alle anderen ergeben). Die vollst\u00e4ndige Kurve hat dann 2048 Werte.<\/li>\n<li>Der Zugriff auf diese Wertetabelle ist durch Zugriffsfunktionen wie\u00a0<span class=\"quellcode\">i32GetCosineValue( uint16 ui16Index )<\/span>\u00a0gekapselt. Dies ist eine Anleihe aus der objektorientierten Programm\u00adentwicklung.<\/li>\n<li>F\u00fcr die DFT sind eine Sinus- und eine Cosinustabelle notwendig, deren Periode exakt gleich der Anzahl der Messpunkte ist. Diese wird zu Beginn berechnet (durch lineare Interpolation), und anschlie\u00dfend werden die jeweiligen Werte von dort mithilfe der Funktionen\u00a0<span class=\"quellcode\">(i32GetSine\u00adTableValue() und i32GetCosineTableValue()<\/span>gelesen.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p class=\"Flietext\">Die zentrale Routine zur Berechnung der DFT lautet nun:<\/p>\n<p class=\"quellcode\">void vComputeDFT( uint16 ui16NumOfPoints, int16 *i16Value )<\/p>\n<p class=\"quellcode\">{<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 uint16 k, m, ui16Index;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 int32 i32CoeffATemp, i32CoeffBTemp;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 for( k = 0; k &lt; NUM_OF_COEFFICIENTS; k++ )<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 {<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 i32CoeffATemp = 0;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 i32CoeffBTemp = 0;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 for( m = 0, ui16Index = 0; m &lt; ui16NumOfPoints; )<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i32CoeffATemp += *(i16Value+m) *<br \/>\ni32CosineTable[ui16Index];<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i32CoeffBTemp += *(i16Value+m) * i32SineTable[ui16Index];<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m++;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ui16Index = (ui16Index + k) % ui16NumOfPoints;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 i32CoeffA[k] = i32CoeffATemp;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0\u00a0\u00a0\u00a0 i32CoeffB[k] = i32CoeffBTemp;<\/p>\n<p class=\"quellcode\">\u00a0\u00a0 }<\/p>\n<p class=\"quellcode\">}<\/p>\n<p class=\"Flietext\">Als Testfunktion wird ein Rechteckt mit 5 Perioden auf 1000 Punkte gew\u00e4hlt, da hier das Ergebnis bekannt ist: Wenn die Grundwelle eine H\u00f6he von 1 aufweist, dann sind alle geraden Oberwellen 0, und alle ungeraden Oberwellen (Index\u00a0<em>k<\/em>) weisen eine Amplitude von 1\/<em>k<\/em>\u00a0auf. Bild 2 zeigt das Ergebnis f\u00fcr die in Floating Point realisierte Variante, Bild 3 (siehe\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/files\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>) f\u00fcr die im Festkommaformat.<\/p>\n<p class=\"Flietext\">Die Bilder weisen un\u00fcbersehbare Unterschiede auf, obwohl sie den gleichen Algorithmus imple\u00admentieren. Zudem sieht man zumindest qualitativ, dass Bild 2 (siehe\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>) ein korrektes Ergebnis anzeigt, da das Ergebnis mit der Theorie \u00fcbereinstimmt. Hierzu gleich eine Anmerkung: Will man die wirkliche Korrektheit der Ergebnisse pr\u00fcfen, muss man zu einer logarithmische Darstellung wechseln und die Differenz der berechneten und der theoretischen Werte logarithmisch betrachten. Je nach Anzahl der signifikanten Bits ergibt dies einen Wert, der unter dem erreichbaren Signal\/Rausch-Abstand liegen muss.<\/p>\n<p class=\"Flietext\">Zur\u00fcck zur Auswertung: Der Grund f\u00fcr das Scheitern der DFT-Berechnung im Festkommaformat sind Daten\u00fcberl\u00e4ufe. Die Berechnung verwendet Sinus- und Cosinuswerte von 16 bit Breite. Diese werden in dem Beispiel mit 13 bit Werten (dem gew\u00e4hlten Format f\u00fcr das Rechteck, 12 bit Wert + Vorzeichen) multipliziert, dies ergibt 29 signifikante Bits, und dann 1000fach aufsummiert, was zu 10 weiteren Bits f\u00fchrt (10 = log<sub>2<\/sub>(1024)). Insgesamt k\u00f6nnen die Ergebnisse also 39 Bit Breite aufweisen, da wundert es nicht, wenn es f\u00fcr 32 bit Variablen \u00fcberlaufen kann.<\/p>\n<h2 class=\"Flietext\">Die L\u00f6sung des Problems<\/h2>\n<p class=\"Flietext\">Man kann nun an 2 verschiedenen Schrauben justieren, um das Problem des Daten\u00fcberlaufs zu l\u00f6sen: geringere Datenbreiten, also ein Verlust an Genauigkeit, oder gr\u00f6\u00dfere Datentypen, z.B. also 64 bit. Der erste Weg bietet sich an, wenn die Genauigkeit, die erzielbar w\u00e4re, gar nicht gefordert ist; der zweite, wenn der Genauigkeitsverlust nicht akzeptabel ist. Die Aufteilung auf zwei Variablen, also die Emulation h\u00f6herer Datenbreiten durch softwarem\u00e4\u00dfige Kopplung bleibt ebenfalls als durchaus performante L\u00f6sung. Bild 4 (siehe\u00a0<a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>) zeigt das Ergebnis der Fouriertransformation f\u00fcr einen korrekten, die entstehenden Datenbreiten ber\u00fccksichtigenden Algorithmus im Festkommaformat.<\/p>\n<p class=\"Flietext\">Die Performance ist dabei schon beeindruckend. W\u00e4hrend ein DSP mit einer intrinsischen Datenbreite von 16 Bit ohne Flie\u00dfkommaeinheit f\u00fcr eine 1000-Punkte-DFT immerhin 7 Sekunden ben\u00f6tigte, schlugen f\u00fcr die Festkommavariante nur 700 ms und nach Optimierung (Abbildung der Divisions\u00adbefehle auf sukzessive Subtraktion) nur 120 ms zu Buche.<\/p>\n<p class=\"Flietext\">Als Fazit bleibt, dass beim \u00dcbergang auf Festkommadarstellung ein einfaches Codieren des Algo\u00adrithmus oft nicht zielf\u00fchrend ist, da insbesondere bei arithmetischen Operationen mit Daten\u00fcberl\u00e4ufen zu rechnen ist. Es ist dringend zu empfehlen, sich mit den m\u00f6glichen Datenwerten, auch den Zwischenergebnissen, zu befassen.<\/p>\n<h2 class=\"Flietext\">Zugriff auf Hardware mit besonderen Eigenschaften<\/h2>\n<p class=\"Flietext\">Ein ganz anderes Thema sind Lese- und Schreibzugriffe auf Bereiche, die sich im Programm wie RAM-Speicher verhalten (Lese- und Schreizugriffe), diesen aber nur durch eine besondere Funktionalit\u00e4t emulieren. Wenn dann der Compiler oder der Treiber diesen Zugriff noch verdeckt, kann es schon zu unerw\u00fcnschten Wechselwirkungen kommen.<\/p>\n<h3>Variablen im EEPROM<\/h3>\n<p class=\"Flietext\">Das Thema &#8222;Variablen im ROM&#8220; sieht nach einem Widerspruch in sich aus, stellt doch ein ROM einen Festspeicher, ein Read-Only Memory dar. Seit der Einf\u00fchrung von EEPROM, also einem elektrisch l\u00f6schbarem, wiederbeschreibbarem ROM, ist das jedoch kein Widerspruch mehr, und einige Compiler unterst\u00fctzen das sogar, indem mithilfe des (nicht-Standard-) Schl\u00fcsselwortes\u00a0<strong>eeprom<\/strong>\u00a0dem Compiler\/Linker angezeigt wird, die Werte auch im EEPROM abzulegen.<\/p>\n<p class=\"Flietext\">Angenommen, ein Satz von 16 Daten soll in das EEPROM eines Mikrocontrollers geschrieben werden, weil die Werte bei Abschalten der Spannung gespeichert sein sollen. Dies k\u00f6nnen z.B. Konfigurationswerte sein, die bei jedem Neustart geladen werden.<\/p>\n<p class=\"Flietext\">Das Schreiben in das EEPROM wird wie erw\u00e4hnt von entsprechenden C-Compilern mithilfe von Laufzeitbibliotheken unterst\u00fctzt, aus Sicht der Anwendungsprogrammierung ist dies eine einfache Sache:<\/p>\n<p class=\"quellcode\">eeprom int eepIBasicConfig[16];<\/p>\n<p class=\"quellcode\">int k, iConfig[16];<\/p>\n<p class=\"quellcode\">\u2026<\/p>\n<p class=\"quellcode\">for( k = 0; k &lt; 16; k++ )<\/p>\n<p class=\"quellcode\">eepIBasicConfig[k] = iConfig[k];<\/p>\n<p class=\"Flietext\">Das Gef\u00e4hrliche an dieser Codesequenz ist, dass hinter der scheinbar einfachen Wertzuweisung an eepIBasicConfig[] eine ganze Laufzeitroutine mit blockierender Kommunikation steckt, was so nicht ersichtlich ist. Meistens wird der erste Wert sofort geschrieben (weil in der Hardware ein Pufferplatz vorhanden ist), ab dem zweiten Wert wartet man dann auf die Fertigstellung des Schreibens des Vorg\u00e4ngerwerts \u2013 was durchaus einige Millisekunden dauern kann.<\/p>\n<p class=\"Flietext\">Im Klartext: Ein derartiges Schreiben in den Speicher, im RAM z\u00fcgig durchf\u00fchrbar, kann hier zu \u00fcberraschend langen Laufzeiten f\u00fchren. \u00c4hnliche Effekte ergeben sich, wenn man auf Peripherie \u00fcber ein Netzwerk- oder Bussystem (z.B. I\u00b2C bzw. TWI in kleinen Mikrocontrollersystemen) zugreift, das durchaus durch andere Teilnehmer blockiert sein kann, auch hier k\u00f6nnen lange, sogar unbestimmte Wartezeiten entstehen.<\/p>\n<h3>Die Kunst der nicht-blockierenden Kommunikation<\/h3>\n<p class=\"Flietext\">Die Kunst der nicht-blockierenden Kommunikation will es nun, dass man nur hineinschreibt, wenn dies sofort m\u00f6glich ist (weil der Puffer oder das Netzwerk frei ist, die notwendigen Ressourcen also verf\u00fcgbar sind), ansonsten sich merkt, dass noch etwas zu schreiben\/lesen ist, und zur weiteren Programmausf\u00fchrung zur\u00fcckkehrt. Hierbei muss dann gew\u00e4hrleistet sein, dass das Schreiben etwa durch zyklisches Design irgendwann fertig gestellt wird, und dass es keine Seiteneffekte gibt.<\/p>\n<p class=\"Flietext\">Ideal ist es hier, wenn man im Rahmen eines kleinen Betriebssystems einen Thread starten kann, der genau die gew\u00fcnschte Aktion startet und sich mit dem gleichen Parameter aufruft, falls die Aktion nicht durchf\u00fchrbar war. Wenn der erneute Aufruf sp\u00e4ter wieder aktiviert wird, wird erneut gepr\u00fcft, ob die Aktion durchzuf\u00fchren ist, bis alles fertiggestellt ist bzw. anderweitig abgebrochen wird.<\/p>\n<p class=\"Flietext\">Dies bedeutet allerdings einen etwas h\u00f6heren Initialaufwand. Wie es ohne Betriebssystem gemacht wird, steht beispielsweise in [1], ansonsten kann man solche nicht-blockierende Kommunikation auch in Interrupt-Service-Routinen, durch einen Timer aufgerufen, unterbringen.<\/p>\n<h2 class=\"Flietext\">Fazit<\/h2>\n<p class=\"Flietext\">Es sollte hier exemplarisch gezeigt werden, was eine hardwarenahe Softwareentwicklung bedeutet und welche Konsequenzen das f\u00fcr die Entwicklung hat. Die Software verliert hierbei nat\u00fcrlich ihren Anspruch, Hardware-unabh\u00e4ngig und damit portierbar zu sein. Dies ist eine h\u00e4ufig implizit vorhandene extrafunktionale Anforderung.<\/p>\n<p class=\"Flietext\">Andererseits werden andere, ebenfalls extrafunktionale Anforderungen erf\u00fcllbar(er), so dass es sich lohnt, \u00fcber einige Anpassungen nachzudenken.<\/p>\n<p class=\"Flietext\">In jedem Fall bedeutet hardwarenahe Softwareentwicklung, dass man sich mit der Hardware und ihren Eigenschaften und\/oder den Eigenschaften von Datentypen befassen muss, sowohl, um diese auszunutzen, als auch, um nicht zu scheitern.<\/p>\n<h2 class=\"Flietext\">Literatur<\/h2>\n<p class=\"Literaturverzeichnis1\" align=\"left\">[1]\u00a0 Christian Siemers, Embedded Systems Engineering Handbuch.<br \/>\nhttps:\/\/www.elektronikpraxis.vogel.de\/themen\/embeddedsoftwareengineering\/management\/articles\/340538\/<\/p>\n<p><a title=\"Hardwarenahe Softwareentwicklung (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/11\/fachinfo_ese_multicore_hardwarenahe_softwareentwicklung_tu_clausthal_siemers.pdf\" target=\"_blank\" rel=\"noopener\"><strong>Beitrag als PDF downloaden<\/strong><\/a><\/p>\n<hr \/>\n<h2>Implementierung &#8211; unsere Trainings &amp; Coachings<\/h2>\n<p><strong>Wollen Sie sich auf den aktuellen Stand der Technik bringen?<\/strong><\/p>\n<p>Dann informieren Sie sich\u00a0<a title=\"MicroConsult Training\" href=\"https:\/\/www.microconsult.de\/alle-trainings-termine-komplettuebersicht\/\" target=\"_blank\" rel=\"noopener\"><strong>hier<\/strong>\u00a0<\/a>zu Schulungen\/ Seminaren\/ Trainings\/ Workshops und individuellen Coachings von MircoConsult zum Thema Implementierung \/Embedded- und Echtzeit-Softwareentwicklung.<\/p>\n<p><strong>Training &amp; Coaching zu den weiteren Themen unseren Portfolios finden Sie\u00a0<a title=\"Training &amp; Beratung - alle Themen\" href=\"https:\/\/www.microconsult.de\/training-beratung\/\" target=\"_blank\" rel=\"noopener\">hier<\/a>.<\/strong><\/p>\n<hr \/>\n<h2>Implementierung &#8211; Fachwissen<\/h2>\n<p>Wertvolles Fachwissen zum Thema Implementierung\/\u00a0Embedded- und Echtzeit-Softwareentwicklung steht\u00a0<a title=\"Embedded- und Echtzeit-Softwareentwicklung\" href=\"https:\/\/www.microconsult.de\/embedded-und-echtzeit-softwareentwicklung\/\" target=\"_blank\" rel=\"noopener\"><strong>hier\u00a0<\/strong><\/a>f\u00fcr Sie zum kostenfreien Download bereit.<\/p>\n<p><a title=\"Embedded- und Echtzeit-Softwareentwicklung\" href=\"https:\/\/www.microconsult.de\/embedded-und-echtzeit-softwareentwicklung\/\" target=\"_blank\" rel=\"noopener\"><strong>Zu den Fachinformationen<\/strong><\/a><\/p>\n<p><strong>Fachwissen zu weiteren Themen unseren Portfolios finden Sie <a title=\"MicroConsult Fachwissen\" href=\"https:\/\/www.microconsult.de\/fachwissen\/\" target=\"_blank\" rel=\"noopener\">hier<\/a>.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie entwickle ich Software mit R\u00fccksicht auf Hardware? Autor: Christian Siemers, Technische Universit\u00e4t Clausthal, Institut f\u00fcr Prozess- und Produktionstechnik Beitrag &#8211; Embedded Software Engineering Kongress 2015 Einleitung Ein Thema wie\u00a0Hardwarenahe Programmierung\u00a0(in einer Hochsprache) sollte es eigentlich gar nicht geben, denn Hochsprache impliziert Hardwareunabh\u00e4ngigkeit\u00a0\u2013 und nicht ein spezifisches Eingehen auf die Eigenheiten selbiger. Dennoch ist dieses [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"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":[],"tags":[],"class_list":["post-8047","post","type-post","status-publish","format-standard","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hardwarenahe Softwareentwicklung - 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\/low-level-software-development\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hardwarenahe Softwareentwicklung - MicroConsult Academy GmbH\" \/>\n<meta property=\"og:description\" content=\"Wie entwickle ich Software mit R\u00fccksicht auf Hardware? Autor: Christian Siemers, Technische Universit\u00e4t Clausthal, Institut f\u00fcr Prozess- und Produktionstechnik Beitrag &#8211; Embedded Software Engineering Kongress 2015 Einleitung Ein Thema wie\u00a0Hardwarenahe Programmierung\u00a0(in einer Hochsprache) sollte es eigentlich gar nicht geben, denn Hochsprache impliziert Hardwareunabh\u00e4ngigkeit\u00a0\u2013 und nicht ein spezifisches Eingehen auf die Eigenheiten selbiger. Dennoch ist dieses [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microconsult.de\/en\/low-level-software-development\/\" \/>\n<meta property=\"og:site_name\" content=\"MicroConsult Academy GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-29T08:19:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-11T05:28:53+00:00\" \/>\n<meta name=\"author\" content=\"weissblau media\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"weissblau media\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/\"},\"author\":{\"name\":\"weissblau media\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"headline\":\"Hardwarenahe Softwareentwicklung\",\"datePublished\":\"2025-11-29T08:19:55+00:00\",\"dateModified\":\"2026-02-11T05:28:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/\"},\"wordCount\":2477,\"commentCount\":0,\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/\",\"name\":\"Hardwarenahe Softwareentwicklung - MicroConsult Academy GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\"},\"datePublished\":\"2025-11-29T08:19:55+00:00\",\"dateModified\":\"2026-02-11T05:28:53+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/hardwarenahe-softwareentwicklung\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.microconsult.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hardwarenahe Softwareentwicklung\"}]},{\"@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\\\/b6d4c4ae959b068fbe8d9416ed019a0a\",\"name\":\"weissblau media\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"caption\":\"weissblau media\"},\"sameAs\":[\"https:\\\/\\\/www.microconsult.de\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hardware-related software development - 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\/low-level-software-development\/","og_locale":"en_GB","og_type":"article","og_title":"Hardwarenahe Softwareentwicklung - MicroConsult Academy GmbH","og_description":"Wie entwickle ich Software mit R\u00fccksicht auf Hardware? Autor: Christian Siemers, Technische Universit\u00e4t Clausthal, Institut f\u00fcr Prozess- und Produktionstechnik Beitrag &#8211; Embedded Software Engineering Kongress 2015 Einleitung Ein Thema wie\u00a0Hardwarenahe Programmierung\u00a0(in einer Hochsprache) sollte es eigentlich gar nicht geben, denn Hochsprache impliziert Hardwareunabh\u00e4ngigkeit\u00a0\u2013 und nicht ein spezifisches Eingehen auf die Eigenheiten selbiger. Dennoch ist dieses [&hellip;]","og_url":"https:\/\/www.microconsult.de\/en\/low-level-software-development\/","og_site_name":"MicroConsult Academy GmbH","article_published_time":"2025-11-29T08:19:55+00:00","article_modified_time":"2026-02-11T05:28:53+00:00","author":"weissblau media","twitter_card":"summary_large_image","twitter_misc":{"Written by":"weissblau media","Estimated reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/#article","isPartOf":{"@id":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/"},"author":{"name":"weissblau media","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"headline":"Hardwarenahe Softwareentwicklung","datePublished":"2025-11-29T08:19:55+00:00","dateModified":"2026-02-11T05:28:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/"},"wordCount":2477,"commentCount":0,"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/","url":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/","name":"Hardware-related software development - MicroConsult Academy GmbH","isPartOf":{"@id":"https:\/\/www.microconsult.de\/#website"},"datePublished":"2025-11-29T08:19:55+00:00","dateModified":"2026-02-11T05:28:53+00:00","author":{"@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"breadcrumb":{"@id":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.microconsult.de\/hardwarenahe-softwareentwicklung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microconsult.de\/"},{"@type":"ListItem","position":2,"name":"Hardwarenahe Softwareentwicklung"}]},{"@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\/b6d4c4ae959b068fbe8d9416ed019a0a","name":"weissblau media","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","caption":"weissblau media"},"sameAs":["https:\/\/www.microconsult.de"]}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/8047","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/comments?post=8047"}],"version-history":[{"count":7,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/8047\/revisions"}],"predecessor-version":[{"id":11635,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/8047\/revisions\/11635"}],"wp:attachment":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media?parent=8047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/categories?post=8047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/tags?post=8047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}