Frage

Ich schreibe ein Programm, genauer gesagt einen Bootloader, für ein eingebettetes System. Ich werde eine C-Bibliothek verwenden, um mit einigen der Hardware-Komponenten zu interagieren, und ich habe die Wahl des Schreibens entweder in C oder C ++. Gibt es einen Grund, warum ich einen über die andere wählen soll? Ich brauche nicht die objektorientierten Eigenschaften von C ++, aber es ein stärkeren Typsystem hat. Könnte es andere Sprache Funktionen, die das Programm robuster machen würde? Ich kenne einige Leute C vermeiden ++, weil es kann (aber nicht immer) großen Firmware-Images erzeugen.

War es hilfreich?

Lösung

Dies ist keine besonders einfache Frage zu beantworten. Es hängt von einer Reihe von Faktoren, einschließlich:

  • Wie Sie es vorziehen, Ihren Code-Layout.
  • Ob es eine C ++ Compiler für Ihre Zielgruppe (und alle anderen Ziele, die Sie wünschen, können Sie den Bootloader auf verwenden).
  • Wie kritisch die Codegröße für Ihre Anwendung ist (wir etwa 10% mehr reden, als vielleicht nicht MB durch eine andere Antwort vorgeschlagen).

Ich persönlich mag Klassen als eine Möglichkeit, meinen Code von Auslegen. Auch wenn C-Code zu schreiben, werde ich neige dazu, alles in Moduldateien mit Datei-scope statischen Funktionen zu halten „Simulation“ Member-Funktionen und (wenige) Datei-scope statische Variablen zu „simulieren“ Membervariablen. Having said that, die meisten meiner bestehenden Embedded-Projekte (alle sind in relativ kleinem Maßstab bis zu einem Maximum von 128 kB Flash einschließlich Bootloader, aber in der Regel weniger) neigten dazu, nun in C geschrieben werden, dass ich einen C ++ Compiler aber, ich erwäge sicherlich zu C ++ zu bewegen.

Es gibt erhebliche Vorteile für C ++ von einfach Referenzen verwenden, Überlastung und Vorlagen, auch wenn Sie nicht so weit wie Klassen gehen. Sicherlich würde ich stutzen von viel mehr erweiterte Funktionen verwenden, einschließlich der Verwendung von dynamischen Speicherzuweisung (neu). Dann wieder, würde ich dynamische Speicherzuweisung vermeiden (malloc usw.) in Embedded C sowie, wenn möglich.

Wenn Sie einen C ++ Compiler (auch wenn es nur g ++), ist es wert, Ihren Code durch es nur für die zusätzliche Typprüfung ausgeführt wird, so dass Sie die Anzahl der Probleme in Ihrem Code zu reduzieren. Die C ++ Compiler auf ein paar Dinge abholen können, die auch statische Analyse-Tools nicht erkennen.

Für eine gute Diskussion über viele ungültige Gründe, warum Menschen C ++ ablehnen, finden Sie unter Dan Saks' Artikel auf Embedded.com .

Andere Tipps

Für einen Boot-Loader der offensichtliche Wahl ist C, vor allem auf einem Embedded-System. Der generierte Code muss an das Metall nahe sein, und sehr einfach zu debuggen, wahrscheinlich durch in Montag fallen, die schnell schwer in C ohne Pflege wird ++. Auch C-Tool-Ketten sind weit mehr als allgegenwärtige C ++ Werkzeug-Ketten, so dass Ihre Boot-Loader auf mehr Plattformen verwendet werden. Schließlich sind erzeugte Binärdateien der Regel kleiner und verbrauchen weniger Speicher, wenn C-Stil geschrieben.

Wenn Sie nicht brauchen, um Objektorientierung, verwenden Sie C. dort einfache Wahl. Sein einfacher und leichter, während die gleiche Aufgabe erreicht wird.

Einige sterben Harten wird nicht einverstanden sind, aber OO ist, was C ++ macht> C und umgekehrt in vielen Umständen ab.

würde ich C verwenden, wenn es einen bestimmten Grund ist C ++. Für einen Bootloader sind Sie nicht wirklich OO müssen.

Verwenden Sie das einfachste Werkzeug, das die Arbeit vollenden wird.

schreiben Programme in C ist nicht das gleiche, wie es in C ++ zu schreiben. Wenn Sie wissen, wie es in C ++ nur zu tun, dann ist Ihre Wahl C ++. Für Bootloader Schreiben wird es besser sein, den Code zu minimieren, so werden Sie wahrscheinlich Standard C ++ Bibliothek deaktivieren. Wenn Sie wissen, wie in C zu schreiben, dann sollten Sie C verwenden -. Es häufige Wahl für diese Art von Aufgaben

Die meisten der bisherigen Antworten annehmen, dass Ihr Bootloader ist klein und einfach, das ist in der Regel der Fall ist; jedoch, wenn es komplexer wird (dh Sie müssen von einem Ethernet-Port laden zu können, einen USB-Port oder einen seriellen Port ... Sie müssen den Code validieren, die geladen wird, bevor Sie Ihren vorhandenen Code auszulöschen, etc.) Sie möchten C ++ berücksichtigen.

Ich habe auch festgestellt, dass der Bootloader und die Anwendung in der Regel eine gewisse Menge an gemeinsamen Code teilen, so dass Sie auch die gleiche Sprache wie Ihre Anwendung mit berücksichtigen möchten den Code-Sharing zu erleichtern.

Die Sprache C ist wesentlich einfacher zu analysieren als C ++. Das bedeutet, ein Programm, das sowohl gültiges C und gültige C ++ ist schneller als C-Programm kompiliert wird. Wahrscheinlich kein großes Problem, aber es ist nur ein weiterer Grund, warum C ++ ist wahrscheinlich übertrieben.

Gehen Sie mit C ++ und objchoose welche Sprache Funktionen, die Sie benötigen. Sie haben noch die volle Kontrolle über den Objektcode ausgegeben, solange Sie die C ++ Abstraktionen zu verstehen, die Sie verwenden.

Die Verwendung von OO kann immer noch gut laufen, wenn Sie die Verwendung von virtuellen Funktionen vermeiden. Vermeiden Sie unveränderliche Objekttypen, die eine Menge Kopieren benötigen, um Werte zu übergeben, wie std :: string. Aber Sie können noch Funktionen wie Vorlagen verwenden, ohne wirkliche Auswirkungen auf die Laufzeit-Performance.

Mit C mit μClibc . Es wird Ihr Code einfacher und reduzieren ihre Präsenz machen. Zu finden in:. www.uclibc.org

Für eine solche spezifische Aufgabe als Bootloader würde ich auf jeden Fall nicht C ++ verwenden. Ich denke, den Standard C ++ Bibliothek ist mindestens ein paar MB, nicht etwas, das man in einem Bootloader will. Gehen Sie mit C.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top