Est-il possible d'écrire du code en C ++ pour les microcontrôleurs PIC à l'avenir?

8

Est-il possible d'utiliser C ++ pour coder des PIC? Y a-t-il des limitations matérielles qui nous empêchent d'utiliser C ++? Quelle est la taille du fichier .hex généré et la durée d'exécution du programme lorsque nous utilisons C ++ au lieu de C? Est-il pratiquement possible d'utiliser C ++ pour les PIC actuels? Y a-t-il des plans futurs ou des développements en cours à ce sujet?

hkBattousai
la source
Je pense que c'est possible et le restera, mais AFAIK n'est pas recommandé car il implémente des structures et des fonctions de haut niveau qui ne conviennent pas à une programmation fortement liée au matériel
clabacchio
3
Pour le débat sur l'adéquation - electronics.stackexchange.com/questions/3027/…
Toby Jaffey
2
Étant donné que la réponse est "Oui, il existe déjà des compilateurs C ++", je vais laisser celui-ci reposer, mais à l'avenir, vous devez être conscient que les questions de Stack Exchange devraient porter sur des faits vérifiables, pas sur des suppositions sur l'avenir.
Kevin Vermeer
2
@clabacchio: Pas nécessairement vrai. En C ++, vous ne payez que pour ce que vous utilisez. Voir ma réponse sur: electronics.stackexchange.com/questions/3027/…
Rocketmagnet
"PIC" est une généralisation inutile. Sur certains PIC bas de gamme (pensez 10F200) C est presque impossible à utiliser. Sur certains PIC haut de gamme (série 32MX), C ++ est censé être utilisé en ce moment, et il n'y a certainement aucune raison technique pour laquelle il ne pourrait pas. Ainsi, une meilleure concentration pourrait donner une réponse plus utilisable, en ce moment tout le monde répond en fait à une question différente.
Wouter van Ooijen

Réponses:

17

Est-il possible d'utiliser C ++ pour coder des PIC?

Oui, c'est possible maintenant. Pour dsPIC, il existe le compilateur IAR Systems C ++ (bien qu'il soit très ancien et non pris en charge).

Une autre option consiste à utiliser un convertisseur C ++ vers C. À l'aide d'une étape de pré-génération, convertissez le C ++ en C, puis donnez le (méchant) C à votre compilateur C normal. Jetez un oeil à LLVM ou au compilateur C ++ de Comeau qui font tous les deux cela. Comeau ne coûte que 50 $, mais il faudra probablement un certain effort pour que la chaîne d'outils et les bibliothèques fonctionnent correctement.

Y a-t-il des limitations matérielles qui nous empêchent d'utiliser C ++?

Réponse courte, non, il n'y a pas de limitations matérielles. Réponse longue, C ++ encourage certainement l'utilisation d'un tas et / ou d'une pile, avec laquelle les plus petits MCU avec une RAM limitée auront du mal.

Pourquoi ont-ils du mal avec un tas / pile? Pour deux raisons: A) de nombreux MCU ont une mémoire RAM limitée, pas assez pour un tas certainement, et à peine assez pour une pile. B) de nombreux MCU ne gèrent pas bien les pointeurs, donc l'utilisation de variables sur la pile tue vraiment les performances.

Quand les gens demandent à propos de l'utilisation de C ++ sur un MCU, je trouve constructif de comparer C ++ à C. Les mêmes questions précises ont été (et sont toujours) posées à propos de C sur un MCU. Les gens rechignaient à l'idée. Un langage de haut niveau, sur 256 octets de RAM MCU ?? Impossible. Mais maintenant, nous savons tous que c'est possible. J'ai écrit C pour un PIC12. Aucun problème. C'est possible car A) les développeurs de logiciels savent qu'ils doivent être un peu prudents: n'utilisez pas malloc () etc. et B) le compilateur a été écrit spécialement pour le MCU. Le compilateur sera également très prudent avec l'allocation de mémoire, il n'essaiera pas de créer un tas et ne créera pas de pile. Certains compilateurs C ne vous permettent tout simplement pas d'écrire du code rentrant (récursif) qui nécessite absolument une pile.

Sachant qu'il est possible d'écrire C pour un MCU, les mêmes réponses s'appliquent à la question de l'écriture C ++ sur un MCU. Tant que le compilateur comprend les limites du périphérique cible et que l'utilisateur comprend également la langue, il n'y a vraiment aucun problème. En C ++, vous ne payez que ce que vous utilisez. Il est parfaitement possible d'écrire C ++ (avec des objets et tout) qui produit la sortie asm exacte que vous auriez obtenue si vous aviez utilisé C.

Désormais, les PIC32 peuvent certainement faire face au C ++. Ils ont jusqu'à 64 Ko de RAM et sont basés sur le noyau MIPS, qui est un processeur 32 bits correctement développé. Il peut gérer des pointeurs et une pile ainsi qu'un PC. En effet, il existe des PC basés sur le MIPS (ou du moins, il y en avait).

Malheureusement, il y a tellement de malentendus autour de C ++. Même les codeurs très expérimentés semblent n'avoir aucune idée du fonctionnement du langage. Voir ma réponse sur pourquoi C ++ convient aux processeurs intégrés.

Quelle est la taille du fichier .hex généré et la durée d'exécution du programme lorsque nous utilisons C ++ au lieu de C?

Comme je l'ai dit, il n'y a peut-être pas de différence. Bjarne Stroustrup a fait une comparaison d'un tas de compilateurs C / C ++ pour comparer les performances de temps et d'espace pour un certain nombre d'opérations. Les résultats variaient considérablement. Dans certains cas, le C ++ est sorti plus lentement et plus grand, certains cas plus lent et plus petit, ou plus rapide et plus grand, et encore plus rapide et plus petit! Donc, la réponse à votre question est que cela dépend fortement du compilateur, mais en général, cela ne doit faire aucune différence. Pour plus de détails, voir le rapport technique sur les performances C ++

Y a-t-il des plans futurs ou des développements en cours à ce sujet?

Ça je ne sais pas. Je sais que le compilateur Microchip C32 est open source, et vous pouvez télécharger la source. Je sais également que quelqu'un avec qui j'ai travaillé a trouvé des instructions en ligne et a réussi à faire compiler du code C ++ par le compilateur. Mais il a quitté l'entreprise avant de pouvoir me mettre en place avec une chaîne d'outils appropriée.


MISE À JOUR

Microchip dispose désormais d'un compilateur C ++ disponible pour sa gamme PIC32 de microcontrôleurs intégrés.


Rocketmagnet
la source
à partir de la page Web IAR: "Produit hérité: IAR Embedded Workbench pour dsPIC est un produit hérité. IAR Systems ne le met pas à jour et il n'est pas possible d'acheter un contrat de support et de mise à jour pour lui."
Jason S
Je sais que les produits IAR sont excellents, mais malheureusement très chers et ils semblent «anciens». Je sais que C ++ est réalisable sur n'importe quelle plate-forme tant que vous n'utilisez pas toutes les fonctionnalités. Cependant, cela ajoute la possibilité d'une couche supplémentaire d'abstraction avec les classes. Je n'utilise pas souvent de modèles, et je n'utilise pas du tout d'allocations de mémoire dynamique. Quelqu'un connaît-il un autre concurrent pour C ++ sur PIC24 / PIC32?
Hans
Oui, désolé, ce n'était pas vraiment une bonne trouvaille. Permettez-moi d'ajouter quelques éléments à ma réponse.
Rocketmagnet
1
Je considérerais C comme un concurrent pour C ++ sur un microcontrôleur. Je ne peux penser à rien que je voudrais faire en C ++ que je ne puisse pas faire en C et il y a moins d'appels de fonctions invisibles (constructeurs, destructeurs, etc.). Rend le code plus déterministe et plus clair. Quelles fonctionnalités de C ++ sont un incontournable qui ne peut pas être confondu avec C?
AngryEE
1
On pourrait se demander: "Quelles sont les fonctionnalités de C indispensables qui ne peuvent pas être embrouillées dans ASM?" Répondez "Rien". Les avantages sont une capacité accrue pour le concepteur de spécifier la conception et de faire vérifier par le compilateur que l'implémentation est correcte. Voir ma réponse electronics.stackexchange.com/questions/3027/… pour une liste des avantages réels et immédiats du C ++ à cet égard.
Rocketmagnet
5

Quelle est la taille du fichier .hex généré et la durée d'exécution du programme lorsque nous utilisons C ++ au lieu de C?

Cela dépend des fonctionnalités que vous utilisez. Si vous utilisez les principales fonctionnalités orientées objet (classe + méthodes), cela n'aura probablement que très peu d'effet (les noms de variable / fonction modifiés plus longtemps, la table des symboles augmentera probablement quelque peu). Les modèles ne devraient pas non plus ajouter grand-chose avec un bon compilateur.

Si vous devenez fou et tirez des choses comme la bibliothèque de modèles standard, et utilisez l'allocation de mémoire dynamique et les exceptions, vous risquez de tomber dans du code.

Jason S
la source
Juste un avertissement pour l'OP, soyez très très prudent sur l'allocation de mémoire sur les petites architectures de mémoire et les systèmes intégrés toujours en cours d'exécution.
kenny
le "-1" pourrait-il expliquer pourquoi il / elle n'est pas d'accord?
Jason S
Je ne suis pas le -1er, mais les modèles sont une fonctionnalité qui doit être utilisée avec grand soin pour éviter le gonflement du code. Vous pouvez facilement vous retrouver avec de nombreuses copies d'un algorithme lorsque cela suffit.
Peter Green le
Pour ce faire, vous devrez en fait utiliser le modèle avec plusieurs types de données différents, et une copie NE SERAIT PAS suffisante, sauf si vous utilisez du code polymorphe qui a une classe de base commune. (Dans ce cas, il y a un coût d'exécution.) Les modèles n'entraînent pas par magie votre code à gonfler, ils provoquent uniquement du code gonflé lorsque vous les utilisez avec plusieurs types de données lorsque vous n'êtes pas conscient des conséquences.
Jason S
1

Pour généraliser quelque peu votre question, il existe des processeurs ARM conçus pour le marché embarqué qui contiennent une MMU (unité de gestion de la mémoire). La taille et l'allocation de la mémoire ont rendu les langages tels que java et c ++ mauvais choix intégrés. Alors que les processeurs intégrés continuent de devenir plus rapides et plus puissants, et que la mémoire devient plus dense et moins chère, les choix de langue disponibles pour les ingénieurs embarqués changent considérablement. Un processeur ARM 32 bits 600 MHz avec MMU et une carte Flash 64G est un excellent candidat pour les applications c ++. Qu'il corresponde à la définition du processeur embarqué classique est un autre problème.

spearson
la source
0

Probablement oui .. mais vous ne devriez pas quand même ... C est le langage de l'embedded et il n'y a aucun avantage à utiliser C ++. Ou plutôt, les avantages de C l'emportent de loin sur les avantages de C ++ pour l'embarqué. Ne perdez pas votre temps.

  • si vous savez utiliser des pointeurs de fonction, etc. Vous pouvez coder comme C ++, il n'y a pas de problème là-bas.
Ktc
la source
5
Je ne suis pas d'accord. Vous pouvez utiliser de nombreuses fonctionnalités de C ++ (classes, modèles, surcharge d'opérateur, références) avec peu ou pas de coûts d'exécution. Oui, vous pouvez faire toutes ces choses en C simple avec des constructions hackish, mais c'est un frein à votre cerveau, et je préférerais de loin utiliser C ++. (bien sûr, je préférerais de loin utiliser un meilleur langage, mais je choisirais un compilateur C ++ en un clin d'œil par rapport au simple C.)
Jason S
1
Classes = structs (sans méthodes intégrées, mais si vous le souhaitez, vous pouvez stocker un pointeur de fonction dans la structure et l'appeler). Modèles = vous les utilisez ??? Surcharge de l'opérateur = oui, je le voudrais aussi. Références = pointeurs, non? Avec C au moins, vous pouvez utiliser uniquement les `` fonctionnalités '' de C ++ que vous souhaitez sans vous soucier de la génération de code excessive ou avoir à inclure une grande bibliothèque aléatoire juste pour obtenir quelque chose à compiler.
AngryEE
1
Je prie également de différer.
Rocketmagnet
3
Oui, les modèles sont un moyen extrêmement puissant de générer du code fiable et performant. Les références sont un pointeur plus fiable. Avec C ++, vous ne payez également que pour les fonctionnalités que vous utilisez. Je pense que vous avez vraiment besoin de mieux comprendre le C ++.
Rocketmagnet
3
Je ne sais pas ce que vous entendez par "C est le langage de l'embarqué". Bien sûr, c'est très populaire. Voulez-vous dire que c'est la meilleure langue possible? Sûrement pas.
Rocketmagnet