Wird es in Zukunft möglich sein, Code in C ++ für PIC-Mikrocontroller zu schreiben?

8

Wird es jemals möglich sein, C ++ zum Codieren von PICs zu verwenden? Gibt es Hardwareeinschränkungen, die uns daran hindern, C ++ zu verwenden? Um wie viel erhöhen sich die Größe der generierten .hex-Datei und die Laufzeit des Programms, wenn wir C ++ anstelle von C verwenden? Ist es praktisch möglich, C ++ für aktuelle PICs zu verwenden? Gibt es diesbezüglich zukünftige Pläne oder Weiterentwicklungen?

hkBattousai
quelle
Ich denke, es ist möglich und wird möglich bleiben, aber AFAIK wird nicht empfohlen, da es
übergeordnete
3
Für die Eignungsdebatte - electronic.stackexchange.com/questions/3027/…
Toby Jaffey
2
Da die Antwort lautet "Ja, es gibt bereits C ++ - Compiler", werde ich diesen einen stehen lassen, aber in Zukunft sollten Sie sich darüber im Klaren sein, dass es bei Stack Exchange-Fragen um nachprüfbare Fakten gehen sollte, nicht um Vermutungen über die Zukunft.
Kevin Vermeer
2
@clabacchio: Nicht unbedingt wahr. In C ++ zahlen Sie nur für das, was Sie verwenden. Siehe meine Antwort unter: electronic.stackexchange.com/questions/3027/…
Rocketmagnet
"PICs" ist eine nutzlose Verallgemeinerung. Auf einigen Low-End-PICs (denken Sie an 10F200) ist C fast unmöglich zu verwenden. Auf einigen High-End-PICs (32MX-Serie) soll C ++ derzeit verwendet werden, und es gibt sicherlich keinen technischen Grund, warum dies nicht möglich ist. Eine bessere Fokussierung könnte also eine brauchbarere Antwort geben. Im Moment beantwortet tatsächlich jeder eine andere Frage.
Wouter van Ooijen

Antworten:

17

Wird es jemals möglich sein, C ++ zum Codieren von PICs zu verwenden?

Ja, das ist jetzt möglich. Für dsPIC gibt es den IAR Systems C ++ - Compiler (obwohl er sehr alt ist und nicht unterstützt wird).

Eine andere Option ist die Verwendung eines C ++ zu C-Konverters. Konvertieren Sie C ++ mithilfe eines Pre-Build-Schritts in C und geben Sie das (böse aussehende) C Ihrem normalen C-Compiler. Schauen Sie sich LLVM oder Comeaus C ++ - Compiler an, die beide das tun. Comeaus kostet nur 50 US-Dollar, aber es wird wahrscheinlich einige Mühe kosten, bis die gesamte Toolchain und die Bibliotheken ordnungsgemäß funktionieren.

Gibt es Hardwareeinschränkungen, die uns daran hindern, C ++ zu verwenden?

Kurze Antwort, nein, es gibt keine Hardwareeinschränkungen. Lange Antwort, C ++ empfiehlt sicherlich die Verwendung eines Heaps und / oder Stacks, mit dem kleinere MCUs mit begrenztem RAM zu kämpfen haben.

Warum kämpfen sie mit einem Haufen / Stapel? Aus zwei Gründen: A) Viele MCUs haben begrenzten RAM, nicht genug für einen Heap und kaum genug für einen Stack. B) Viele MCUs verarbeiten Zeiger nicht gut, sodass die Verwendung von Variablen auf dem Stapel die Leistung wirklich beeinträchtigt.

Wenn Leute nach der Verwendung von C ++ auf einer MCU fragen, finde ich es konstruktiv, C ++ mit C zu vergleichen. Genau die gleichen Fragen wurden (und werden) über C auf einer MCU gestellt. Die Leute hielten sich immer an die Idee. Eine Hochsprache auf 256 Byte RAM MCU? Unmöglich. Aber jetzt wissen wir alle, dass es möglich ist. Ich habe C für einen PIC12 geschrieben. Kein Problem. Dies ist möglich, weil A) die Softwareentwickler wissen, dass sie etwas vorsichtig sein müssen: Verwenden Sie nicht malloc () usw. und B) der Compiler wurde speziell für die MCU geschrieben. Der Compiler ist auch bei der Speicherzuweisung besonders vorsichtig. Er versucht nicht, einen Heap zu erstellen, und erstellt möglicherweise keinen Stapel. Bei einigen C-Compilern können Sie einfach keinen rekursiven (rekursiven) Code schreiben, für den unbedingt ein Stapel erforderlich ist.

In dem Wissen, dass es möglich ist, C für eine MCU zu schreiben, gelten die gleichen Antworten für die Frage, C ++ auf einer MCU zu schreiben. Solange der Compiler die Einschränkungen des Zielgeräts versteht und der Benutzer auch die Sprache versteht, gibt es wirklich kein Problem. In C ++ zahlen Sie nur für das, was Sie verwenden. Es ist durchaus möglich, C ++ (mit Objekten und allem) zu schreiben, das genau die asm-Ausgabe erzeugt, die Sie erhalten hätten, wenn Sie C verwendet hätten.

Jetzt können PIC32s sicherlich mit C ++ umgehen. Sie haben bis zu 64 KB RAM und basieren auf dem MIPS-Kern, einem richtig erwachsenen 32-Bit-Prozessor. Es kann sowohl mit Zeigern und einem Stapel als auch mit einem PC umgehen. In der Tat gibt es PCs, die auf dem MIPS basieren (oder zumindest früher).

Leider gibt es so viele Missverständnisse in Bezug auf C ++. Selbst sehr erfahrene Programmierer scheinen keine Ahnung zu haben, wie die Sprache funktioniert. Siehe meine Antwort, warum C ++ für eingebettete CPUs geeignet ist.

Um wie viel erhöhen sich die Größe der generierten .hex-Datei und die Laufzeit des Programms, wenn wir C ++ anstelle von C verwenden?

Wie gesagt, es kann keinen Unterschied geben. Bjarne Stroustrup hat eine Reihe von C / C ++ - Compilern verglichen, um die Zeit- und Raumleistung für eine Reihe von Operationen zu vergleichen. Die Ergebnisse waren sehr unterschiedlich. In einigen Fällen kam das C ++ langsamer und größer heraus, in einigen Fällen langsamer und kleiner oder schneller und größer und sogar schneller und kleiner! Die Antwort auf Ihre Frage lautet also, dass sie stark vom Compiler abhängt, aber im Allgemeinen muss es überhaupt keinen Unterschied machen. Weitere Informationen finden Sie im Technischen Bericht zur C ++ - Leistung

Gibt es diesbezüglich zukünftige Pläne oder Weiterentwicklungen?

Das weiß ich nicht. Ich weiß, dass der Microchip C32-Compiler Open Source ist und Sie die Quelle herunterladen können. Ich weiß auch, dass jemand, mit dem ich zusammengearbeitet habe, tatsächlich einige Anweisungen online gefunden und es geschafft hat, den Compiler dazu zu bringen, C ++ - Code zu kompilieren. Aber er verließ die Firma, bevor er mich mit einer richtigen Werkzeugkette ausstatten konnte.


AKTUALISIEREN

Microchip verfügt jetzt über einen C ++ - Compiler für seine PIC32-Reihe eingebetteter MCUs.


Raketenmagnet
quelle
von der IAR-Webseite: "Legacy-Produkt: IAR Embedded Workbench für dsPIC ist ein Legacy-Produkt. IAR Systems aktualisiert es nicht und es ist nicht möglich, eine Support- und Update-Vereinbarung dafür zu kaufen."
Jason S
Ich weiß, dass IAR-Produkte großartig sind, aber leider sehr teuer und es scheint "alt". Ich weiß, dass C ++ auf jeder Plattform möglich ist, solange Sie nicht alle Funktionen nutzen. Es bietet jedoch die Möglichkeit einer zusätzlichen Abstraktionsebene mit Klassen. Ich verwende Vorlagen nicht oft und auch keine dynamischen Speicherzuordnungen. Kennt jemand zufällig einen anderen Konkurrenten für C ++ auf PIC24 / PIC32?
Hans
Ja, sorry, es war kein großartiger Fund. Lassen Sie mich meiner Antwort noch einige Dinge hinzufügen.
Raketenmagnet
1
Ich würde C als Konkurrent für C ++ auf einem Mikrocontroller betrachten. Ich kann mir nichts vorstellen, was ich in C ++ tun möchte, was ich in C nicht tun kann, und es gibt weniger unsichtbare Funktionsaufrufe (Konstruktoren, Destruktoren usw.). Macht den Code deterministischer und klarer. Welche Funktionen von C ++ sind ein Muss, das mit C nicht verwechselt werden kann?
AngryEE
1
Man könnte fragen: "Welche Funktionen von C sind ein Muss, die in ASM nicht durcheinander gebracht werden können?" Antworte "Nichts". Die Vorteile sind eine verbesserte Fähigkeit des Designers, das Design anzugeben und den Compiler überprüfen zu lassen, ob die Implementierung korrekt ist. In meiner Antwort electronic.stackexchange.com/questions/3027/… finden Sie eine Liste der tatsächlichen und unmittelbaren Vorteile von C ++ in dieser Hinsicht.
Raketenmagnet
5

Um wie viel erhöhen sich die Größe der generierten .hex-Datei und die Laufzeit des Programms, wenn wir C ++ anstelle von C verwenden?

Hängt davon ab, welche Funktionen Sie verwenden. Wenn Sie die objektorientierten Kernfunktionen (Klasse + Methoden) verwenden, hat dies wahrscheinlich nur sehr geringe Auswirkungen (verstümmelte Variablen- / Funktionsnamen sind länger, sodass die Symboltabelle wahrscheinlich etwas zunimmt). Mit einem guten Compiler sollten Vorlagen auch nicht viel hinzufügen.

Wenn Sie total verrückt werden und Dinge wie die Standardvorlagenbibliothek aufrufen und dynamische Speicherzuweisungen und Ausnahmen verwenden, werden Sie wahrscheinlich auf aufgeblähten Code stoßen.

Jason S.
quelle
Seien Sie nur eine Warnung für das OP und achten Sie sehr auf die Speicherzuweisung auf kleinen Speicherarchitekturen und eingebetteten, ständig laufenden Systemen.
Kenny
Könnte der "-1" bitte kommentieren, warum er / sie nicht zustimmt?
Jason S
Ich bin nicht der -1er, aber Vorlagen sind eine Funktion, die mit großer Sorgfalt verwendet werden muss, um ein Aufblähen des Codes zu vermeiden. Sie können leicht mit vielen Kopien eines Algorithmus enden, wenn einer ausreichen würde.
Peter Green
Zu tun , dass Sie tatsächlich zu würden verwenden die Vorlage mit mehreren unterschiedlichen Datentypen und eine Kopie wäre nicht ausreichen , wenn Sie polymorphen Code verwenden , die eine gemeinsame Basisklasse hat. (In diesem Fall fallen Laufzeitkosten an.) Vorlagen verursachen nicht auf magische Weise ein Aufblähen Ihres Codes. Sie verursachen nur aufgeblähten Code, wenn Sie sie mit mehreren Datentypen verwenden, wenn Sie sich der Konsequenzen nicht bewusst sind.
Jason S
1

Um Ihre Frage etwas zu verallgemeinern, gibt es ARM-Prozessoren, die für den eingebetteten Markt entwickelt wurden und eine MMU (Memory Management Unit) enthalten. Die Speichergröße und -zuordnung führten dazu, dass Sprachen wie Java und C ++ schlecht eingebettet waren. Da eingebettete Prozessoren immer schneller und leistungsfähiger werden und der Speicher dichter und billiger wird, ändern sich die Sprachoptionen für eingebettete Ingenieure dramatisch. Ein 32-Bit-600-MHz-ARM-Prozessor mit MMU und einer 64G-Flash-Karte ist ein hervorragender Kandidat für C ++ - Anwendungen. Ob es zur Definition des klassischen Embedded-Prozessors passt, ist ein weiteres Problem.

Speer
quelle
0

Wahrscheinlich ja ... aber Sie sollten es sowieso nicht ... C ist die Sprache von Embedded und es gibt keine Vorteile von C ++. Oder besser gesagt, die Vorteile von C überwiegen bei weitem die Vorteile von C ++ für Embedded. Verschwenden Sie nicht Ihre Zeit.

  • Wenn Sie wissen, wie man Funktionszeiger usw. verwendet. Sie können wie C ++ codieren, da gibt es kein Problem.
Ktc
quelle
5
Ich bin anderer Ansicht. Sie können viele Funktionen von C ++ (Klassen, Vorlagen, Überladen von Operatoren, Referenzen) mit geringen bis keinen Laufzeitkosten verwenden. Ja, Sie können all diese Dinge in einfachem C mit hackigen Konstrukten tun, aber es ist eine Belastung für Ihr Gehirn, und ich würde viel lieber C ++ verwenden. (Natürlich würde ich viel lieber eine bessere Sprache verwenden, aber ich würde sofort einen C ++ - Compiler über C auswählen.)
Jason S
1
Klassen = Strukturen (ohne integrierte Methoden, aber wenn Sie möchten, können Sie einen Funktionszeiger in der Struktur speichern und diesen aufrufen). Vorlagen = Sie verwenden diese ??? Operatorüberladung = ja das würde mir auch gefallen. Referenzen = Zeiger, nein? Zumindest mit C können Sie nur die 'Funktionen' von C ++ verwenden, die Sie möchten, ohne sich um übermäßige Codegenerierung sorgen zu müssen oder eine zufällige große Bibliothek einschließen zu müssen, um etwas zum Kompilieren zu erhalten.
AngryEE
1
Ich bitte auch, mich zu unterscheiden.
Raketenmagnet
3
Ja, Vorlagen sind eine äußerst leistungsstarke Methode, um zuverlässigen und leistungsstarken Code zu generieren. Referenzen sind ein zuverlässigerer Zeiger. Mit C ++ zahlen Sie auch nur für die Funktionen, die Sie verwenden. Ich denke, Sie müssen C ++ wirklich besser verstehen.
Raketenmagnet
3
Ich weiß nicht, was Sie mit "C ist die Sprache der Einbettung" meinen. Sicher, es ist sehr beliebt. Wollen Sie damit sagen, dass es die bestmögliche Sprache ist? Sicher nicht.
Raketenmagnet