it-swarm.com.de

Wie benutze ich C ++ 11, um das Arduino zu programmieren?

Wie kann ich c++11 beim Programmieren des Arduino? Ich würde entweder das Arduino IDE oder eine andere Umgebung verwenden. Ich bin am meisten an den Verbesserungen der Kernsprache interessiert, nicht an Dingen, die Standard-Bibliotheksänderungen erfordern.

51
walrii

Ab Version 1.6.6 aktiviert das Arduino IDE standardmäßig c ++ 11.

Für ältere Versionen lesen Sie weiter:

Es ist sehr einfach, die Flags zu ändern für jedes Element der Toolchain, einschließlich Assembler, Compiler, Linker oder Archivierer.

Getestet auf dem Arduino IDE Version 1.5.7 (veröffentlicht im Juli 2014),

  1. Suchen Sie die Datei platform.txt,
    • AVR-Architektur => {Installationspfad}\hardware\arduino\avr\platform.txt
    • SAM architecture => {Installationspfad}\hardware\arduino\sam\platform.txt
  2. In dieser Datei können Sie jedes Flag ändern, zum Beispiel
    • compiler.c.flags zum Ändern der Standard-Kompilierungsflags für C++ - Dateien.
    • compiler.cpp.flags zum Ändern der Standard-Kompilierungsflags für C++ - Dateien.
  3. Sie können auch jedes der "Rezepte" oder Kompilierungsmuster im entsprechenden Abschnitt der Konfigurationsdatei unter dem Titel "AVR/SAM-Kompilierungsmuster" ändern ".
  4. Nachdem Sie die Änderungen vorgenommen haben, müssen Sie muss die Arduino IDE neu starten, mindestens in Version 1.5.7.

Zum Beispiel,

m die Unterstützung für C++ 11 (C++ 0x) zu aktivieren, getestet auf Arduino IDE Versionen 1.5.7 und 1.5.8, fügen Sie einfach das Flag hinzu "-std = gnu ++ 11" am Ende der Zeile beginnend mit compiler.cpp.flags = ".

Es wird erwartet, dass C++ 11 in naher Zukunft standardmäßig auf der Arduino IDE aktiviert ist . Ab Version 1.5.8 (Okt. 2014) ist dies jedoch immer noch nicht der Fall.

45

Arduino IDE 1.6.6 ist C++ 11 standardmäßig aktiviert (in der Datei platform.txt ist das Compiler-Flag "-std = gnu ++ 11" gesetzt).

15
Capt

Erstens, nur gcc 4.7 und höher (und daher avr-gcc 4.7 und höher) support C++11. Überprüfen Sie daher die installierten Versionen mit:

gcc --version
avr-gcc --version

Wenn avr-gcc ist 4.7 oder höher, dann können Sie möglicherweise C++11.

Das Arduino IDE unterstützt keine benutzerdefinierten Compiler-Flags. Dies wurde angefordert aber noch nicht implementiert.

Sie müssen also keine anderen Umgebungen verwenden oder Ihr Programm direkt über die Befehlszeile kompilieren.

Falls Sie direkt über die Befehlszeile kompilieren möchten, verwenden Sie avr-gcc, Sie müssen lediglich ein zusätzliches Compiler-Flag hinzufügen, um die C++ 11-Unterstützung zu aktivieren.

-std=c++11

Für bestimmte Entwicklungsumgebungen würden die meisten das Bearbeiten der Compiler-Flags über die Erstellungsoptionen in der IDE unterstützen. Das oben genannte Flag muss zur Liste der Flags für jede Umgebung hinzugefügt werden.


C++0x war der Name des Arbeitsentwurfs des C++11 Standard. C++0x Unterstützung ist ab gcc 4.3 verfügbar. Dies ist jedoch eine rein experimentelle Unterstützung, so dass Sie nicht wirklich damit rechnen können, dass C++11 Features vorhanden sein. Hier ist die vollständige Liste der Funktionen, die mit der entsprechenden Version von gcc verfügbar sind. Verfügbarkeit von Funktionen in avr-gcc entspricht dem, was in der entsprechenden gcc -Version verfügbar ist.

Das Compiler-Flag für C++0x ist:

-std=c++0x
14
asheeshr

Ich benutze Ino und das hat funktioniert:

ino build -cppflags="-std=c++0x"

Dies erzeugte eine Hex-Datei mit einer Größe von mindestens 15 KB (bei aktivierten Optimierungen), verglichen mit etwa 5 KB für den Standard-Build, was eine Überlegung für einen armen kleinen Atmega328 ist. Könnte für einen der Mikrocontroller mit viel mehr Programmplatz in Ordnung sein.

1
hoosierEE

Bitte beachten Sie, dass es keine einfache Möglichkeit gibt, zusätzliche Flags von Arduino IDE) oder andere IDE (Eclipse, Codeblöcke usw.) oder Befehlszeile anzugeben .

Als Hack können Sie ein kleines Proxy-Programm verwenden (sollte plattformübergreifend sein):

//============================================================================
// Name        : gcc-proxy.cpp
// Copyright   : Use as you want
// Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
//============================================================================

#include <unistd.h>

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

int main(int argc, char *argv[]) {
    vector<string> arguments;
    vector<const char*> aptrs;

    // Additional options, one per line
    ifstream cfg((string(argv[0]) + ".ini").c_str());
    if (cfg.bad())
        cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;

    string arg;
    while (cfg) {
        getline(cfg, arg);
        if(arg == "\r" || arg == "\n")
            continue;
        arguments.Push_back(arg);
    }

    for (const string& arg : arguments)
        aptrs.Push_back(arg.c_str());

    for (int i = 1; i < argc; ++i)
        aptrs.Push_back(argv[i]);

    // Add null pointer at the end, execvp expects NULL as last element
    aptrs.Push_back(nullptr);

    // pass the vector's internal array to execvp
    const char **command = &aptrs[0];

    return execvp(command[0], command);
}
  1. Kompilieren Sie das Programm.
  2. Benennen Sie die ursprüngliche avr-g ++ .exe in avr-g ++. Orig.exe (oder einen anderen Namen) um.
  3. Erstellen Sie eine avr-g ++ .ini-Datei, in der die erste Zeile den vollständigen Pfad zum ursprünglichen Programm enthält (z. B. D:\Arduino\hardware\tools\avr\bin\avr-g ++. Orig.exe), und fügen Sie zusätzliche Parameter hinzu, einen pro Zeile. wie gewünscht.

Sie sind fertig!

Beispiel avr-g ++. Ini:

D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x

Ich hoffe, das hilft!

1
fAX