C ++ contre le langage Arduino?

81

Quels sont les avantages de chaque langue lors de l’utilisation de l’Arduino?

Je pense que c'est une bonne question d'ordre général, mais j'ajouterai un mot sur la raison pour laquelle je demande si quelqu'un souhaite me donner un conseil.

J'ai de l'expérience dans les langages prétraités tels que JavaScript, PHP et j'ai tripoté des langages comme Java et Visual Basic. En d'autres termes, je connais les techniques de programmation et l'orientation à la fois classique et prototypique des objets, mais je ne connais rien à la communication directe avec le matériel.

Je fabrique un octocoptère et je pense qu'une approche orientée objet sera la plus simple. (Le logiciel aura de très nombreuses fonctionnalités ...) Cependant, je n'ai jamais écrit en C ++.

Comme il s’agit d’un site de questions-réponses censé aider les autres, seule la question générale présentée au début a beaucoup d’importance, mais j’apprécierais tout commentaire sur ma situation.

Ami de Kim
la source
16
Évitez Arduino IDE car il ne mérite pas son nom IDE, c’est même un très mauvais éditeur: c’est bien pour les débutants et les simples croquis, mais il faut rapidement aller mieux.
Jfpoilpret
4
Il s’agit d’une analyse assez succincte de ce que l’on entend par (et sous le capot même du) «langage de programmation Arduino».
AdjunctProfessorFalcon
10
C++ vs. The Arduino Language?- Le "langage Arduino" est C ++. Il y a un peu de prétraitement pour vous sauver en faisant des prototypes de fonctions, mais il s'agit très certainement de C ++.
Nick Gammon
2
Il n’existe pas de langue arduino. C'est simplement une bibliothèque.
Overdrivr
2
Pas si lié à la question qu'aux commentaires: Atmel studio est gratuit et à mon humble avis, c'est mieux que Visual Studio pour la programmation Arduino. Prend également en charge le plug-in Visual Micro, bien que cela ne soit absolument pas nécessaire pour la programmation et le débogage d'arduinos.
cyberponk

Réponses:

55

Mon expérience personnelle en tant que professeur (programmation, mécatronique) est que si vous avez une expérience préalable en programmation et que vous connaissez des concepts tels que la programmation orientée objet, il est préférable d’utiliser le C / C ++. La langue arduino est vraiment géniale pour les débutants, mais a quelques limitations (par exemple, vous devez avoir tous vos fichiers dans le même dossier). Et c’est fondamentalement une simplification de C / C ++ (vous pouvez pratiquement copier-coller du code arduino dans un fichier C / C ++, et cela fonctionnera). En outre, il est logique que vous puissiez utiliser un IDE bien connu comme éclipse:

http://playground.arduino.cc/Code/Eclipse

Au départ, il faut un peu plus d’installation et de configuration pour votre environnement de développement, mais à mon humble avis, cela en vaut la peine pour les programmeurs expérimentés dans un autre langage.

Dans tous les cas, vous pourrez utiliser le langage Arduino et l'EDI Arduino pendant quelques jours pour vous familiariser avec le matériel Arduino, puis passer à C / C ++ avec Eclipse pour vraiment développer votre projet.

drodri
la source
Merci pour vos pensées. J'utiliserai l'IDE Arduino pour apprendre à contrôler tous les éléments matériels tels que les capteurs, les écrans LCD, etc. Ensuite, je passerai au C ++ pour créer le logiciel de l'octocoptère. Connaissez-vous un livre court et bon pour les personnes qui connaissent d'autres langues? Le "problème" avec beaucoup de livres que j'ai trouvés est qu'ils incluent tellement que je n'en ai pas besoin parce que je suis sur un petit microcontrôleur Atmel plutôt que sur un ordinateur à interface utilisateur.
Ami de Kim
1
Il y a un bon livre "Programmation C pour Arduino" de Julien Bayle qui est utile. C'est un langage C pas C ++ mais devrait vous aider à comprendre la base.
fenix688
C'est une bonne demande: un livre court et bon avec les bases du C ++ pour les programmeurs d'autres langages. Désolé, je ne peux donner aucune recommandation, je n'en connais aucune bonne. En fait, j’ai écrit un livre avec un objectif pratique (développer un jeu vidéo) pour mes étudiants, mais ce n’est qu’en espagnol. Pour un bon et pratique livre C ++, je recommanderais Deitel et Deitel Comment programmer C ++, vous pouvez sauter beaucoup de chapitres avancés.
drodri
1
C ++ prend en charge les fonctionnalités OO, pas le langage C.
Chris O
1
@FriendofKim Ce n'est pas tout à fait ce que je voulais dire (techniquement, le Due est assez rapide pour prendre en charge une solution logicielle pour les communications série non mégabits. Il compte au total 5 U (S) ARTS, tandis que les bibliothèques Arduino n'en fournissent que 4 de toute façon, mais le tableau Due ne fournit pas de broches pour l’un des USART); les bibliothèques Arduino configurent les USART pour qu’ils utilisent le mode asynchrone, mais j’avais besoin de synchroniser jusqu’à 6 Mbit / s (et je devais utiliser le mode SPI car l’entrée devait être traitée comme un flux binaire brut, donc pas de bits d’arrêt / etc.), ce qui impliquait également modification de la configuration par défaut du contrôleur PIO.
JAB
48

En théorie ...
Il n'y a pas vraiment de langue Arduino en tant que telle. C'est vraiment juste C ++ avec des bibliothèques spécifiques à un domaine. Ceux-ci ajoutent diverses fonctionnalités, telles que les fonctions que vous pouvez appeler pour contrôler le matériel. Si vous n'aviez pas ces fonctions, vous auriez besoin de manipuler directement des registres spéciaux pour tout contrôler. C'est comme ça que la programmation intégrée est habituellement faite. C'est rapide, mais il peut être assez difficile d'apprendre et de comprendre.

En plus des fonctions, les bibliothèques ajoutent des noms alternatifs pour certains types. Par exemple, booleanet bytene sont pas dans la norme C ++. Cependant, ils sont directement équivalents à boolet unsigned char.

Toutes ces choses signifient que vous pouvez probablement porter du code C ++ général directement sur Arduino sans difficulté. Cependant, revenir en arrière peut nécessiter quelques modifications mineures.

En pratique ...
Cela dit, la programmation pour Arduino n'est pas exactement la même que la programmation générale en C ++. Cependant, bon nombre des différences sont communes à toute la programmation intégrée (telles que la mémoire et la puissance de traitement limitées).

Il est également intéressant de noter que si vous utilisez l'EDI officiel Arduino, il y a toutes sortes de bizarreries gênantes et de limitations sur la façon de configurer votre code. Il existe des solutions de contournement dans tous les cas (à ma connaissance), mais elles sont parfois très frustrantes.

Pour une flexibilité totale, utilisez un IDE tiers (tel que Eclipse) avec un plug-in pour prendre en charge Arduino. Cela devrait vous donner tous les avantages du C ++, ainsi que des bibliothèques Arduino.

Peter Bloomfield
la source
25

Quels sont les avantages du langage C ++ par rapport au langage Arduino lors de l’utilisation d’Arduino? J'ai de l'expérience dans les langages prétraités tels que JavaScript, PHP et j'ai tripoté des langages comme Java et Visual Basic.

Tout d'abord, le compilateur / IDE Arduino accepte C et C ++ tels quels. En fait, beaucoup de bibliothèques sont écrites en C ++. Une grande partie du système sous-jacent n'est pas orienté objet, mais pourrait l'être.

Ainsi, "Le langage arduino" est C ++ ou C.

C ++ n'est pas une ordure collectée. Il gère les variables de portée - si vous écrivez:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

Ensuite, vous constaterez cela ledet ine grossirez pas, ni ne fuient, peu importe le nombre de fois que vous appelez blinkTimes.

S'il is'agissait d'une classe, elle serait également éliminée une fois la fonction terminée. Donc, tant que vous n'utilisez pas de newfonctions d'allocation de mémoire ou des fonctions similaires pour créer de nouveaux objets, vous n'avez pas à vous soucier des fuites.

Vous pouvez encore manquer de mémoire, si vous créez des classes énormes et d' utiliser beaucoup d'entre eux dans des fonctions profondément imbriquées, mais en général vous n'allez avoir des ennuis jusqu'à ce que vous commencez à traiter newet freefonctions.

Si vous utilisez new, alors vous devrez appeler deleteà des moments appropriés. C ++, et par extension Arduino, n’a pas de collecte automatique des données, vous devez gérer explicitement votre propre mémoire.

Adam Davis
la source
1
D'accord, si les objets instanciés (avec new) ne sont pas récupérés, je devrai également l'apprendre. Je suppose que tout livre sur C ++ couvrira cela. Merci pour une bonne réponse!
Ami de Kim
14

Le langage Arduino est le C ++, mais il est très différent de la plupart des variétés C ++. Le langage Arduino a beaucoup d'abstraction intégrée, en particulier dans les interfaces matérielles, ce qui le rend très simple à utiliser. Si vous avez des connaissances en Java, C et C ++ devraient être très similaires.

Les principales différences entre Arduino et C ++ sont dans la mémoire de stockage. Habituellement, un ordinateur moderne a plus de 2 Go de RAM, tandis que l'Arduino Uno en a 2 ko (1 million de fois moins). L'Arduino utilise également des instructions 8 bits au lieu de celles 32 bits utilisées par un ordinateur. Cela affectera principalement la quantité d'informations que vous pouvez stocker dans une variable.

Si vous êtes très novice dans le monde Arduino, vous devriez rechercher un didacticiel, car il en existe de nombreux bons.

Le docteur
la source
Vous parlez de mémoire. J'ai le dû qui a 96Ko de RAM. Mais la dernière chose que je souhaite, c’est que l’hélicoptère se bloque en raison d’une fuite de mémoire (avec une caméra très coûteuse montée sur l’appareil).
Ami de Kim
La mémoire en C ++ est-elle gérée automatiquement (comme le ramasse-miettes en Java), sauf indication contraire?
Ami de Kim
2
La norme C ++ ne donne aucune garantie quant à la taille de la mémoire - c ++ fonctionne déjà sans modification sur du matériel intégré.
Michael Thorpe
2
Vous décrivez les différences entre les plates-formes matérielles, mais pas C ++.
Cybergibbons
5
@FriendofKim En C ++, il existe deux méthodes différentes pour instancier des variables / objets. Si vous les instanciez localement (par exemple int blah = 5;), ils seront automatiquement détruits quand ils seront hors de portée (c'est-à-dire à la fin de la boucle ou de la fonction). Cependant, si vous les instanciez sur le tas (par exemple int *blah = new int(5);), vous devez les libérer vous-même. Il n’est cependant généralement pas sage d’utiliser des données de tas dans la programmation intégrée.
Peter Bloomfield
14

--- Mise à jour 170412
J'ai écrit ma réponse initiale il y a trois ans dans la perspective d'un "Arduino C ++" distinct. Le langage utilisé dans l'EDI est le C ++ standard, car il est implémenté par le compilateur GNU C ++. Des différences "apparentes" s'infiltrent, car l'EDI procédera à un pré-traitement pour aider les nouveaux arrivants à éviter les pièges, en remplissant quelques #includes, f / ex. Mais vous pouvez, et c'est ce que je fais, écrivez du C ++ correct et obtenez ce que vous espérez obtenir.
--- mettre à jour

Limitez votre utilisation des fonctionnalités du langage C ++ à ceux dont vous comprenez parfaitement l’implémentation. Certaines fonctionnalités sont compilées dans un code utilisant beaucoup plus de ressources que ne le permet la lecture du code source. La liste générée facultativement .lss (source et assemblage fusionnés) peut vous donner une bonne idée de ce que le compilateur C ++ a fait lorsque vous ne cherchiez pas.

A votre question sur la mémoire: C ++ ne ramasse pas la mémoire. Les langages basés sur la pile, tels que C et C ++, allouent un stockage temporaire sur la pile pour les variables automatiques à l'entrée de la fonction, qui est ensuite libérée lorsque la fonction est renvoyée, mais il ne s'agit pas d'une véritable récupération de place. Les objets créés dans la mémoire de tas ou globale sont actifs jusqu'à ce que vous les supprimiez explicitement. Assurez-vous de savoir où, quand et pendant combien de temps différents types d'objets seront créés. Vous ne voulez vraiment pas que vos objets de code newet delete-ing fassent comme bon vous semble . Ils seront construits dans la mémoire de tas, en le fragmentant et en le faisant grandir dans la pile. C'est à ce moment que votre code - et votre gentil copter - va planter.

C fait moins pour vous afin qu'il puisse faire moins pour vous. Ce n'est pas un mauvais choix. C avec quelques-unes des fonctionnalités de C ++ peut être un choix encore meilleur, si vous choisissez judicieusement les fonctionnalités supplémentaires.C ++, si ce sont vos deux choix:

[Réponse originale] - C ++ est un langage normalisé. Il est largement déployé dans de nombreux environnements, y compris les systèmes intégrés, et est donc testé de manière plus approfondie que le langage très similaire à C ++, "Arduino". Ceci est particulièrement important pour les applications critiques / critiques telles que celles que vous planifiez. Code Crashed signifie écrasé « copter et même si elle ne fait pas de mal à quelqu'un, il va briser votre machine coûteuse.

  • Étant standard, C ++ est portable. Besoin de mettre à niveau votre processeur? Tout sauf le code spécifique au silicium portera sur le nouveau. Besoin de changer votre jeu d'outils, votre système de développement, votre système d'exploitation hôte? C ++ sera supporté partout. Bien que Arduino IDE s’exécute partout où Java est pris en charge, c’est le seul outil qui utilise Arduino C ++ et c’est un outil très limité. Si vous souhaitez utiliser Eclipse, les outils AVR, allez pieds nus sur la ligne de commande, développez-vous dans Emacs ou dans un autre environnement de votre choix, le C ++ standard sera pris en charge.

  • L’IDE Arduino fait des choses derrière votre dos - en particulier, il inclut les fichiers .h quand il pense que vous en avez besoin. Même si c'est correct, vous voulez vraiment écrire, ou au moins voir et comprendre, tout ce que le compilateur va voir. Les langages de programmation ne sont pas conçus pour les ordinateurs (les ordinateurs mangent des bits au petit-déjeuner); ils sont faits pour les gens, en particulier ceux qui vous suivent sur le projet, le plus important d'entre eux pouvant être ... vous !, quand 6 mois après avoir écrit un module, vous devez revenir pour l'améliorer, ou plus probablement, le réparer. Vous voulez vraiment pouvoir voir tout ce que voit le compilateur.

JRobert
la source
2
C'est une très bonne réponse. Il semble clair que vous aimez le C ++ et que je devrais aussi l’aimer! ... Mais sérieusement, je vais passer directement au C ++ dès que j'ai compris le fonctionnement de la "communication" avec les différents capteurs, etc.
Ami de Kim
Connaissez-vous de bons livres sur le sujet? (Convient pour moi qui programme depuis des années dans d'autres langues et qui n'a besoin que de la "partie intégrée" de C ++.)
Friend of Kim
Pensez-vous que C ++ accéléré est un bon livre pour cela?
Ami de Kim
2
J'aimerais pouvoir vous aider avec le bon livre, mais je suis arrivé au C ++ avec beaucoup de C derrière moi et le langage de programmation C de Kernighan & Ritchie est toujours mon livre de prédilection (mauvais jeu de mots) pour tout ce qui n'est pas explicitement C ++. et Manuel de référence du C ++ annoté pour C ++ de Ellis & Stroustrup . Mais pour écrire sur du matériel, vous ferez bien de regarder certaines des bibliothèques de périphériques apportées par les utilisateurs d’ Arduino.cc . Commencez par peaufiner les ports d'E / S avec les fonctions pinMode (), digitalWrite () et digitalRead (), puis leurs équivalents d'E / S analogiques et, éventuellement, ...
JRobert
1
... prévoyez d'écrire directement dans les registres d'E / S pour améliorer la vitesse et l'espace mémoire. Des programmes comme blinky.cpp et hello.cpp sont de bons endroits pour commencer à jouer avec le matériel. Ajoutez un simple multimètre et quelques DEL avec les résistances de limitation de courant de droite soudées en permanence à une jambe. Vous devriez être en mesure de voir les résultats réels, même simples, de vos efforts. Après cela, lisez les fiches techniques des matériels qui vous intéressent pour savoir quels signaux vous pouvez lire / écrire pour les faire jouer. Les capteurs de température sont faciles à utiliser et n’ont-ils pas besoin d’un enregistreur de frigo? S'amuser!
JRobert
10

D'après mon expérience, il est préférable d'éviter les nouvelles suppressions et les suppressions lors de l'exécution sur des machines avec une mémoire limitée.

  • La gestion de la mémoire elle-même utilise un précieux programme et de la RAM
  • Les vecteurs ISR sont définis à la compilation. Il est difficile (impossible?) Pour une instance de classe de réclamer un ISR au moment de l'exécution
  • Généralement, vous saurez, au moment de la compilation, de quelle instance de classe vous avez besoin - par exemple, un débogueur à 3 boutons, un pilote d’affichage et un pilote d’affichage à 2 lignes
  • La gestion de la mémoire introduit des retards inconnus lorsque vous utilisez new ou delete.

Il peut y avoir des cas où il est justifié d'utiliser la construction et la destruction d'instances dynamiques, mais je soupçonne qu'elles sont rares.

Kiwiron
la source
Étant complètement nouveau en C ++, j’ai une question complémentaire concernant les STD. Est-ce une mauvaise idée de mémoriser son utilisation? Sinon, comment peut-on l'ajouter (Eclipse)? J'ai configuré le compilateur AVR et il fonctionne bien.
Ami de Kim
1
Tout ce que vous dites est correct mais je ne vois pas en quoi c'est une réponse à la question OP. newet deletesont disponibles dans Arduino IDE aussi.
Jfpoilpret
Ce n'est pas une réponse, mais des informations très utiles que j'apprécie vraiment.
Ami de Kim
8

Comme indiqué dans plusieurs réponses, si vous programmez un système embarqué en général, évitez-le à nouveau, sauf si vous gérez votre propre espace mémoire et que vous savez vraiment quel sera le cycle de vie de votre objet. L'allocation statique ou les variables de pile sont beaucoup plus sûres. Cela dit, une astuce courante pour gérer des choses telles que les tampons de longueur variable alloués pour la durée d’une fonction est d’avoir une variable automatique (sur la pile) qui est un objet qui appelle new dans son constructeur, puis place la suppression dans le destructeur. ainsi, lorsque l'objet sort de la portée, le tampon est libéré dans le tas. Encore une fois, cela a généralement une utilité limitée dans les micros mais c’est un motif agréable à retenir.

BD2357
la source
6

Outre les commentaires ci-dessus, je voudrais insister davantage sur les problèmes de RAM fonctionnant sur les cartes Arduino, en particulier avec Uno (et d’autres qui partagent le même microcontrôleur). J'ai récemment écrit un simple jeu Space Invaders fonctionnant sur une matrice de LED 32x32 et j'ai rencontré à plusieurs reprises des problèmes causés par une mémoire insuffisante.

Le Uno a seulement 2048 octets de RAM. La bibliothèque de ma matrice en a repris 3/4, me laissant environ 400 octets pour le jeu. Comme il est dans mon intention de "mettre à jour" le projet à un moment donné pour exécuter plusieurs jeux avec la même base de programme sur la version plus puissante de Due, j'ai conçu le code avec des principes OO et beaucoup d'héritage de classe. (La classe de jeu a été héritée avec une mise à jour virtuelle et des appels dessinés, les entités du jeu ont toutes été héritées).

Je n’ai pratiquement plus de mémoire en ajoutant les envahisseurs. J'ai essayé d'économiser de la mémoire en mettant en bits leurs variables membres, mais je me suis épuisé à nouveau lors de l'ajout des objets de protection. Après un peu plus de raclage, j'ai manqué d'ajouter les bombes / balles. À ce stade, j'ai parcouru le code et supprimé toutes les balises "virtuelles" (tous les prototypes de classe sont construits à partir d'un extrait de Visual Assist et les destructeurs sont tous virtuels automatiquement). Cela a réduit de moitié l'utilisation de ma mémoire instantanément, ce qui en libère suffisamment pour pouvoir compléter le code.

En résumé, le résultat final est un code C ++ qui n’utilise aucune fonctionnalité C ++. Vous pourriez aussi bien vous en tenir à C et être très conscient de votre utilisation de la mémoire. Vous n'obtenez aucune aide si vous dépassez les 2 Ko. En particulier si vous utilisez une allocation dynamique, le code cesse de fonctionner et vous devez vous gratter la tête pendant un moment jusqu'à ce que vous envisagiez la possibilité d'un débordement de mémoire.

PS - Les variables de champ binaires sont mauvaises. Très mauvais. Mis à part l'ajout de temps système, j'ai oublié le nombre de fois où j'ajoutais un nouvel état au jeu, mais le code ne fonctionnait pas et je ne comprenais pas pourquoi. Ma variable d'état n'était pas assez large pour contenir la nouvelle valeur d'état, donc j'obtenais un état inattendu.

Mick Waites
la source
4

Le langage Arduino est le C ++ (bien que généralement implémenté dans un style plus proche de "C avec classes", ce qui est en fait assez courant dans le monde des microcontrôleurs de systèmes embarqués). Fin de l'histoire. Assez avec les gens qui pensent que c'est déjà une langue différente! Il utilise le compilateur g ++.

Preuve:

Activez la sortie prolixe lors de la compilation dans les préférences et téléchargez et vous en apprendrez beaucoup en lisant ces lignes.

Voici quelques informations supplémentaires:

Mes propres mots:

Le code Arduino est C ++. Les fonctions de base Arduino sont simplement un ensemble de classes et de bibliothèques C ++ que vous pouvez utiliser. Il est construit et compilé à l’aide du compilateur GNU gcc / g ++ . Vos fonctions setup () et loop () sont simplement placées dans la fonction obligatoire main () ( ici, en fait - notez que le fichier est "main.cpp", un fichier source C ++) automatiquement pour vous et qu'il y prétraitement effectué pour vous assurer qu'il s'agit d'un programme C ++ valide (par exemple, analyse de tous les prototypes de fonctions [c.-à-d. déclarations] pour que vous puissiez utiliser une fonction même si son prototype figure plus tard dans votre fichier .ino). Cependant, une grande partie de l’Arduino est écrite dans un "style C" et nécessite donc que les # extern "C" {}accolades l’entourent pour empêcher le C ++ de fonctionner correctement."name-mangling" (également appelé "nom de décoration / décoration de nom" ), appels de fonction aux fonctions C implémentées par AVR-libc , qui est l'implémentation C pour ATmega328 et d'autres microcontrôleurs d' architecture AVR .

Les mots d'Arduino:

" Puis-je programmer la carte Arduino en C?
En fait, vous l’êtes déjà; le langage Arduino n’est qu’un ensemble de fonctions C / C ++ pouvant être appelées à partir de votre code. Votre esquisse est soumis à des modifications mineures (par exemple, génération automatique de prototypes de fonctions). puis est directement passé à un compilateur C / C ++ (avr-g ++). Toutes les constructions C et C ++ standard prises en charge par avr-g ++ devraient fonctionner dans Arduino. Pour plus de détails, voir la page sur le processus de construction Arduino . "

Source: https://www.arduino.cc/en/Main/FAQ#toc13

Quand utiliser la bibliothèque Arduino contre le C pur ou le C ++?

Alors, utilisez le langage Arduino où cela simplifie les choses et écrivez vos propres fonctions là où vous avez besoin de plus de spécialisation. Je recommande toutefois de s’éloigner rapidement de l’EDI pour écrire du code - utilisez-le simplement pour la compilation. Définissez les préférences de l'EDI pour utiliser "Editeur externe". Ensuite, utilisez un éditeur de code source professionnel / IDE tel que Sublime Text 3 , Atom , Code Visual Studio ou Eclipse CDT pour écrire votre code. Vous pouvez ensuite cliquer de nouveau sur l'EDI Arduino pour compiler et télécharger. Si vous utilisez Eclipse, il existe des moyens de le faire dans Eclipse (voir les autres réponses ici et l' article de jeu Arduino sur Eclipse ici aussi), pensez donc à utiliser ces techniques également.

Gabriel Staples
la source