Was sind die Vorteile jeder Sprache bei der Verwendung des Arduino?
Ich denke, das ist eine gute allgemeine Frage, aber ich füge ein bisschen hinzu, warum ich frage, ob mir jemand einen Tipp geben möchte.
Ich habe Erfahrung mit vorverarbeiteten Sprachen wie JavaScript und PHP und habe mit Sprachen wie Java und Visual Basic experimentiert. Mit anderen Worten, ich kenne Programmiertechniken und sowohl klassische als auch prototypische Objektorientierung, aber nichts davon, direkt mit Hardware zu kommunizieren.
Ich mache einen Oktokopter und denke, dass ein objektorientierter Ansatz am einfachsten sein wird. (Die Software wird sehr viele Funktionen haben ...) Allerdings habe ich noch nie in C ++ geschrieben.
Da dies eine Q & A-Site ist, die anderen helfen soll, ist nur die allgemeine Frage von großer Bedeutung, aber ich würde mich über Kommentare zu meiner Situation freuen.
quelle
C++ vs. The Arduino Language?
- Die "Arduino-Sprache" ist C ++. Es gibt ein bisschen Vorverarbeitung, um Ihnen das Durchführen von Funktionsprototypen zu ersparen, aber es ist definitiv C ++.Antworten:
Meine persönliche Erfahrung als Professor (Programmierung, Mechatronik) ist, dass es besser ist, sich für C / C ++ zu entscheiden, wenn Sie über Programmiererfahrung verfügen und sich mit Konzepten wie OOP auskennen. Die Arduino-Sprache ist wirklich großartig für Anfänger, hat aber einige Einschränkungen (z. B. müssen Sie alle Ihre Dateien im gleichen Ordner haben). Und es ist im Grunde eine Vereinfachung von C / C ++ (Sie können Arduino-Code praktisch kopieren und in eine C / C ++ - Datei einfügen, und es wird funktionieren). Es ist auch sinnvoll, eine bekannte IDE als Eclipse zu verwenden:
http://playground.arduino.cc/Code/Eclipse
Anfänglich ist etwas mehr Zeit für die Einrichtung und Konfiguration Ihrer Entwicklungsumgebung erforderlich, aber meiner Meinung nach lohnt es sich für Programmierer, die Erfahrung in einer anderen Sprache haben.
In jedem Fall schadet es Ihnen nicht, die Arduino-Sprache und die Arduino-IDE einige Tage lang zu verwenden, um sich mit der Arduino-Hardware vertraut zu machen, und dann mit Eclipse auf C / C ++ zu wechseln, um Ihr Projekt wirklich zu entwickeln.
quelle
In der Theorie ...
Es gibt eigentlich keine Arduino-Sprache als solche. Es ist wirklich nur C ++ mit einigen domänenspezifischen Bibliotheken. Diese fügen verschiedene Funktionen hinzu, z. B. Funktionen, die Sie zur Steuerung der Hardware aufrufen können. Wenn Sie diese Funktionen nicht hätten, müssten Sie direkt mit speziellen Registern fummeln, um alles zu steuern. So wird normalerweise die eingebettete Programmierung durchgeführt. Es ist schnell, aber es kann ziemlich schwer zu lernen und zu verstehen sein.
Zusätzlich zu den Funktionen fügen die Bibliotheken für einige Typen alternative Namen hinzu. Zum Beispiel
boolean
undbyte
sind nicht im C ++ Standard. Sie sind jedoch direkt gleichbedeutend mitbool
undunsigned char
.All diese Dinge bedeuten, dass Sie wahrscheinlich allgemeinen C ++ - Code ohne Schwierigkeiten direkt nach Arduino portieren können. Wenn Sie jedoch in die andere Richtung zurückkehren, ist möglicherweise eine geringfügige Bearbeitung erforderlich.
In der Praxis ...
Trotzdem ist die Programmierung für Arduino nicht mit der allgemeinen C ++ - Programmierung identisch. Viele der Unterschiede gelten jedoch für alle eingebetteten Programme (z. B. begrenzter Speicher und begrenzte Rechenleistung).
Es ist auch erwähnenswert, dass, wenn Sie die offizielle Arduino IDE verwenden, es alle möglichen nervigen Macken und Einschränkungen gibt, wie Sie Ihren Code einrichten. Es gibt in allen Fällen Problemumgehungen (soweit mir bekannt ist), die jedoch manchmal recht frustrierend sind.
Verwenden Sie für volle Flexibilität eine IDE eines Drittanbieters (wie Eclipse) mit einem Plug-In, um Arduino zu unterstützen. Das sollte Ihnen alle Vorteile von C ++ zusammen mit den Arduino-Bibliotheken bieten.
quelle
Erstens akzeptiert der Arduino-Compiler / die IDE C und C ++ wie sie sind. Tatsächlich sind viele der Bibliotheken in C ++ geschrieben. Ein Großteil des zugrunde liegenden Systems ist nicht objektorientiert, könnte es aber sein.
Somit ist "Die Arduino-Sprache" C ++ oder C.
C ++ ist kein Müll gesammelt. Es verwaltet Variablen im Gültigkeitsbereich - wenn Sie schreiben:
Dann wirst du das finden
led
undi
nicht wachsen oder auslaufen, egal wie oft du anrufstblinkTimes
.Wenn
i
eine Klasse wäre, würde sie in ähnlicher Weise entsorgt, sobald die Funktion beendet ist. Solange Sie keinenew
oder ähnliche Speicherzuweisungsfunktionen zum Erstellen neuer Objekte verwenden, müssen Sie sich keine Gedanken über Undichtigkeiten machen.Wenn Sie große Klassen erstellen und viele davon in tief verschachtelten Funktionen verwenden, wird Ihnen möglicherweise immer noch der Speicher ausgehen. Im Allgemeinen treten jedoch erst dann Probleme auf, wenn Sie sich mit
new
undfree
Funktionen befassen .Wenn Sie verwenden
new
, müssen Siedelete
zu geeigneten Zeiten anrufen . C ++ und Arduino haben keine automatische Garbage Collection, Sie müssen explizit Ihren eigenen Speicher verwalten.quelle
Die Arduino-Sprache ist C ++, unterscheidet sich jedoch stark von den meisten C ++ - Varianten. In der Arduino-Sprache ist viel Abstraktion integriert, insbesondere in den Hardware-Schnittstellen, was die Verwendung sehr einfach macht. Wenn Sie einen Hintergrund in Java haben, sollten C und C ++ sehr ähnlich sein.
Die Hauptunterschiede zwischen Arduino und C ++ liegen im Speicher. Normalerweise verfügt ein moderner Computer über mehr als 2 GB RAM, während der Arduino Uno über 2 KB (1 Million Mal weniger) verfügt. Das Arduino verwendet auch 8-Bit-Anweisungen anstelle der 32-Bit-Anweisungen, die ein Computer verwendet. Dies wirkt sich hauptsächlich auf die Informationsmenge aus, die Sie in einer Variablen speichern können.
Wenn Sie in der Arduino-Welt noch sehr jung sind, sollten Sie ein Tutorial nachschlagen, da es viele gute gibt.
quelle
int blah = 5;
), werden sie automatisch zerstört, wenn sie den Gültigkeitsbereich verlassen (dh am Ende der Schleife oder Funktion). Wenn Sie sie jedoch auf dem Heap instanziieren (z. B.int *blah = new int(5);
), müssen Sie sie selbst freigeben. In der Regel ist es jedoch nicht ratsam, Heap-Daten in der eingebetteten Programmierung zu verwenden.--- Update 170412
Ich habe meine ursprüngliche Antwort vor drei Jahren aus der Sicht geschrieben, dass es ein bestimmtes "Arduino C ++" gibt. Die in der IDE verwendete Sprache ist Standard-C ++, da sie vom GNU C ++ - Compiler implementiert wird. "Scheinbare" Unterschiede schleichen sich ein, da die IDE einige Vorverarbeitungsschritte vornimmt, um Neulingen bei der Sprachumstellung zu helfen, indem sie einige #includes (f / ex) ausfüllt. Aber Sie können - und ich auch - korrektes C ++ schreiben und bekommen genau das, was Sie erwarten.
--- Update beenden
Beschränken Sie die Verwendung von C ++ - Sprachfunktionen auf diejenigen, deren Implementierung Sie vollständig verstehen. Es gibt einige Funktionen, die sich zu ressourcenintensiverem Code kompilieren lassen, als dies beim Lesen des Quellcodes offensichtlich ist. Die optional generierte .lss-Auflistung (zusammengeführte Quelle und Assembly) gibt Ihnen einen guten Einblick in die Funktionsweise des C ++ - Compilers, als Sie nicht nachgesehen haben.
Zu Ihrer Frage zum Arbeitsspeicher: C ++ sammelt keine Daten. Stapelbasierte Sprachen wie C und C ++ weisen beim Funktionseintrag temporären Speicher für automatische Variablen auf dem Stapel zu, der dann freigegeben wird, wenn die Funktion zurückgegeben wird. Dies ist jedoch keine echte Garbage Collection. Objekte, die im Heap- oder globalen Speicher erstellt wurden, bleiben erhalten, bis Sie sie explizit löschen. Stellen Sie sicher, dass Sie wissen, wo, wann und wie lange verschiedene Arten von Objekten erstellt werden. Sie möchten wirklich nicht, dass Ihre Code-
new
unddelete
Codeing-Objekte nicht ohne Weiteres ausgeführt werden. Sie werden im Heap-Speicher erstellt, fragmentieren ihn und lassen ihn in den Stapel hineinwachsen. Dann stürzt Ihr Code - und Ihr netter Hubschrauber - ab.C tut weniger für Sie , damit es weniger tun können , um Sie. Es ist keine schlechte Wahl. C mit einigen der C ++ - Funktionen kann eine noch bessere Wahl sein, vorausgesetzt, Sie wählen die zusätzlichen Funktionen mit Bedacht aus. C ++, wenn dies Ihre beiden Möglichkeiten sind:
[Originale Antwort] - C ++ ist eine standardisierte Sprache. Es ist weit verbreitet in vielen Umgebungen, einschließlich eingebetteter Systeme, und wird daher eingehender getestet als die C ++ - ähnliche Sprache "Arduino". Dies ist besonders wichtig für unternehmenskritische / sicherheitskritische Anwendungen, wie Sie sie planen. Abgestürzter Code bedeutet einen abgestürzten Hubschrauber und selbst wenn er niemanden verletzt, wird Ihr teurer Computer beschädigt .
Als Standard ist C ++ portabel. Müssen Sie Ihren Prozessor aktualisieren? Alles andere als Silizium-spezifischer Code wird auf den neuen portiert. Müssen Sie Ihr Toolset, Ihr Entwicklungssystem und Ihr Host-Betriebssystem ändern? C ++ wird überall unterstützt. Obwohl Arduino IDE überall dort ausgeführt wird, wo Java unterstützt wird, ist es das einzige Tool, das Arduino C ++ verwendet, und es ist ein sehr eingeschränktes Tool. Wenn Sie Eclipse, die AVR-Tools, verwenden möchten, barfuß auf der Befehlszeile arbeiten, in Emacs entwickeln oder in einer anderen von Ihnen bevorzugten Umgebung arbeiten möchten, wird Standard-C ++ unterstützt.
Die Arduino-IDE erledigt Dinge hinter Ihrem Rücken - und zwar # schließt sie .h-Dateien ein, wenn sie denkt, dass Sie sie benötigen. Selbst wenn es richtig ist, möchten Sie wirklich alles schreiben oder zumindest sehen und verstehen, was der Compiler sehen wird. Programmiersprachen sind nicht für Computer gedacht (Computer essen zum Frühstück etwas). Sie sind für Leute gemacht, speziell für die Leute, die Ihnen bei dem Projekt folgen, von denen die wichtigsten vielleicht ... Sie! wahrscheinlich, beheben Sie es. Sie möchten wirklich alles sehen können, was der Compiler sieht.
quelle
Nach meiner Erfahrung ist es am besten, neue und Löschvorgänge zu vermeiden, wenn Sie auf Computern mit begrenztem Arbeitsspeicher ausgeführt werden.
Es mag Fälle geben, in denen es gerechtfertigt ist, dynamische Instanzkonstruktion und -zerstörung zu verwenden, aber ich vermute, dass sie selten sind.
quelle
new
unddelete
sind auch in Arduino IDE verfügbar.Wie in mehreren Antworten erwähnt, sollten Sie beim Programmieren eines eingebetteten Systems im Allgemeinen neue vermeiden, es sei denn, Sie verwalten Ihren eigenen Speicherhaufen und wissen wirklich, wie Ihre Objektlebenszyklen aussehen werden. Statische Zuordnungen oder Stapelvariablen sind viel sicherer. Ein gängiger Trick, um beispielsweise Puffer variabler Länge zu verwalten, die für die Dauer einer Funktion zugewiesen sind, besteht darin, eine automatische Variable (auf dem Stapel) zu haben, die ein Objekt ist, das in seinem Konstruktor neu aufruft , und den Löschvorgang dann im Destruktor abzulegen Wenn das Objekt den Gültigkeitsbereich verlässt, wird der Puffer wieder an den Heap freigegeben. Auch dies ist in kleinen Mikros normalerweise von begrenztem Nutzen, aber es ist ein schönes Muster, an das man sich erinnert.
quelle
Zusätzlich zu den obigen Kommentaren möchte ich die Probleme mit dem Arbeitsspeicher, die Sie auf Arduino-Platinen haben, weiter hervorheben, insbesondere mit dem Uno (und anderen, die denselben Mikrocontroller verwenden). Ich habe kürzlich ein einfaches Space Invaders-Spiel geschrieben, das auf einer 32x32-LED-Matrix läuft, und bin wiederholt auf Probleme gestoßen, die durch zu wenig Arbeitsspeicher verursacht wurden.
Der Uno hat nur 2048 Bytes RAM. Die Bibliothek für meine Matrix übernahm 3/4 davon und ließ mir rund 400 Bytes für das Spiel übrig. Da ich beabsichtige, das Projekt irgendwann zu "upgraden", um mehrere Spiele mit demselben Programm auf der Grundlage des leistungsfähigeren Due auszuführen, habe ich den Code mit OO-Prinzipien und viel Klassenvererbung entworfen. (Die Spielklasse wurde mit virtuellen Aktualisierungs- und Ziehungsaufrufen vererbt, die Spieleinheiten wurden alle vererbt).
Mir ging so ziemlich der Speicher aus, als ich die Eindringlinge hinzufügte. Ich habe versucht, Speicherplatz zu sparen, indem ich ihre Mitgliedsvariablen bitweise abgetastet habe, aber beim Hinzufügen der Schildobjekte ging mir der Speicherplatz wieder aus. Nachdem ich ein bisschen mehr geschabt hatte, lief ich aus und fügte die Bomben / Kugeln hinzu. Zu diesem Zeitpunkt durchsuchte ich den Code und entfernte alle "virtuellen" Tags (alle meine Klassenprototypen werden aus einem Visual Assist-Snippet erstellt und alle Destruktoren werden automatisch virtuell). Dies halbierte sofort meinen Speicherverbrauch und gab genug frei, um den Code zu vervollständigen.
Kurz gesagt, das Endergebnis ist C ++ - Code, der keine C ++ - Funktionen verwendet. Möglicherweise halten Sie sich auch nur an C und sind sich Ihrer Speichernutzung sehr bewusst. Wenn Sie die 2 KB überschreiten, erhalten Sie keine Hilfe. Insbesondere, wenn Sie eine dynamische Zuordnung verwenden, funktioniert der Code nicht mehr und Sie kratzen sich eine Weile am Kopf, bis Sie die Möglichkeit eines Speicherüberlaufs in Betracht ziehen.
PS - Bitfeldvariablen sind schlecht. Sehr schlecht. Abgesehen vom zusätzlichen Verarbeitungsaufwand habe ich die Häufigkeit, mit der ich dem Spiel einen neuen Status hinzufüge, aus den Augen verloren, aber der Code wurde nicht ausgeführt und ich konnte nicht verstehen, warum. Meine Statusvariable war nicht breit genug, um den neuen Statuswert aufzunehmen, sodass ich einen unerwarteten Status erhielt.
quelle
Die Arduino-Sprache ist C ++ (obwohl sie normalerweise in einem Stil implementiert ist, der eher "C mit Klassen" ähnelt, was in der Welt der Mikrocontroller für eingebettete Systeme durchaus üblich ist). Ende der Geschichte. Genug mit den Leuten, die denken, dass es bereits eine andere Sprache ist! Es benutzt den g ++ Compiler.
Beweis:
Aktivieren Sie die ausführliche Ausgabe beim Kompilieren in den Voreinstellungen und beim Hochladen, und Sie werden viel lernen, wenn Sie nur diese Zeilen lesen.
Hier einige zusätzliche Einblicke:
Meine eigenen Worte:
Arduino-Code ist C ++. Die Arduino- Kernfunktionen sind einfach eine Reihe von C ++ - Klassen und -Bibliotheken, die Sie verwenden können. Es wird mit dem GNU-Compiler gcc / g ++ erstellt und kompiliert . Ihre setup () - und loop () -Funktionen werden einfach in die obligatorische main () -Funktion eingefügt ( hier tatsächlich - beachten Sie, dass die Datei "main.cpp" ist, eine C ++ - Quelldatei) und es gibt einige zusätzliche Vorverarbeitung, um sicherzustellen, dass es sich um ein gültiges C ++ - Programm handelt (z. B. Scannen aller Funktionsprototypen [auch bekannt als: Deklarationen], damit Sie eine Funktion verwenden können, obwohl der Prototyp später in Ihrer .ino-Datei enthalten ist). Ein Großteil von Arduino ist jedoch in einem "C-Stil" geschrieben und erfordert daher die
# extern "C" {}
geschweiften Klammern, um C ++ daran zu hindernDie Funktion "name-mangling" (auch als "name decorating / name decoration" bezeichnet ) ruft C-Funktionen auf, die von AVR-libc implementiert wurden , der C-Implementierung für den ATmega328 und andere Mikrocontroller mit AVR-Architektur .Arduino's Worte:
Quelle: https://www.arduino.cc/en/Main/FAQ#toc13
Wann soll die Arduino-Bibliothek im Vergleich zu reinem C oder C ++ verwendet werden?
Verwenden Sie also die Arduino-Sprache, um die Dinge zu vereinfachen, und schreiben Sie Ihre eigenen Funktionen, wenn Sie mehr Spezialisierung benötigen. Ich empfehle jedoch, schnell von der IDE wegzukommen, um Code zu schreiben - verwenden Sie ihn einfach zum Kompilieren. Stellen Sie die IDE-Einstellungen so ein, dass "Externer Editor" verwendet wird. Verwenden Sie dann einen professionellen Quellcode-Editor / eine IDE wie Sublime Text 3 , Atom , Visual Studio Code oder Eclipse CDT , um Ihren Code zu schreiben. Sie können dann auf die Arduino IDE zurückklicken, um sie zu kompilieren und hochzuladen. Wenn Sie sich für Eclipse entscheiden, gibt es Möglichkeiten, dies in Eclipse zu tun (siehe auch die anderen Antworten hier und den Artikel zu Eclipse auf dem Arduino-Spielplatz hier). Ziehen Sie daher auch die Verwendung dieser Techniken in Betracht.
quelle