Mikrocontroller-Programmierung vs. objektorientierte Programmierung


11

Ich habe einige grundlegende objektorientierte Programmierungen mit C ++ durchgeführt (Erstellen eines B-Baums, Hashing-Algorithmen, doppelt verknüpfte Listen) und ich habe ein kleines Projekt in C durchgeführt (wie das Erstellen eines wissenschaftlichen Taschenrechners usw.)

Wie unterschiedlich ist die Hardware-Programmierung (speziell für Mikrocontroller) von der Software- / objektorientierten Programmierung in Bezug auf die Denkweise und das "Denken", die der Programmierer haben muss?

Wird einer normalerweise als härter angesehen als der andere, meine meisten Leute?

Würde ich mit meinem Hintergrund (wie oben beschrieben) viel Vorbereitung brauchen, um in die Hardware-Programmierung einzusteigen, oder kann ich ohne zu viel Vorbereitung direkt eintauchen?


4
Die größte Lernkurve besteht darin, wie Sie die spezifische Hardware in Ihrem Mikro steuern. Dazu müssen Sie stundenlang über die Datenblätter blättern. Leider gibt es keinen einfachen Ausweg.
drxzcl

@rrazd, mir ist aufgefallen, dass Sie das Arduino-Tag eingefügt haben. Liegt das daran, dass Sie die Arduino-Verkabelungssprache und -Bibliotheken verwenden möchten? Oder schreiben Sie Ihre eingebetteten Anwendungen in reinem C? Wenn Sie beabsichtigen, sich an die Arduino-Umgebung zu halten, ist es ziemlich sicher und einfach, damit herumzuspielen, da sie einige Abstraktionen von der Hardware entfernt haben.
Jon L

@ Jon Ich plane, ein Arduino-Board für den Anfang zu verwenden. Ist es nicht ähnlich wie in der C-Sprache? Ich dachte, dass es die gleichen Grundkonzepte beinhaltet ....
rrazd

1
Ich frage mich, ob Sie meinen, was viele Leute "E / A-Programmierung" nennen würden, oder ob Sie damit rechnen, Hardware mit Code neu anzuordnen. Das Arduino ist entschieden das erstere; Letzteres wäre die Domäne der FPGAs.
JustJeff

1
@rrazd - Ich habe den Titel geändert. "Hardware-Programmierung" klingt zu sehr nach HDL (Hardware Description Language), z. B. VHDL und Verilog, die zum Programmieren von FPGAs und CPLDs verwendet werden.
Stevenvh

Antworten:


10

Beim Umgang mit den meisten Mikrocontrollern müssen Sie das objektorientierte Paradigma vollständig aufgeben.

Mikrocontroller sind im Allgemeinen register- und RAM-begrenzt, mit langsamen Taktraten und ohne Pipelining / Parallelcode-Pfade. Sie können beispielsweise Java auf einem PIC vergessen.

Sie müssen sich in eine Assembler-Denkweise einarbeiten und prozedural schreiben.

Sie müssen Ihren Code relativ flach halten und Rekursionen vermeiden, da RAM-Einschränkungen häufig zu Stapelproblemen führen können.

Sie müssen lernen, wie Sie Interrupt-Serviceroutinen schreiben, die effizient sind (normalerweise in Assemblersprache).

Möglicherweise müssen Sie Teile des Codes manuell in Assemblersprache umgestalten, um Funktionen zu implementieren, die der Compiler nicht (oder nur unzureichend) unterstützt.

Sie müssen mathematischen Code schreiben, der die Wortgröße und den Mangel an FPU-Funktionen der meisten Mikrocontroller berücksichtigt (dh 32-Bit-Multiplikation auf einem 8-Bit-Mikro = böse).

Es ist eine andere Welt. Für mich kann ein Informatik- oder professioneller Programmierhintergrund ebenso hinderlich sein wie überhaupt kein Wissen im Umgang mit Mikrocontrollern.


1
Sie müssen das objektorientierte Paradigma nicht vollständig aufgeben, aber bei kleineren Mikros kann es erforderlich sein, schwergewichtige Objektimplementierungen aufzugeben und wirklich darüber nachzudenken, wie jedes Problem am besten gelöst werden kann. Oft ist das prozedural, aber leichte Objekte, die gut implementiert sind (normalerweise von Hand), können manchmal die Größe komplizierter Mikrocontroller-Projekte verringern.
Chris Stratton

6
All dies ist wahr, außer dass die Objektorientierung aufgegeben wird. Sie werden wahrscheinlich keine Sprache mit OO-Funktionen verwenden, dies schließt jedoch die Objektorientierung nicht aus. Für Mikrocontroller schreiben Sie Treiber für alle Hardware-Peripheriegeräte (ADCs, serielle Bus-Controller, PWM usw. usw.). Ein solcher Treiber sollte immer objektorientiert geschrieben werden, damit er 1) autonom ist und den Rest des Programms nicht kennt / sich nicht darum kümmert und 2) eine private Kapselung implementiert, damit der Rest des Programms dies nicht kann geh rein und fummel daran herum. Dies ist in C zu 100% möglich und beeinträchtigt die Leistung nicht.
Lundin

1
Ich bin mit dem ersten Satz überhaupt nicht einverstanden, alle meine Mikrocontroller-Projekte wurden mit C ++ und einem objektorientierten Ansatz erstellt, und die von uns verwendeten Mikros waren nicht sehr groß (32 KB ROM), der ebenfalls objektorientierte Bootloader war in weniger als 2 KB, ich sehe keine wirkliche Einschränkung. Sie können keine verrückten Sachen machen, aber das Design kann objektorientiert sein, kein Problem.
Arsenal

@ Arsenal Hinweis Ich habe 'am meisten' gesagt und beachte, dass Sie einen vier Jahre alten Thread kommentieren. :)
Adam Lawrence

Ich bin mit dem ersten und dem letzten Satz überhaupt nicht einverstanden. Und auch Assembly wird ziemlich selten und meistens nur für 8-Bit-MCUs verwendet (überprüfen Sie einfach dieses Forum, wie viele Beiträge mit Assembly-Code können Sie finden?). Sie können und sollten (IMHO) im OO-Stil für 32-Bit-MCUs schreiben
GAttuso

10

Sie müssen über verschiedene Dinge nachdenken:

  • Sie werden C als Sprache verwenden
  • Mit Funktionszeigern können Sie immer noch ein Gefühl der Objektorientierung erzeugen, sodass Sie Funktionen usw. überschreiben können. Ich habe diese Methode in früheren und aktuellen Projekten verwendet und sie funktioniert sehr gut. OO ist also teilweise vorhanden, aber nicht im C ++ - Sinne.

Es gibt andere Einschränkungen, die beim Spielen auftreten werden, wie z. B. begrenzte Geschwindigkeit und Speicher. Als allgemeine Richtlinie vermeide ich:

  • Mit Heap mache ich das, wenn es eine Möglichkeit gibt, das Problem ohne Malloc zu lösen. Zum Beispiel ordne ich Puffer vorab zu und verwende sie einfach.
  • Ich reduziere absichtlich die Stapelgröße in den Compilereinstellungen, um Probleme mit der Stapelgröße frühzeitig zu lösen. Optimiere dies sorgfältig.
  • Ich gehe davon aus, dass jede einzelne Codezeile durch ein Ereignis unterbrochen wird, daher vermeide ich nicht wiedereintretenden Code
  • Ich gehe davon aus, dass sogar Interrupts verschachtelt sind, also schreibe ich diesen Code entsprechend
  • Ich vermeide die Verwendung von Betriebssystemen, es sei denn, dies ist erforderlich. 70% der eingebetteten Projekte benötigen kein Betriebssystem. Wenn ich ein Betriebssystem verwenden muss, verwende ich nur etwas mit verfügbarem Quellcode. (Freertos usw.)
  • Wenn ich ein Betriebssystem verwende, abstrahiere ich fast immer Dinge, damit ich das Betriebssystem in wenigen Stunden ändern kann.
  • Für Treiber usw. werde ich nur die vom Anbieter bereitgestellten Bibliotheken verwenden. Ich habe nie direkt an den Bits herumgespielt, es sei denn, ich habe keine andere Wahl. Dies macht den Code lesbar und verbessert das Debuggen.
  • Ich schaue mir die Loops und andere Dinge an, besonders in ISR, um sicherzustellen, dass sie schnell genug sind.
  • Ich halte immer ein paar GPIOs bereit, um Dinge, Kontextwechsel, ISR-Laufzeit usw. zu messen.

Liste geht weiter, ich bin wahrscheinlich unterdurchschnittlich in Bezug auf Softwareprogrammierung, ich bin sicher, dass es bessere Praktiken gibt.


3
+1 für "Sie können OO-Paradigmen verwenden, wenn Sie möchten". Was Sie an der Tür überprüfen müssen, ist kein OO-Design. OOD ist nur eine Philosophie, die Sie dazu ermutigt, verwandten Code und Daten zusammenzuhalten. Was Sie hinter sich lassen müssen, ist die Art und Weise, wie OO in Unternehmenssystemen implementiert wird, mit mehreren Abstraktionsebenen, Umkehrung der Kontrolle und all dem Jazz. Die Aufgabe Ihrer Firmware ist es, die Hardware anzutreiben, das war's.
drxzcl

7

Ich mache beides, also hier ist meine Ansicht.

Ich denke, die mit Abstand wichtigste Fähigkeit in Embedded ist Ihre Debugging-Fähigkeit. Die erforderliche Denkweise ist insofern sehr unterschiedlich, als so viel mehr schief gehen kann, und Sie müssen sehr offen dafür sein, all die verschiedenen Möglichkeiten zu berücksichtigen, mit denen das, was Sie versuchen, schief gehen kann.

Dies ist das größte Problem für neue Embedded-Entwickler. PC-Leute neigen dazu, es rauer zu haben, da sie es gewohnt sind, nur für sie zu arbeiten. Sie werden viel Zeit damit verschwenden, nach Werkzeugen zu suchen, um stattdessen Dinge für sie zu tun (Hinweis: Es gibt nicht viele). Es werden immer wieder viele Köpfe gegen Wände geschlagen, ohne zu wissen, was man sonst tun soll. Wenn Sie das Gefühl haben, stecken zu bleiben, treten Sie zurück und finden Sie heraus, ob Sie feststellen können, was alles schief gehen könnte. Gehen Sie systematisch die Liste der potenziellen Probleme ein, bis Sie es herausgefunden haben. Aus diesem Prozess folgt direkt, dass Sie den Umfang der Probleme einschränken sollten, indem Sie nicht zu viel auf einmal ändern.

Erfahrene Embedded-Leute halten das Debuggen für selbstverständlich ... die meisten Leute, die es nicht gut können, halten nicht lange durch (oder arbeiten in großen Unternehmen, die einfach akzeptieren, dass "Firmware ist schwer" als Antwort auf die Gründe für eine bestimmte Funktion ist Jahre zu spät)

Sie arbeiten an Code, der auf einem externen System für Ihr Entwicklungssystem ausgeführt wird und von Plattform zu Plattform unterschiedliche Einblicke in Ihr Ziel bietet. Wenn Sie unter Ihrer Kontrolle stehen, suchen Sie nach Entwicklungshilfen, um diese Sichtbarkeit Ihres Zielsystems zu verbessern. Verwenden Sie serielle Debug-Ports, Bit-Banging-Debug-Ausgabe, das berühmte blinkende Licht usw. Lernen Sie mindestens die Verwendung eines Oszilloskops und verwenden Sie Pin-E / A mit dem Bereich, um zu sehen, wann bestimmte Funktionen ein- / ausgehen, ISRs ausgelöst werden usw. Ich habe beobachtet, wie Menschen buchstäblich Jahre länger als nötig gekämpft haben, nur weil sie sich nie die Mühe gemacht haben, einen richtigen JTAG-Debugger-Link einzurichten / zu lernen.

Es ist viel wichtiger, genau zu wissen, über welche Ressourcen Sie im Vergleich zu einem PC verfügen. Lesen Sie die Datenblätter sorgfältig durch. Berücksichtigen Sie die Ressourcenkosten für alles, was Sie versuchen zu tun. Lernen Sie ressourcenorientierte Debugging-Tricks wie das Füllen des Stapelspeichers mit einem magischen Wert, um die Stapelverwendung zu verfolgen.

Während sowohl für PC als auch für eingebettete Software ein gewisses Maß an Debugging-Kenntnissen erforderlich ist, ist dies bei Embedded viel wichtiger.


5

Ich gehe davon aus, dass Ihre C ++ - Erfahrung PC-basiert ist.

Ein häufig gemachter Fehler von Programmierern, die vom PC zum Mikrocontroller wechseln, ist, dass sie nicht erkennen, wie begrenzt Ressourcen sein können. Auf einem PC wird Sie niemand aufhalten, wenn Sie eine Tabelle mit 100 000 Einträgen erstellen oder ein Programm schreiben, das mit 1 MB Maschinencode kompiliert wird.
Es gibt Mikrocontroller mit einer Fülle von Speicherressourcen, insbesondere im High-End-Bereich, aber es ist noch weit entfernt von dem, was Sie gewohnt sind. Bei einem Hobbyprojekt können Sie wahrscheinlich immer das Maximum erreichen, aber bei einem professionellen Projekt müssen Sie häufig mit dem kleineren Gerät arbeiten, weil es billiger ist .
Bei einem Projekt habe ich mit einem TI MSP430F1101 gearbeitet. 1 KB Programmspeicher, 128 Byte Konfigurations-Flash, 128 Byte RAM. Das Programm passte nicht in die 1K, daher musste ich eine 23-Byte-Funktion in den Konfigurations-Flash schreiben. Mit diesen kleinen Controllern berechnen Sie byteweise . Bei einer anderen Gelegenheit war der Programmspeicher 4 Bytes zu klein. Boss ließ mich den Controller nicht mit mehr Speicher verwenden, sondern musste stattdessen einen bereits optimierten Maschinencode (der bereits im Assembler geschrieben wurde) optimieren, um die zusätzlichen 4 Bytes aufzunehmen. Sie erhalten das Bild.

Abhängig von der Plattform, an der Sie arbeiten, müssen Sie mit E / A auf sehr niedriger Ebene umgehen . Einige Entwicklungsumgebungen verfügen über Funktionen zum Schreiben auf ein LCD, andere sind jedoch selbstständig und müssen das Datenblatt des LCD von Anfang bis Ende lesen , um zu wissen, wie es gesteuert wird.
Möglicherweise müssen Sie ein Relais steuern, das ist einfacher als ein LCD, aber Sie müssen zur Registerebene des Mikrocontrollers wechseln. Wieder ein Datenblatt oder eine Bedienungsanleitung. Sie müssen die Struktur des Mikrocontrollers kennenlernen, die Sie in einem Blockdiagramm wieder im Datenblatt finden. In den Tagen des Mikroprozessors sprachen wir über ein ProgrammiermodellDies war im Grunde eine Aufstellung der Register des Prozessors. Die heutigen Mikrocontroller sind so komplex, dass eine Beschreibung aller Register den größten Teil eines 100-seitigen Datenblattes ausmachen kann. IIRC nur die Beschreibung des Uhrmoduls für den MSP430 war 25 Seiten lang.

μ

Mikrocontroller werden häufig in C programmiert . C ++ ist ziemlich ressourcenhungrig, das ist also normalerweise nicht der Fall. (Die meisten C ++ - Implementierungen für Mikrocontroller bieten eine begrenzte Teilmenge von C ++.) Wie ich bereits sagte, steht Ihnen je nach Plattform möglicherweise eine umfangreiche Funktionsbibliothek zur Verfügung, mit der Sie einige Entwicklungszeit sparen können. Es lohnt sich, sich etwas Zeit zu nehmen, um es zu studieren. Es kann Ihnen später viel Zeit sparen, wenn Sie wissen, was verfügbar ist.


Ich habe Spiele für den Atari 2600 geschrieben, der eine eher begrenzte Plattform ist. Mein erstes veröffentlichtes Spiel war im Wesentlichen 4K-Code (da ich einen 32K-Wagen hatte, habe ich einige zusätzliche Extras hinzugefügt, aber die 4K-Version war vollständig spielbar). RAM ist 128 Bytes. Ich finde es interessant darüber nachzudenken, dass in dem Jahr, in dem ich dieses Spiel geschrieben habe (2005), andere Spiele veröffentlicht wurden, die buchstäblich eine Million Mal so groß waren.
Supercat

@supercat - Ja, aber das war zu erwarten, 2005 war der Atari 2600 bereits 200 Jahre alt! Ich habe noch nie Actionspiele wie FPS gespielt, aber wenn ich mir anschaue, was zum Spielen benötigt wird, eine GPU, die sowohl programmgesteuert als auch elektrisch viel leistungsfähiger als Ihre CPU ist, kann ich nicht anders, als den Kopf zu schütteln :-). Ich habe Schach (Sargon) auf einem 16k TRS-80 IIRC gespielt. Der Flugsimulator meines Bruders brauchte nicht mehr.
Stevenvh

Nicht ganz 200 Jahre alt. Es debütierte 1977, also war es nicht einmal 30. Obwohl ich der Meinung bin, dass dies in technologischer Hinsicht vor Äonen war, bin ich immer noch überwältigt von der Tatsache, dass es nicht nur eine hundertfache oder tausendfache Steigerung gibt , aber eine MILLION-fache Zunahme sowohl des RAM als auch der Codegröße. Die Geschwindigkeit hat nicht so stark zugenommen, da der 2600 1,19 MHz betrug und neuere Systeme nur im niedrigen GHz-Bereich liegen. Sie können pro Zyklus viel mehr als die 2600 (die in jedem Zyklus 1/76 einer Videolinie erzeugen konnte und musste), aber ich denke nicht, dass sie 1.000.000x so schnell sind.
Supercat

3

"Hardware-Programmierung" kann viele Dinge bedeuten. Das Programmieren eines sehr kleinen Chips (denken Sie an 10F200, 512 Anweisungen, einige Bytes RAM) kann fast wie das Entwerfen einer elektronischen Schaltung sein. Auf der anderen Seite kann die Programmierung eines großen Cortex-Mikrocontrollers (1 MB FLASH, 64 kB RAM) der PC / GUI-Programmierung mit einem großen GUI-Toolkit sehr ähnlich sein. Meiner Meinung nach benötigt ein guter Embedded- / Echtzeit-Programmierer Kenntnisse sowohl von der Seite des Software-Engineerings als auch von der Seite des Schaltungsdesigns. Für die größeren uC ist C ++ eine gute Sprachwahl, für die sehr kleinen könnte C die einzige Wahl sein. Assemby-Wissen kann nützlich sein, aber ich würde nicht empfehlen, ernsthafte Projekte ausschließlich in der Montage durchzuführen.

Ich habe ernsthafte eingebettete Arbeit mit Menschen von beiden Seiten (SWI und EE) geleistet. Ich bevorzuge im Allgemeinen die SWI-Leute, vorausgesetzt, sie haben Erfahrung mit Multu-Threading-Programmierung.

Ihre Frage klingt so, als ob Sie in die eingebettete Programmierung eintauchen möchten. Tun Sie dies auf jeden Fall. Für die Low-Level-Aspekte (Anbindung der Peripheriegeräte in Ihrem Chip und der Hardware um ihn herum) müssen Sie einige neue Fähigkeiten erlernen, aber es ist nur eine Menge Arbeit ohne viele neue Konzepte. Für die höheren Ebenen Ihrer Projekte können Sie auf Ihr vorhandenes Wissen zurückgreifen.


1

Für jede von Ihnen aufgerufene Arduino-Bibliotheksmethode gibt es eine Fülle von C / C ++ - Code, der dies ermöglicht. Sie ist einfach gut verpackt, damit Sie sie als API verwenden können. Werfen Sie einen Blick auf den Arduino-Quellcode unter dem Verzeichnis hardware / arduino / * und Sie werden alle für Sie geschriebenen C / C ++ sehen, die direkt mit den Registern des AVR-Mikrocontrollers interagieren. Wenn Sie lernen möchten, wie man solche Dinge schreibt (direkt für die Hardware), gibt es viel zu besprechen. Wenn Ihr Ziel darin besteht, mithilfe der Bibliotheken etwas zum Laufen zu bringen, gibt es möglicherweise nicht viel zu besprechen, da der größte Teil der harten Arbeit für Sie erledigt wird und die Bibliotheken und die Entwicklungsumgebung sehr einfach zu verwenden sind.

Einige Faustregeln bei der Arbeit mit Geräten mit eingeschränkten Ressourcen, die entweder für die Arduino-Umgebung oder für andere gelten können:

Beachten Sie, wie viel Speicher Sie verwenden. Sowohl die Codegröße (die in den Flash-Speicher geht) als auch die statische RAM-Nutzung (Konstanten in Ihrem Code, die immer im RAM vorhanden sind). Ich würde argumentieren, dass die statische RAM-Nutzung zu Beginn etwas wichtiger ist, da sie leicht zu übersehen ist. Es ist nicht ungewöhnlich, dass Sie nur 1000 Bytes für Ihren Stack, Heap und Ihre Konstanten haben. Seien Sie weise, wie Sie es ausgeben, also vermeiden Sie Dinge wie lange Arrays von ganzen Zahlen (jeweils 4 Bytes), wenn Bytes oder vorzeichenlose Zeichen (jeweils 1 Byte) ausreichen. Eine andere Antwort hier behandelt einige andere wichtige Punkte sehr gut, daher werde ich hier aufhören. Ich wollte vor allem darauf hinweisen, dass es viel zu besprechen gibt , wenn Sie nicht die Arduino-Bibliothek verwenden und Ihre eigenen C-Bibliotheken schreiben .


0

In Bezug auf Mikrocontroller und OOP-Programmierung sind sie keine Gegensätze. Es stimmt, dass sich alle Herstellerbibliotheken in einfachem C befinden, aber alle Plattformen unterstützen auch C ++ OOP. Entwickler können darüber hinaus C ++ - Bibliotheken und Gerätefirmware auf hoher Ebene erstellen und erstellen. Das gute Beispiel sind offizielle und vom Benutzer erstellte Arduino-Bibliotheken - hauptsächlich C ++ - Klassen. Möglicherweise können nicht alle OOP-Vorteile in einer eingebetteten Umgebung vollständig genutzt werden, aber auch hier gelten bekannte C ++ - und C-Vorteile.

In Bezug auf die Denkweise und das Denken sind Mikrocontroller, wie in anderen Antworten erwähnt, sehr ressourcenbeschränkte Plattformen (insbesondere im RAM, weniger schnell) - Dinge wie dynamische Speicherzuweisung, C ++ - Ausnahmen sind normalerweise ausgeschlossen. Wenn die richtige Hardware ausgewählt wird, ist es einfach, diese Einschränkungen zu übernehmen und andere Techniken zu verwenden (die auch auf anderen Plattformen weit verbreitet sind).

Meiner Ansicht nach könnte die schwierigere Herausforderung eine weitere Dimension der eingebetteten Programmierung sein - das Timing. Dies liegt daran, dass eingebettete Software in der Regel viel mit Echtzeitereignissen, streng zeitgesteuerten Protokollen zur Steuerung der Peripheriehardware und allgemeinen Aufgaben selbst zu tun hat (dies sind auch einige Parallelen zu anderen "High-Level" -Plattformen wie Multithread-Anwendungen).

Seien Sie darauf vorbereitet, viele Datenblätter zu lesen, wenn Sie sich mit neuer Hardware befassen - ich denke, dies könnte mit dem Fragenteil "Denkweise" zusammenhängen :) Sicherlich wären einige EE- und Hardware-Kenntnisse erforderlich.

Außerdem möchte ich darauf hinweisen, dass die Entwicklung eingebetteter Software heutzutage keine Assemblersprache erfordert. Tatsächlich ist Java (übrigens standardmäßig OOP) bereits vorhanden und wird immer stärker (zumindest für einige Klassen eingebetteter Geräte, z. B. IoT-Geräte, könnte es eine sehr gute Zukunft haben).


In Bezug auf Bedenken sind diejenigen, die sich mit der (Neu-) Zuweisung von dynamischem Speicher befassen, tendenziell ein größeres Hindernis für die traditionelle OO als das Timing .
Chris Stratton

Vielleicht hast du recht. Es gibt jedoch Leute, die in den 80-90er Jahren für MSDOS-Real-Mode-Software programmiert haben und über 64 KB RAM (Datenspeichersegment) verfügen, und für sie war dies "natürlich". Vielleicht war MSDOS PC mehr "eingebettete" Umgebung als das heutige STM32F4 :)
Flanker

Der STM32F4 verfügt normalerweise über mehr Programmspeicher in Form von Flash, der PC verfügt jedoch normalerweise über weitaus mehr RAM-Speicher zum Speichern veränderlicher Laufzeitobjekte. Während die ganze Sache mit dem Fernzeiger, die durch segmentierte Adressierung erzwungen wurde, ein Schmerz war, fehlt beiden eine echte MMU, und das wird auf dem System mit weniger RAM, dem STM32F4, noch mehr Anlass zur Sorge geben. Außerdem waren die PC-Betriebszeiten tendenziell kürzer und die akzeptablen Ausfallraten höher.
Chris Stratton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.