84 votes

C ++ embarqué: utiliser STL ou pas?

J'ai toujours été un embedded software engineer, mais généralement au niveau de la Couche 3 ou 2 du modèle OSI. Je ne suis pas vraiment un gars du matériel. J'ai en général toujours fait de télécommunications produits, généralement à la main/les téléphones cellulaires, ce qui signifie généralement quelque chose comme un BRAS 7 processeur.

Maintenant, je me retrouve dans une situation plus générique embedded world, dans une petite start-up, où je pourrais le passer à "pas si puissant" processeurs (il y a du subjectif bits) - je ne peut pas prédire.

J'ai lu un peu sur le débat sur l'utilisation de la STL C++ dans les systèmes embarqués et il n'y a pas de réponse nette et précise. Il y a quelques petits soucis au sujet de la portabilité, et un peu sur la taille du code ou de l'exécution, mais j'ai deux soucis majeurs:
1 - la gestion des exceptions; je ne suis toujours pas sûr que ce soit de l'utiliser (voir http://stackoverflow.com/questions/2226227/embeeded-c-to-use-exceptions-or-not)
2 - je déteste allocation dynamique de la mémoire dans les systèmes embarqués, en raison des problèmes qu'elle peut présenter. J'ai généralement un pool de mémoire tampon qui est allouée statiquement à la compilation et qui sert seulement tampons de taille fixe (si pas de tampons, de la réinitialisation du système). Le TSL, bien sûr, d'une bonne partie de l'allocation dynamique.

Maintenant, je dois prendre la décision d'utiliser ou de renoncer à la STL pour l'ensemble de la société, pour toujours (ça va dans quelques très de base s/w).

De quelle manière dois-je sauter? Super-safe & perdre une grande partie de ce qui constitue le C++ (omi, il est plus que juste de la définition du langage) et peut-être rencontrer des problèmes plus tard, ou d'avoir à ajouter beaucoup de la gestion des exceptions et peut-être quelques autres code maintenant?

Je suis tenté d'aller juste avec Boost, mais 1) je ne suis pas sûr si elle va de port pour chaque processeur embarqué que je veuille utiliser et 2) sur leur site, ils disent qu'ils ne garantissent pas de recommander ou de certaines de ses parties, pour les systèmes embarqués (surtout FSMs, ce qui semble bizarre). Si je pars pour le boost et nous trouvons un problème plus tard ....

61voto

Brian Neal Points 13668

Je travaille sur des systèmes temps réel embarqués tous les jours. Bien sûr, ma définition d'un système embarqué peut être différente de la vôtre. Mais nous avons la pleine utilisation de la STL et les exceptions et ne rencontrez pas de problèmes ingérables. Nous avons également faire usage de la mémoire dynamique (à un taux très élevé, la répartition des lots de paquets par seconde, etc.) et n'ont pas encore eu besoin de recourir à tous les allocateurs ou des pools de mémoire. Nous avons même utilisé le C++ dans les gestionnaires d'interruption. Nous n'utilisons pas de coup de pouce, mais seulement parce qu'un certain gouvernement de l'agence ne nous le permettent pas.

Il est de notre expérience en effet, vous pouvez utiliser de nombreuses modernes fonctionnalités C++ dans un environnement embarqué aussi longtemps que vous utilisez votre tête et la conduite de vos propres repères. Je vous recommande vivement de faire usage de Scott Meyer Effective C++ 3e édition ainsi que de Sutter et Alexandrescu du C++ Normes de Codage pour vous aider à l'aide de C++ avec un sain style de programmation.

Edit: Après l'obtention d'un upvote sur ces 2 ans plus tard, permettez-moi de publier une mise à jour. Nous sommes beaucoup plus loin dans notre développement et nous avons finalement atteint spots dans notre code où les conteneurs de la bibliothèque standard sont trop lents dans des conditions de haute performance. Ici, nous n'avons en fait recourir à des algorithmes personnalisés, des pools de mémoire et de simplifier les conteneurs. C'est la beauté du C++, vous pouvez utiliser la bibliothèque standard et obtenir toutes les bonnes choses qu'il fournit 90% de votre cas d'utilisation. Vous n'avez pas tout donner quand vous rencontrez des problèmes, vous venez de la main-d'optimiser les zones de conflit.

37voto

Dan Olson Points 11210

Super-safe & perdre une grande partie de ce constitue le C++ (omi, il est plus que juste de la définition du langage) et peut-être courir dans des problèmes plus tard ou ont pour ajouter beaucoup de la gestion des exceptions et peut-être quelques autres code maintenant?

Nous avons un débat similaire dans le monde du jeu et les gens viennent vers le bas sur les deux côtés. Quant à la cité de la partie, pourquoi voudriez-vous vous inquiéter de perdre "beaucoup de ce qui constitue le C++"? Si ce n'est pas pragmatique, ne l'utilisez pas. Il ne devrait pas grave si c'est "C++" ou pas.

Exécuter des tests. Pouvez-vous obtenir autour de la STL de la gestion de la mémoire dans les moyens que vous satisfaire? Si oui, était-il encore la peine? Beaucoup de problèmes STL et boost sont conçus pour résoudre tout simplement ne pas venir si vous conception pour éviter hasard allocation dynamique de la mémoire... ne STL résoudre un problème spécifique que vous faire face?

Beaucoup de gens ont abordé STL en environnement étroit et été heureux avec elle. Beaucoup de gens simplement l'éviter. Certaines personnes proposent entièrement nouvelles normes. Je ne pense pas qu'il y a une seule bonne réponse.

28voto

j_random_hacker Points 28473

Les autres postes ont abordé les questions importantes de l'allocation dynamique de la mémoire, les exceptions et la possible augmentation du code. Je veux juste ajouter: Ne pas oublier <algorithm>! Peu importe si vous utilisez STL vecteurs ou de la plaine C des tableaux et les pointeurs, vous pouvez toujours utiliser sort(), binary_search(), random_shuffle(), les fonctions de construire et de gérer des tas, etc. Ces routines sera presque certainement être plus rapide et moins buggé que les versions de vous construire vous-même.

Exemple: si vous réfléchissez, un algorithme de shuffle de vous construire vous-même est susceptible de produire des distributions asymétriques; random_shuffle() ne sera pas.

20voto

Crashworks Points 22920

Electronic Arts a écrit un long traité sur lesquelles le TSL a été inapproprié pour console intégrée de développement et pourquoi ils devaient écrire leur propre. C'est un article détaillé, mais les raisons les plus importantes ont été:

  1. STL allocateurs sont lents, des ballonnements,des et inefficaces
  2. Les compilateurs ne sont pas très bons à l'in-lining tous ceux profond des appels de fonction
  3. STL allocateurs ne prennent pas en charge explicite de l'alignement
  4. Les algorithmes de la STL qui viennent avec GCC et MSVC de la STL ne sont pas très performants, car ils sont très à la plate-forme agnostique et donc manquer beaucoup de microoptimizations qui peut faire une grande différence.

Il y a quelques années, notre société a pris la décision de ne pas utiliser la STL à tous, au lieu de mettre en œuvre notre propre système de contenants qui sont au maximum performant, plus facile à déboguer, et les plus conservateurs de la mémoire. C'était beaucoup de travail, mais il a remboursé plusieurs fois. Mais la nôtre est un espace dans lequel les produits en concurrence sur la façon dont beaucoup qu'ils peuvent fourrer dans 16.6 ms avec un CPU et de la taille de la mémoire.

Comme des exceptions: ils sont lents sur consoles, et toute personne qui vous dit le contraire n'a pas essayé de timing. Simplement compiler avec leur permis de ralentir l'ensemble du programme en raison de la nécessaire prologue/épilogue code -- mesurer vous-même si vous ne me croyez pas. C'est encore pire dans l'ordre-les Processeurs que sur x86. Pour cette raison, le compilateur que nous utilisons n'est même pas en charge les exceptions C++.

Le gain de performance n'est pas tellement le fait d'éviter le coût d'une exception jeter — c'est à partir de la désactivation des exceptions entièrement.

16voto

Mark Ransom Points 132545

Permettez-moi de commencer par dire que je n'ai pas intégré le travail pendant quelques années, et jamais en C++, donc mon avis vaut chaque centime que vous payez pour cela...

Les modèles utilisés par la STL ne sont jamais va générer un code que vous n'avez pas besoin de générer vous-même, je ne voudrais pas vous inquiéter au sujet de code de la météorisation.

Le TSL n'est pas de lancer des exceptions sur son propre, de sorte que ne devrait pas être une préoccupation. Si vos classes ne les jetez pas, vous devriez être en sécurité. Divisez votre initialisation de l'objet en deux parties, de laisser le constructeur créer un os à nu de l'objet puis effectuez l'une initialisation qui peut échouer dans une fonction membre qui retourne un code d'erreur.

Je pense que toutes les classes conteneur vous permettra de définir votre propre fonction d'allocation, donc si vous voulez allouer à partir d'un pool, vous pouvez y arriver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X