Jak używać c++11 do programowania Arduino?

Jak mogę używać c++11 podczas programowania Arduino? Byłbym w porządku używając albo Arduino IDE, albo innego środowiska. Najbardziej interesują mnie podstawowe ulepszenia językowe, a nie rzeczy, które wymagają zmian w bibliotece standardowej.

Author: Manishearth, 2013-04-12

5 answers

Od wersja 1.6.6, Arduino IDE domyślnie włącza c++11.

Dla starszych wersji Czytaj dalej:

Bardzo łatwo jest zmienić flagi dla dowolnego elementu łańcucha narzędzi, w tym asemblera, kompilatora, linkera lub archivera.

Testowany na wersji Arduino IDE 1.5.7 (wydany w lipcu 2014),

  1. Zlokalizuj platformę .plik txt ,
    • Architektura AVR = > {install path} \ hardware \ arduino \ avr \ platform.txt
    • Architektura SAM = > {install path}\hardware\arduino\sam\platform.txt
  2. wewnątrz tego pliku możesz zmienić dowolną flagę , na przykład,
    • kompilator.C. flagi do zmiany domyślnych FLAG kompilacji dla plików C++.
    • kompilator.cpp.flagi do zmiany domyślnych FLAG kompilacji dla plików C++.
  3. Możesz również zmienić dowolny z" przepisów " lub skompilować wzory, w odpowiednia sekcja pliku konfiguracyjnego pod tytułem "AVR / SAM compile patterns".
  4. po dokonaniu zmian, należy ponownie uruchomić Arduino IDE , przynajmniej w wersji 1.5.7.

Na przykład,

Aby włączyć obsługę C++11 (C++0x) , testowanego na Arduino IDE w wersjach 1.5.7 i 1.5.8, wystarczy dodać flagę "-std=gnu++11 " na końcu linii zaczynającej się od kompilatora.cpp.flags=".

Oczekuje się, że C++11 jest domyślnie włączone W najbliższej przyszłości na IDE Arduino. Jednak od wersji 1.5.8 (Październik 2014) nadal tak nie jest.

 37
Author: jose.angel.jimenez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 13:53:41

Arduino IDE 1.6.6 i nowsze mają domyślnie włączony C++11 (mają flagę kompilatora "-std=gnu++11" ustawioną na platformie.plik txt).

 15
Author: Capt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-12 18:11:19

Po pierwsze, tylko gcc 4.7 i powyżej (a zatem avr-gcc 4.7 i powyżej) wspierają C++11. Sprawdź więc zainstalowane wersje za pomocą:

gcc --version
avr-gcc --version

Jeśli avr-gcc wynosi 4,7 lub więcej, możesz używać C++11.

Arduino IDE nie obsługuje własnych flag kompilatora. To zostało zażądane , ale nie zostało jeszcze wdrożone.

Pozostaje ci więc używać innych środowisk lub kompilować swój program bezpośrednio z wiersza poleceń.

W w przypadku kompilacji bezpośrednio z linii poleceń przy użyciu avr-gcc, wystarczy dodać dodatkowy znacznik kompilatora, aby włączyć obsługę C++11.

-std=c++11

Dla specyficznych środowisk programistycznych , większość z nich wspierałaby edycję flag kompilatora z opcji budowania w IDE. Powyższa flaga musi być dodana do listy flag dla każdego środowiska.


C++0x była to nazwa projektu roboczego standardu C++11. C++0x wsparcie jest dostępne gcc 4.3 naprzód. Jest to jednak wsparcie czysto eksperymentalne, więc nie można oczekiwać, że funkcje C++11 będą obecne. tutaj {[24] } znajduje się pełna lista funkcji dostępnych w odpowiedniej wersji gcc. Dostępność funkcji w avr-gcc będzie taka sama jak w odpowiedniej wersji gcc.

Flaga kompilatora dla C++0x to:

-std=c++0x
 14
Author: asheeshr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:50:09

Proszę zauważyć, że nie ma łatwego sposobu na podanie dodatkowych FLAG z Arduino IDE lub użycie innych IDE (Eclipse, bloki kodu, itp.) lub linii poleceń.

Jako hack, możesz użyć małego programu proxy (powinien być wieloplatformowy):

//============================================================================
// 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. Skompiluj program.
  2. Zmień nazwę oryginalnego avr-g++.exe do avr-g++.oryg.exe (lub inna nazwa).
  3. Utwórz avr-g++.plik ini, w którym pierwsza linia jest pełną ścieżką do oryginalnego programu (np. D:\Arduino\hardware\tools\avr\bin\avr-g++.oryg.exe) i dodać dodatkowe parametry, po jednym na linię, zgodnie z życzeniem.
Jesteś skończony!

Przykład avr-g++.ini:

D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
Nadzieja, to pomaga!
 1
Author: fAX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 23:53:46

Używam Ino i to zadziałało:

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

To wygenerowało plik szesnastkowy o rozmiarze co najmniej 15K( to z włączonymi optymalizacjami), w porównaniu do około 5k dla standardowej kompilacji, co jest brane pod uwagę dla biednego małego Atmega328. Może być w porządku dla jednego z mikrokontrolerów z dużo większą przestrzenią programową.

 1
Author: hoosierEE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 15:13:49