web-dev-qa-db-fra.com

Comment utiliser c ++ 11 pour programmer l'Arduino?

Comment puis-je utiliser c++11 lors de la programmation de l'Arduino? Je serais bien en utilisant soit l'Arduino IDE ou un autre environnement. Je suis plus intéressé par les améliorations du langage de base, pas par des choses qui nécessitent des changements de bibliothèque standard.

51
walrii

Depuis version 1.6.6, l'Arduino IDE active c ++ 11 par défaut.

Pour les versions plus anciennes, lisez la suite:

Il est très facile de changer les drapeaux pour n'importe quel élément de la chaîne d'outils, y compris l'assembleur, le compilateur, l'éditeur de liens ou l'archiveur.

Testé sur l'Arduino IDE version 1.5.7 (sorti en juillet 2014),

  1. Localisez le fichier platform.txt,
    • Architecture AVR => {chemin d'installation}\hardware\arduino\avr\platform.txt
    • Architecture SAM => {chemin d'installation}\hardware\arduino\sam\platform.txt
  2. Dans ce fichier, vous pouvez modifier n'importe quel indicateur, par exemple,
    • compiler.c.flags pour changer les drapeaux de compilation par défaut pour les fichiers C++.
    • compiler.cpp.flags pour changer les drapeaux de compilation par défaut pour les fichiers C++.
  3. Vous pouvez également modifier n'importe laquelle des "recettes" ou compiler des patters , dans la section correspondante du fichier de configuration, sous le titre "Modèles de compilation AVR/SAM ".
  4. Après avoir apporté les modifications, vous devez redémarrer l'IDE Arduino, au moins sur la version 1.5.7.

Par exemple,

Pour activer la prise en charge de C++ 11 (C++ 0x), testé sur Arduino IDE versions 1.5.7 et 1.5.8, vous ajouterez simplement l'indicateur "-std = gnu ++ 11" à la fin de la ligne commençant par compiler.cpp.flags = ".

Il est prévu que C++ 11 soit activé par défaut dans un proche avenir sur l'IDE Arduino. Cependant, depuis la version 1.5.8 (octobre 2014) ce n'est toujours pas le cas.

45

Arduino IDE 1.6.6 et plus récent ont C++ 11 activé par défaut (ils ont l'indicateur de compilateur "-std = gnu ++ 11" défini dans le fichier platform.txt).

15
Capt

Premièrement, seulement gcc 4.7 et supérieur (et donc avr-gcc 4.7 et supérieur) support C++11. Vérifiez donc les versions installées avec:

gcc --version
avr-gcc --version

Si avr-gcc est de 4,7 ou plus, vous pourrez peut-être utiliser C++11.

L'Arduino IDE ne prend pas en charge les drapeaux de compilateur personnalisés. Cela a été demandé mais n'a pas encore été implémenté.

Il vous reste donc à utiliser d'autres environnements ou à compiler votre programme directement à partir de la ligne de commande.

Dans le cas, de compiler directement à partir de la ligne de commande en utilisant avr-gcc, il vous suffit d'ajouter un indicateur de compilation supplémentaire pour activer la prise en charge de C++ 11.

-std=c++11

Pour des environnements de développement spécifiques , la plupart prendraient en charge l'édition des drapeaux du compilateur à partir des options de construction dans l'EDI. L'indicateur mentionné ci-dessus doit être ajouté à la liste des indicateurs pour chaque environnement.


C++0x était le nom du projet de travail du C++11 la norme. C++0x le support est disponible gcc 4.3 en avant. Cependant, il s'agit d'un support strictement expérimental, vous ne pouvez donc pas réellement vous attendre à C++11 fonctionnalités présentes. Voici la liste complète des fonctionnalités disponibles avec la version correspondante de gcc. La disponibilité des fonctionnalités dans avr-gcc sera identique à ce qui est disponible dans la version gcc correspondante.

L'indicateur du compilateur pour C++0x est :

-std=c++0x
14
asheeshr

J'utilise Ino et cela a fonctionné:

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

Cela a généré un fichier hexadécimal d'au moins 15k (c'est-à-dire avec les optimisations activées), contre environ 5k pour la version standard, ce qui est une considération pour un pauvre petit Atmega328. Cela pourrait convenir à l'un des microcontrôleurs avec beaucoup plus d'espace de programme.

1
hoosierEE

Veuillez noter qu'il n'y a pas de moyen facile de spécifier des indicateurs supplémentaires depuis Arduino IDE ou utilisez un autre IDE (Eclipse, blocs de code, etc.) ou la ligne de commande) .

En tant que hack, vous pouvez utiliser un petit programme proxy (devrait être multi-plateforme):

//============================================================================
// 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. Compilez le programme.
  2. Renommez l'original avr-g ++. Exe en avr-g ++. Orig.exe (ou tout autre nom).
  3. Créez le fichier avr-g ++. Ini où la première ligne est le chemin complet vers le programme d'origine (par exemple D:\Arduino\hardware\tools\avr\bin\avr-g ++. Orig.exe) et ajoutez des paramètres supplémentaires, un par ligne, comme voulu.

Vous avez terminé!

Exemple avr-g ++. Ini:

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

J'espère que cela pourra aider!

1
fAX