Pour écrire un bootloader en C ou c++?

j'écris un programme, plus précisément un chargeur d'amorçage, pour un système intégré. Je vais utiliser une bibliothèque c/" class="blnk">C pour interagir avec certains composants matériels et j'ai le choix de l'écrire en C ou en C++. Est-il une raison je devrais choisir l'un plutôt que l'autre? Je n'ai pas besoin des caractéristiques orientées objet de C++ mais il a un système de type plus fort. Pourrait-il avoir d'autres caractéristiques linguistiques qui rendraient le programme plus robuste? Je sais que certaines personnes évitent le C++ parce qu'il peut (mais pas toujours) générer de grandes images firmware.

17
demandé sur waffleman 2009-10-27 10:00:15

10 réponses

ce n'est pas une question très simple à répondre. Elle dépend d'un certain nombre de facteurs, notamment:

  • comment vous préférez mettre en page votre code.
  • S'il y a un compilateur C++ disponible pour votre cible (et toute autre cible sur laquelle vous pouvez utiliser le bootloader).
  • comment la taille du code est critique pour votre application (nous parlons de 10% supplémentaire peut-être, pas MB comme suggéré par une autre réponse).

Personnellement, Je j'aime vraiment les cours comme une façon de présenter mon code. Même en écrivant du code C, j'aurai tendance à garder tout dans des fichiers modulaires avec des fonctions statiques simulant des fonctions de membre et (quelques-unes) des variables statiques simulant des variables de membre. Cela dit, la plupart de mes projets embarqués existants (tous à une échelle relativement petite, jusqu'à un maximum de 128KB flash y compris bootloader, mais généralement moins) ont eu tendance à être écrits en C. Maintenant que j'ai un compilateur C++ cependant, je pense certainement passer au c++.

il y a des avantages considérables pour C++ de simplement utiliser des références, de surcharger et des modèles, même si vous n'allez pas aussi loin que les classes. Certainement, je m'arrêterais loin d'utiliser beaucoup de fonctionnalités plus avancées, y compris l'utilisation de l'allocation de mémoire dynamique (nouveau). Encore une fois, j'éviterais l'allocation dynamique de mémoire (malloc etc) dans le C intégré aussi bien si possible.

Si vous avez un compilateur C++ (même si c'est seulement pour g++), il est vaut la peine d'exécuter votre code à travers juste pour la vérification de type supplémentaire de sorte que vous pouvez réduire le nombre de problèmes dans votre code. Le compilateur C++ peut détecter quelques choses que même les outils d'analyse statique ne détecteront pas.

pour une bonne discussion sur de nombreuses raisons invalides les gens rejettent C++, voir L'article de Dan Saks sur Embedded.com.

26
répondu DrAl 2009-10-27 08:13:16

pour un chargeur de démarrage, le choix évident est C, surtout sur un système embarqué. Le code généré devra être proche du métal, et très facile à déboguer, probablement en tombant dans l'assemblage, qui devient rapidement difficile sans soin en C++. De plus, les chaînes d'outils C sont beaucoup plus répandues que les chaînes d'outils C++, ce qui permet à votre chargeur d'amorçage d'être utilisé sur plus de plateformes. Enfin, les binaires générés sont généralement plus petits, et utilisent moins de mémoire lorsque le style C est écrit.

12
répondu Matt Joiner 2009-10-27 08:05:46

si vous n'avez pas besoin d'utiliser L'Orientation de L'objet, utilisez C. Simple choix ici. Sa simple et facile, tout en accomplissant la même tâche.

certaines personnes ne seront pas d'accord, mais OO est ce qui rend C++ > C, et vice versa dans beaucoup de circonstances.

11
répondu Kyle Rozendo 2009-10-27 09:02:09

je voudrais utiliser C, sauf si il y a une raison particulière d'utiliser le C++. Pour un Bootloader vous n'allez pas vraiment avoir besoin de OO.

utilisez l'outil le plus simple pour accomplir le travail.

10
répondu Gerhard 2009-10-27 09:16:50

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

7
répondu Kirill V. Lyadvinsky 2009-10-27 07:34:18

la plupart des réponses précédentes supposent que votre bootloader est petit et simple, ce qui est typiquement le cas; cependant, si cela devient plus complexe (i.e. vous devez être capable de charger à partir d'un port Ethernet, D'un port USB, ou d'un port série...vous devez valider le code qui est chargé avant d'effacer votre code existant, etc.), vous pourriez envisager de C++.

j'ai également constaté que le bootloader et l'application partagent généralement une certaine quantité de code commun afin que vous puissiez aussi envisager d'utiliser le même langage que votre application afin de faciliter le partage du code.

4
répondu semaj 2009-10-27 15:33:47

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

3
répondu Artelius 2009-10-27 08:06:16

aller avec C++ et objchoiser quelles fonctionnalités de langue vous avez besoin. Vous avez toujours le contrôle total du code objet de sortie tant que vous comprenez les abstractions C++ que vous utilisez.

L'utilisation de OO peut toujours bien fonctionner si vous évitez l'utilisation de fonctions virtuelles. Évitez les types d'objets immuables qui nécessitent beaucoup de copie pour passer des valeurs, comme std::string. Mais, vous pouvez toujours utiliser des fonctionnalités comme les modèles sans impact réel sur les performances d'exécution.

1
répondu spoulson 2009-11-05 12:29:09

Utiliser C µClibc. Il simplifiera votre code et réduira son empreinte. Peut être trouvée dans: www.uclibc.org.

1
répondu eyalm 2009-11-05 16:33:11

pour une tâche aussi spécifique qu'un bootloader, Je n'utiliserais certainement pas C++. Je pense que la bibliothèque C++ standard est au moins un couple de MO, pas quelque chose que vous voulez dans un bootloader. Aller avec le C.

0
répondu Puppe 2009-10-27 07:12:08