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.
la source
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 ++.Réponses:
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.
la source
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,
boolean
etbyte
ne sont pas dans la norme C ++. Cependant, ils sont directement équivalents àbool
etunsigned 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.
la source
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:
Ensuite, vous constaterez cela
led
eti
ne grossirez pas, ni ne fuient, peu importe le nombre de fois que vous appelezblinkTimes
.S'il
i
s'agissait d'une classe, elle serait également éliminée une fois la fonction terminée. Donc, tant que vous n'utilisez pas denew
fonctions 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
new
etfree
fonctions.Si vous utilisez
new
, alors vous devrez appelerdelete
à 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.la source
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.
la source
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 exempleint *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.--- 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
new
etdelete
-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.
la source
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.
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.
la source
new
etdelete
sont disponibles dans Arduino IDE aussi.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.
la source
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.
la source
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:
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.
la source