Question

J'écris un programme, plus spécifiquement un chargeur de démarrage, pour un système intégré. Je vais utiliser une bibliothèque C pour interagir avec certains composants matériels et j'ai le choix de l'écrire en C ou en C ++. Y a-t-il une raison pour laquelle je devrais choisir l'un par rapport à l'autre? Je n'ai pas besoin des fonctionnalités orientées objet de C ++, mais il a un système de type plus fort. Pourrait-il avoir d'autres fonctionnalités linguistiques qui rendraient le programme plus robuste? Je sais que certaines personnes évitent le C ++ car il peut (mais pas toujours) générer de grandes images de microprogrammes.

Était-ce utile?

La solution

Ce n’est pas une question particulièrement simple à laquelle répondre. Cela dépend de nombreux facteurs, notamment:

  • Comment vous préférez mettre en forme votre code.
  • Si un compilateur C ++ est disponible pour votre cible (et pour toute autre cible sur laquelle vous souhaitez utiliser le chargeur de démarrage).
  • L'importance de la taille du code pour votre application (nous parlons d'environ 10% supplémentaires, peut-être pas de Mo, comme le suggère une autre réponse).

Personnellement, j’aime beaucoup les cours pour structurer mon code. Même en écrivant du code C, je vais avoir tendance à tout conserver dans des fichiers modulaires avec des fonctions statiques "fichier-scope" et "simuler". fonctions membres et (quelques-unes) variables statiques de la portée du fichier pour "simuler" variables membres. Cela dit, la plupart de mes projets intégrés existants (qui sont tous relativement petits, avec un maximum de 128 Ko de mémoire flash, chargeur de démarrage compris, mais généralement moins) ont tendance à être écrits en C. Maintenant que j’ai un compilateur C ++, J'envisage certainement de passer au C ++.

Le simple fait d'utiliser des références, une surcharge et des modèles, présente des avantages considérables pour C ++, même si vous n'allez pas aussi loin que les classes. Certes, je ne m'abstiendrais pas d'utiliser de nombreuses fonctionnalités plus avancées, notamment l'utilisation de l'allocation dynamique de mémoire (nouvelle). Là encore, j’éviterais si possible l’allocation de mémoire dynamique (malloc, etc.) en C embarqué.

Si vous avez un compilateur C ++ (même s'il ne s'agit que de g ++), cela vaut la peine d'exécuter votre code uniquement pour la vérification de type supplémentaire, afin de réduire le nombre de problèmes dans votre code. Le compilateur C ++ peut détecter certaines choses que même les outils d’analyse statique ne détectent pas.

Pour une bonne discussion sur de nombreuses raisons non valides de rejet du C ++, voir l'article sur: Embedded.com .

Autres conseils

Pour un chargeur de démarrage, le choix évident est C, en particulier sur un système embarqué. Le code généré devra être proche du métal et très facile à déboguer, probablement en passant à l’assemblage, ce qui devient rapidement difficile sans soins en C ++. De plus, les chaînes d'outils C sont beaucoup plus omniprésentes que les chaînes d'outils C ++, ce qui permet à votre chargeur de démarrage d'être utilisé sur plusieurs plates-formes. Enfin, les fichiers binaires générés sont généralement plus petits et utilisent moins de mémoire lorsqu'ils sont écrits en style C.

Si vous n’avez pas besoin d’utiliser Orientation objet, utilisez C. Choix simple. C'est plus simple et plus facile, tout en accomplissant la même tâche.

Certains joueurs seront en désaccord, mais OO est ce qui fait que C ++ > C et vice versa dans de nombreuses circonstances.

Je voudrais utiliser C sauf s’il existe une raison particulière d’utiliser C ++. Pour un chargeur de démarrage, vous n’avez pas vraiment besoin d’OO.

Utilisez l’outil le plus simple pour accomplir le travail.

Écrire des programmes en C n’est pas la même chose que l’écrire en C ++. Si vous savez le faire uniquement en C ++, votre choix est le C ++. Pour écrire le chargeur de démarrage, il sera préférable de minimiser le code, de sorte que vous devrez probablement désactiver la bibliothèque C ++ standard. Si vous savez écrire en C, vous devez utiliser C & # 8212; c'est un choix plus courant pour ce genre de tâches.

La plupart des réponses précédentes supposent que votre chargeur de démarrage est petit et simple, ce qui est généralement le cas. cependant, si cela devient plus complexe (vous devez pouvoir charger à partir d'un port Ethernet, d'un port USB ou d'un port série ... vous devez valider le code en cours de chargement avant d'effacer votre code existant, etc.), vous voudrez peut-être envisager le C ++.

J'ai également constaté que le chargeur de démarrage et l'application partageaient généralement une certaine quantité de code commun. Par conséquent, vous pouvez également envisager d'utiliser le même langage que votre application pour faciliter le partage de code.

Le langage C est beaucoup plus facile à analyser que le C ++. Cela signifie qu'un programme qui est à la fois valide C et valide C ++ compilera plus rapidement en tant que programme C. Ce n’est probablement pas une préoccupation majeure, mais c’est une autre raison pour laquelle le C ++ est probablement excessif.

Choisissez C ++ et déterminez les fonctionnalités dont vous avez besoin. Vous avez toujours le contrôle total du code de l'objet de sortie tant que vous comprenez les abstractions C ++ que vous utilisez.

L'utilisation de OO peut quand même bien fonctionner si vous évitez d'utiliser des fonctions virtuelles. Évitez les types d'objet immuables qui nécessitent beaucoup de copie afin de transmettre des valeurs, comme std :: string. Cependant, vous pouvez toujours utiliser des fonctionnalités telles que les modèles sans impact réel sur les performances d'exécution.

Utilisez C avec & # 181; Clibc . Cela simplifiera votre code et réduira son encombrement. Peut être trouvé dans: www.uclibc.org .

Pour une tâche aussi spécifique que celle d'un chargeur de démarrage, je n'utiliserais certainement pas le C ++. Je pense que la bibliothèque standard c ++ est au moins de deux Mo, pas quelque chose que vous voulez dans un chargeur de démarrage. Allez avec C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top