Fast jeder wird jetzt den Segen sagen:
leistung !
Okay, C erlaubt es, athletischen Code zu schreiben. Aber es gibt doch noch andere Sprachen, die das können! Und die Optimierungskraft moderner Compiler ist großartig. Hat C einige Vorteile, die keine andere Sprache hat? Oder es werden einfach keine flexibleren Instrumente in der Domäne benötigt?
Antworten:
Das ist ein Teil davon; Die deterministische Ressourcennutzung ist bei Geräten mit begrenzten Ressourcen zunächst wichtig, es gibt jedoch auch andere Gründe.
quelle
C wurde entwickelt, um eine CPU zu modellieren, da C dafür geschaffen wurde, Unix plattformübergreifend portierbar zu machen, anstatt nur die Assemblersprache zu schreiben.
Dies bedeutet, dass C-Programme gut als Programmiersprache für Programme funktionieren, deren Abstraktionsebene sehr nahe an der tatsächlichen CPU liegen muss, was bei eingebetteter Hardware der Fall ist.
Hinweis: C wurde um 1970 entwickelt und die CPUs waren damals einfacher.
quelle
Ein Grund für die Dominanz ist, dass es die richtigen Werkzeuge für die Aufgabe gibt. Nachdem ich Embedded-Plattformen sowohl in Java als auch in C / C ++ entwickelt habe, kann ich Ihnen sagen, dass der Ansatz von C ++ einfach natürlicher ist. Es ist ziemlich ärgerlich, dem Entwickler zu ersparen, dass er oder sie durch die Reifen springt, weil die Sprache zu hoch ist. Ein gutes Beispiel ist das Fehlen von vorzeichenlosen Variablen in Java.
Und die praktischen Funktionen von VM / interpretierten Sprachen sind normalerweise nicht realisierbar und werden bei der Implementierung nicht berücksichtigt, z. B. Garbage Collection.
quelle
C benötigt an und für sich nur sehr wenig Laufzeitunterstützung, sodass der Overhead viel geringer ist. Sie müssen weder Speicherplatz noch Speicherplatz für die Laufzeitunterstützung aufwenden, noch Zeit und Mühe aufwenden, um diese Unterstützung zu minimieren, oder dies bei der Gestaltung Ihres Projekts berücksichtigen.
quelle
switch
es erstellte große Zustandsautomaten schrecklich, und dieselben mit Klassenhierarchien erstellten Maschinen sind nett und wartbar.switch
, könnte man sagen) immer noch in vielen eingebetteten Anwendungen verwendet wird. Einfacher zu debuggen, einfacher zu überprüfen.Wie bereits in anderen Antworten erwähnt, wurde C in den frühen 1970er Jahren entwickelt, um die Assemblersprache einer Minicomputer-Architektur zu ersetzen. Damals kosteten diese Computer in der Regel Zehntausende von Dollar, einschließlich Speicher und Peripheriegeräte.
Heutzutage können Sie mit einem eingebetteten 16-Bit-Mikrocontroller die gleiche oder eine größere Computerleistung erzielen, die in Einzelmengen bis zu vier Dollar kostet - einschließlich integriertem RAM und E / A-Controllern. Ein 32-Bit-Mikrocontroller kostet vielleicht ein oder zwei Dollar mehr.
Wenn ich diese kleinen Leute programmiere, was ich in 90% der Fälle mache, wenn ich nicht die Boards entwerfe, auf denen sie sitzen, stelle ich mir gerne vor, was der Prozessor machen wird. Wenn ich in Assembler schnell genug programmieren könnte, würde ich das tun.
Ich möchte nicht alle Arten von Abstraktionsebenen. Ich debugge oft, indem ich durch eine Dissembler-Liste auf dem Bildschirm gehe. Das ist viel einfacher, wenn Sie das Programm zunächst in C geschrieben haben.
quelle
Es dominiert nicht ganz, da C ++ zunehmend verwendet wird, da sich die Compiler verbessert haben und die Hardwareleistung gestiegen ist. C ist jedoch aus einigen Gründen immer noch sehr beliebt.
Breite Unterstützung. Nahezu jeder Chiphersteller stellt einen AC-Compiler zur Verfügung, und jeder Beispielcode und Treiber wird wahrscheinlich in c geschrieben. C ++ - Compiler sind immer häufiger anzutreffen, aber für einen bestimmten Chip kein totes Zertifikat, und sie sind häufig fehlerhafter. Sie wissen auch, dass jeder Embedded-Ingenieur in der Lage sein wird, in c zu arbeiten. Es ist die Verkehrssprache der Branche.
Performance. Ja, du hast es gesagt. Die Leistung ist nach wie vor entscheidend, und in einer Umgebung, in der Kernroutinen noch häufig in Assembler geschrieben oder zumindest in Bezug auf die Assembly-Ausgabe in c optimiert werden, darf die Bedeutung dieser Funktion nicht unterschätzt werden. Eingebettete Ziele sind oft sehr kostengünstig und haben sehr kleine Speicher und wenige Mips.
Größe. C ++ ist tendenziell größer. Sicherlich wird alles, was die STL verwendet, größer sein. Im Allgemeinen sowohl hinsichtlich der Programmgröße als auch des Speicherbedarfs.
Konservatismus. Es ist eine sehr konservative Branche. Zum einen, weil die Ausfallkosten oft höher sind und das Debuggen oft weniger zugänglich ist, zum anderen, weil es nicht geändert werden muss. Für ein kleines eingebettetes Projekt macht c die Arbeit gut.
quelle
Bei eingebetteten Systemen ist die Leistung das Wichtigste . Aber wie Sie sagten, warum C und nicht irgendeine andere performante Sprache?
Viele Leute haben bisher die Verfügbarkeit von Compilern erwähnt , aber niemand hat die Verfügbarkeit von Entwicklern erwähnt . Viele Entwickler kennen C bereits als beispielsweise OCaml.
Das sind die drei Biggies.
quelle
Embedded Software ist ganz anders.
In einer Desktop-App sparen Sie durch Abstraktionen und Bibliotheken viel Entwicklungszeit. Sie haben den Luxus, ein paar Megabyte oder Gigabyte RAM oder einige 64-Bit-CPU-Kerne mit 2 + GHz auszugeben, und jemand anderes (Benutzer) bezahlt für diese Hardware. Möglicherweise wissen Sie nicht, auf welchen Systemen die App ausgeführt wird.
In einem eingebetteten Projekt sind die Ressourcen oft sehr begrenzt. In einem Projekt, an dem ich gearbeitet habe (Prozessoren der PIC 17X-Serie), verfügte die Hardware über 2 KB Programmspeicher, 8 Ebenen (in-Hardware) Stack und 192 Byte (<0,2 KB) RAM. Unterschiedliche E / A-Pins hatten unterschiedliche Funktionen, und Sie haben die Hardware nach Bedarf konfiguriert, indem Sie in Hardwareregister geschrieben haben. Das Debuggen umfasst ein Oszilloskop und einen Logikanalysator.
In eingebetteten Umgebungen stören Abstraktionen häufig und verwalten (und kosten) Ressourcen, die Sie nicht haben. ZB haben die meisten eingebetteten Systeme kein Dateisystem. Mikrowellenherde sind eingebettete Systeme. Kfz-Motorsteuerungen. Einige elektrische Zahnbürsten. Einige Kopfhörer mit Geräuschunterdrückung.
Ein sehr wichtiger Faktor für mich bei der Entwicklung eingebetteter Systeme ist die Kenntnis und Kontrolle darüber, in was der Code in Bezug auf Anweisungen, Ressourcen, Speicher und Ausführungszeit übersetzt wird. Oft steuert die genaue Reihenfolge der Anweisungen z. B. das Timing für die Wellenformen der Hardwareschnittstelle.
Abstraktionen und "Magie" hinter den Kulissen (z. B. ein Müllsammler) eignen sich hervorragend für Desktop-Apps. Garbage-Collectors ersparen Ihnen viel Zeit bei der Suche nach Speicherlecks, wenn Speicher dynamisch zugewiesen wird / werden kann.
In der Echtzeit-Embedded-Welt müssen wir jedoch wissen und steuern, wie lange die Dinge dauern, manchmal bis zu Nanosekunden, und können kein weiteres paar Megabyte RAM oder eine schnellere CPU für ein Problem ausgeben. Ein einfaches Beispiel: Beim Software-Dimmen von LEDs durch Steuern des Arbeitszyklus (die CPU hatte nur die Ein- / Aus-Steuerung der LEDs) ist es NICHT in Ordnung, dass der Prozessor ausgeht und z. B. eine Speicherbereinigung für 100 ms durchführt, da die Anzeige sichtbar wäre Blitz hell oder erlöschen.
Ein hypothetischeres Beispiel ist eine Motorsteuerung, die Zündkerzen direkt zündet. Wenn diese CPU abschaltet und 50 ms lang Müll sammelt, wird der Motor für einen Moment ausgeschaltet oder an der falschen Kurbelwellenposition gezündet, wodurch der Motor möglicherweise abgewürgt wird (während er vorbeifährt?) Oder mechanisch beschädigt wird. Sie könnten jemanden töten lassen.
quelle