Arduino code C++: pouvez-vous utiliser les fonctions virtuelles et des exceptions?
Suivi ce commentaire de la question L'écriture du firmware: assemblée ou de haut niveau?:
Lors de la compilation de code C++ pour la Arduino plate-forme, vous pouvez utiliser des fonctions virtuelles, les exceptions, etc? Ou voudriez-vous (devez) utiliser un sous-ensemble de C++ (comme décrit dans le commentaire)?
Toutes les autres mises en garde lors de la programmation de la plate-forme Arduino?
OriginalL'auteur cbrulak | 2009-01-20
Vous devez vous connecter pour publier un commentaire.
L'environnement Arduino utilise le AVR version de la GCC de la chaîne. Le code est compilé en C++, vous pouvez utiliser les classes. Les fonctions virtuelles sont possibles; les vtables seront stockées dans la .section de données et avoir les bonnes adresses. En fait, l'Impression de la classe de base utilise des fonctions virtuelles à adapter les divers "imprimer" des méthodes pour les différents types de sortie.
Exceptions ne sont pas pris en charge en raison de code des raisons d'espace. L'environnement Arduino passe "-fno-exceptions" à la ligne de commande du compilateur. Voir la source pour la vérification de cette.
Modèles sont pris en charge. Par exemple, ce n'coût flux d'insertion technique de l'opérateur fonctionne très bien à l'aide d'un modèle simple et en ligne de l'opérateur.
OriginalL'auteur Ben Combee
L'Arduino logiciel utilise avr-gcc pour compiler des croquis. Les limitations suivantes ont été tirées de la avrlibc FAQ (puis-je utiliser le C++ sur le RÉGULATEUR?):
Pris en charge
Pas pris en charge
new
etdelete
(en essayant de les utiliser sera la cause de l'éditeur de liens pour se plaindre de pas défini de références externes). Cela signifie que les objets ne peut être créé sur la pile. Si l'allocation dynamique de la mémoire est nécessaire, elle doit être mise en œuvre à l'aide demalloc()
etfree()
deC
types-fno-exceptions
dans les options du compilateur. Ceci est fait automatiquement par l'IDE Arduino quand il lanceavr-gcc
D'autres questions
extern "C" { . . . }
Intéressant. J'ai référencé le avrlibc FAQ liée au top de ma réponse. FAQ suggère que la
new
limitation pourrait peut-être être fixés de manière peut-être qu'il a été et la FAQ est maintenant obsolète?Je suppose que la FAQ est pas à jour. Il y a un Arduino tutoriel sur la façon d'utiliser les classes pour les bibliothèques ( arduino.cc/en/Hacking/LibraryTutorial ) et je suis en utilisant les classes abstraites et les fonctions virtuelles dans mon dessin en cours.
Les Classes ont toujours été OK tant que les instances ont été créées à l'échelle mondiale ou sur la pile (c'est à dire pas sur le tas à l'aide de
new
- qui est ce que la LibraryTutorial n'). Et référencé dans la FAQ dit que les fonctions virtuelles sont OK aussi.La réponse dépassée, actuel Arduino prend en charge de new/delete, des modèles, des classes C++.
OriginalL'auteur Matthew Murdoch
La facilité d'utilisation des fonctionnalités n'est pas limitée par la plateforme, mais plutôt le compilateur que vous utilisez.
Je voudrais vérifier votre documentation du compilateur sur quelle langue fonctionnalités sont prises en charge.
Ce n'est pas une contrainte du matériel. C'est un contraintes imposées sur le compilateur parce que nous pensons préférable de ne pas surcharger le matériel (le matériel peut théoriquement prise en charge, mais nous ne voulons pas utiliser les ressources nécessaires pour le faire).
Toutes les contraintes sur le compilateur sont susceptibles d'imposer des contraintes supplémentaires sur les programmes en cours d'élaboration. Le matériel pourrait théoriquement prise en charge, mais seulement aussi longtemps que votre propre demande de ressources ne dépassent pas une certaine limite. En raison de la nature du problème, cette limite est assez instable (modifications avec la complexité du programme/exigences) d'où son pas prudent de commutateur exceptions on/OFF sur cette base (va provoquer de grandes code de désabonnement). De toute évidence, il existe peu de matériel X qui ne peut pas même de soutien de base de la gestion des exceptions sur son propre faire votre "contrainte compilateur" argument discutable.
Il vous manque le point. Ce n'est pas un matériel de contrainte, c'est un contraindre imposées par le compilateur. Aussi avez-vous une référence à un type de matériel qui ne peut pas justifier les exceptions?
Je n'essaie pas d'être difficile, mais j'aimerais vraiment comprendre comment cela est un problème de compilateur. Tout ce que je veux dire, c'est, est-il une raison pourquoi le compilateur est limitée à la première place? C'est pas parce que le matériel peut à peine faire face à la logique de l'application, sans exceptions, et en ajoutant des exceptions est de simplement aller pour le tuer (selon toute probabilité)?
OriginalL'auteur Martin York
Comeau informatique a un C++ le compilateur C qui prend en charge toutes les fonctionnalités C++. Pas seulement des fonctions virtuelles, ou des exceptions, mais également à l'exportation. Vous devez appeler Comeau, obtenir pour cible le langage Arduino, mais ne devrait pas être trop dur.
OriginalL'auteur MSalters
La documentation dit:
Il ne dit rien sur les fonctions virtuelles que je peux trouver.
J'ai essayé un programme simple et il compile bien. Je ne l'ai pas testé sur un Arduino hardware.
EDIT: j'ai aussi ne l'ai pas testé exceptions.
OriginalL'auteur Mark James
J'ai utilisé g++ avec ce Makefile et a commencé avec ce code. C++ déchets de l'espace. Mais protothreads sont trop cool de ne pas l'utiliser.
OriginalL'auteur Flinkman