Presque tout le monde va maintenant dire la bénédiction:
performance !
D'accord, C permet d'écrire du code athlétique. Mais il y a d'autres langues qui peuvent le faire, après tout! Et la puissance d'optimisation des compilateurs modernes est impressionnante. C a- t -il des avantages qu'aucun autre langage n'a? Ou tout simplement pas besoin d'instruments plus flexibles dans le domaine?
Réponses:
Cela en fait partie; l'utilisation déterministe des ressources est importante sur les appareils aux ressources limitées pour commencer, mais il y a d'autres raisons.
la source
C a été conçu pour modéliser un CPU, car C a été créé pour rendre Unix portable sur toutes les plates-formes au lieu d'écrire simplement un langage d'assemblage.
Cela signifie que les programmes C fonctionnent bien en tant que langage de programmation pour les programmes qui doivent avoir un niveau d'abstraction très proche du CPU réel, ce qui est le cas pour le matériel embarqué.
Remarque: C a été conçu vers 1970 et les CPU étaient alors plus simples.
la source
Une des raisons de la domination est qu'elle dispose du bon type d'outils pour la tâche. Après avoir développé des plates-formes embarquées à la fois en Java et en C / C ++, je peux vous dire que l'approche nue jusqu'aux os de C ++ est tout simplement plus naturelle. Sauver le développeur de l'impression qu'il ou elle saute à travers des cerceaux parce que le langage est trop haut est assez ennuyeux. Un bon exemple est l'absence de variables non signées en Java.
Et les fonctionnalités pratiques des VM / langages interprétés ne sont généralement pas réalisables et sont exclues de l'implémentation, par exemple la collecte des ordures.
la source
C nécessite très peu de support d'exécution en soi, donc la surcharge est beaucoup plus faible. Vous ne dépensez pas de mémoire ou de stockage sur le support d'exécution, ne dépensez pas de temps / effort pour minimiser ce support, ou ne devez pas en tenir compte dans la conception de votre projet.
la source
switch
es sont horribles, et les mêmes machines construites avec des hiérarchies de classes sont agréables et maintenables.switch
, pourrait-on dire) est toujours utilisée dans de nombreuses applications intégrées. Plus facile à déboguer, plus facile à vérifier.Comme mentionné dans d'autres réponses, C a été développé au début des années 1970 pour remplacer le langage d'assemblage sur une architecture de mini-ordinateur. À l'époque, ces ordinateurs coûtaient généralement des dizaines de milliers de dollars, y compris la mémoire et les périphériques.
De nos jours, vous pouvez obtenir la même puissance informatique ou plus avec un microcontrôleur intégré 16 bits qui coûte quatre dollars ou moins en quantités uniques - y compris la RAM intégrée et les contrôleurs d'E / S. Un microcontrôleur 32 bits coûte peut-être un dollar ou deux de plus.
Quand je programme ces petits gars, ce que je fais 90% du temps lorsque je ne conçois pas les cartes sur lesquelles ils sont assis, j'aime visualiser ce que le processeur va faire. Si je pouvais programmer assez rapidement en assembleur, je le ferais.
Je ne veux pas toutes sortes de couches d'abstraction. Je débogue souvent en parcourant une liste de dissimulateurs à l'écran. C'est beaucoup plus facile de le faire lorsque vous avez écrit le programme en C pour commencer.
la source
Il ne domine pas entièrement car C ++ est de plus en plus utilisé à mesure que les compilateurs se sont améliorés et les performances matérielles ont augmenté. Cependant, C est toujours très populaire pour plusieurs raisons;
Large support. Presque tous les fournisseurs de puces fournissent un compilateur ac et tout exemple de code et de pilotes sera probablement écrit en c. Les compilateurs C ++ sont de plus en plus courants, mais pas un certificat mort pour une puce donnée, et ils sont souvent plus bogués. Vous savez également que tout ingénieur embarqué pourra travailler en c. C'est la lingua franca de l'industrie.
Performance. Ouais, tu l'as dit. Les performances sont toujours roi et dans un environnement où les routines de base sont encore souvent écrites en assembleur, ou au moins optimisées en c en référence à la sortie de l'assemblage, ne sous-estimez jamais l'importance de cela. Souvent, les cibles intégrées sont très peu coûteuses et ont de très petites mémoires et peu de mips.
Taille. C ++ a tendance à être plus gros. Certes, tout ce qui utilise la STL sera plus grand. Généralement à la fois en termes de taille de programme et d'empreinte mémoire.
Conservatisme. C'est une industrie très conservatrice. En partie parce que les coûts d'échec sont souvent plus élevés et que le débogage est souvent moins accessible, en partie parce qu'il n'a pas eu besoin de changer. Pour un petit projet intégré, c fait bien le travail.
la source
Pour les systèmes embarqués, la grande chose est la performance . Mais comme vous l'avez dit, pourquoi C et pas un autre langage performant?
Jusqu'à présent, beaucoup de gens ont mentionné la disponibilité des compilateurs , mais personne n'a mentionné la disponibilité des développeurs . Beaucoup plus de développeurs connaissent déjà C que, disons, OCaml.
Ce sont les trois biggies.
la source
Le logiciel embarqué est très différent.
Sur une application de bureau, les abstractions et les bibliothèques vous font gagner beaucoup de temps de développement. Vous avez le luxe de lancer un autre couple de mégaoctets ou gigaoctets de RAM ou des cœurs de processeur 64 bits 2 + GHz à un problème, et quelqu'un d'autre (les utilisateurs) paie pour ce matériel. Vous ne savez peut-être pas sur quels systèmes l'application fonctionnera.
Dans un projet intégré, les ressources sont souvent très limitées. Dans un projet sur lequel j'ai travaillé (processeurs PIC 17X), le matériel avait 2 000 mots de mémoire de programme, 8 niveaux de pile (dans le matériel) et 192 octets (<0,2 Ko) de RAM. Différentes broches d'E / S avaient des capacités différentes et vous avez configuré le matériel selon vos besoins en écrivant dans des registres matériels. Le débogage implique un oscilloscope et un analyseur logique.
En mode intégré, les abstractions gênent souvent et gèrent (et coûtent) les ressources que vous n'avez pas. Par exemple, la plupart des systèmes embarqués n'ont pas de système de fichiers. Les fours à micro-ondes sont des systèmes intégrés. Contrôleurs de moteur de voiture. Quelques brosses à dents électriques. Certains écouteurs antibruit.
Un facteur très important pour moi dans le développement de systèmes embarqués est de savoir et de contrôler ce que le code traduit en termes d'instructions, de ressources, de mémoire et de temps d'exécution. Souvent, la séquence exacte des instructions contrôle par exemple la synchronisation des formes d'onde de l'interface matérielle.
Les abstractions et la «magie» en arrière-plan (par exemple, un ramasse-miettes) sont idéales pour les applications de bureau. Les ramasse-miettes vous font gagner BEAUCOUP de temps à rechercher les fuites de mémoire, lorsque la mémoire est / peut être allouée dynamiquement.
Cependant, dans le monde intégré en temps réel, nous devons connaître et contrôler le temps nécessaire, parfois en nanosecondes, et nous ne pouvons pas jeter un couple de mégaoctets de RAM ou un processeur plus rapide en cas de problème. Un exemple simple: lors de la gradation logicielle des LED en contrôlant le rapport cyclique (le CPU n'avait que le contrôle on / off des LED), il n'est PAS OK pour le processeur de s'éteindre et de faire par exemple la collecte des ordures pendant 100 ms car l'affichage serait visiblement flash lumineux ou s'éteindre.
Un exemple plus hypothétique est un contrôleur de moteur qui déclenche directement des bougies d'allumage. Si ce processeur s'éteint et effectue la collecte des ordures pendant 50 ms, le moteur s'arrête un instant ou se déclenche à la mauvaise position du vilebrequin, ce qui pourrait caler le moteur (en passant?) Ou l'endommager mécaniquement. Vous pourriez faire tuer quelqu'un.
la source