1) "Parce que ça a toujours été comme ça" - cela explique en fait plus de choses que vous ne le pensez - étant donné que les API de presque tous les systèmes actuels ont été écrites à l'origine selon un modèle basé sur C ou ASM, et étant donné que beaucoup de code antérieur existe en C et ASM, il est souvent plus facile de "suivre le courant" que de trouver comment tirer parti du C++.
2) Environnement - Pour utiliser toutes les fonctionnalités du C++, vous avez besoin d'un environnement d'exécution assez complexe, dont certains sont difficiles à fournir à un pilote. C'est plus facile à faire si vous limitez votre ensemble de fonctionnalités, mais entre autres choses, la gestion de la mémoire peut devenir très intéressante en C++, si vous n'avez pas beaucoup de tas. Les exceptions sont également très intéressantes à considérer dans cet environnement, tout comme le RTTI.
3) "Je ne vois pas ce qu'il fait". Il est possible pour tout programmeur raisonnablement compétent de regarder une ligne de C et d'avoir une bonne idée de ce qui se passe au niveau du code machine pour implémenter cette ligne. Évidemment, l'optimisation change quelque peu la donne, mais dans la plupart des cas, vous pouvez savoir ce qui se passe. En C++, compte tenu de la surcharge des opérateurs, des constructeurs, des destructeurs, des exceptions, etc., il devient vraiment difficile d'avoir une idée de ce qui va se passer sur une ligne de code donnée. Lors de l'écriture de pilotes de périphériques, cela peut être mortel, car vous DEVEZ souvent savoir si vous allez interagir avec le gestionnaire de mémoire, ou si la ligne de code affecte (ou dépend de) les niveaux ou le masquage des interruptions.
Il est tout à fait possible d'écrire des pilotes de périphériques sous Windows en utilisant C++ - je l'ai fait moi-même. L'inconvénient est que vous devez faire attention aux fonctionnalités C++ que vous utilisez et à l'endroit où vous les utilisez.
10 votes
Le C++ a des restes. Les pilotes et les systèmes embarqués doivent être très légers.
3 votes
+1 pour la cruft. J'ajouterais que le cruft affecte la vitesse d'exécution et que les pilotes/firmwares sont principalement sensibles aux performances et que vous voulez qu'ils soient aussi rapides que possible.
0 votes
Parce que la plupart des IDE pour microprocesseurs (voir Turbo C, Dynamic C) etc. sont suffisamment riches en langage de haut niveau pour construire un programme décent et le faire fonctionner. Très peu sont écrits en ASM de nos jours.
1 votes
Je jurerais que nous avons déjà fait cela auparavant, mais je ne trouve pas d'exemple. Cependant, ma recherche a permis de trouver des questions connexes qui peuvent être intéressantes : stackoverflow.com/questions/994600/writing-drivers-in-c stackoverflow.com/questions/683701/ stackoverflow.com/questions/981200/
12 votes
Avec le C, vous finissez par coder à la main les mêmes "trucs" que le C++ : polymorphisme -> descripteurs, classes-> modules, templates -> macros de type fonction, espaces de noms -> préfixes de noms, etc. Voir ma réponse.
0 votes
Je vois quelques bonnes réponses ici, mais une chose que les gens ont laissé de côté est la justification de l'assemblage. Vous avez simplement NE PEUT PAS FAIRE tout ce que le processeur a à offrir avec C ou C++. Vous avez besoin de l'assemblage pour des choses comme informer le CPU de vos tables de pages, ou échanger des piles et sauvegarder des registres pour un changement de contexte, ou configurer les premières instructions d'un gestionnaire d'IRQ, ou faire des opérations atomiques de base.
0 votes
Je suis d'accord avec asveiku -- la différence la plus importante qui fait que le C et l'asm sont utilisés pour les firmwares est que le C++ a des caractéristiques de langage qui requièrent diverses infrastructures. En particulier, la gestion dynamique de la mémoire doit être implémentée pour que la plupart du code C++ puisse fonctionner. Vous pourriez écrire un micrologiciel dans un sous-ensemble de C++, mais la version raccourcie de C++ ne serait pas très différente de C. Au tout début du micrologiciel, le circuit de mise sous tension appelle une adresse dans le code connue sous le nom de "vecteur de réinitialisation". Cette fonction doit être écrite en asm -- elle peut ensuite appeler main() si on utilise le C.
1 votes
@Heath - mon expérience n'a pas été que "la gestion dynamique de la mémoire doit être implémentée pour que la plupart du code C++ fonctionne", loin de là. Et même si c'est le cas, vous pouvez implémenter votre propre gestion de la mémoire (remplacer new/delete de manière globale ou sur une base par classe). D'après mon expérience, si votre implémentation C n'a pas besoin de mémoire dynamique, l'implémentation C++ non plus. Une exception pourrait être si votre implémentation C utilise des listes chaînées, etc. et que la version C++ utilise les conteneurs standard de la bibliothèque (liste, vecteur, etc.).