Langages de programmation pour les ingénieurs en électronique

22

Je suis un étudiant en génie électronique et des communications, avant d'arriver à l'université, je me suis intéressé à la programmation et aux applications informatiques. Je m'étais concentré sur la conception d'applications Windows et l'apprentissage de ses techniques, mais maintenant, je pense que cela est inutile dans mon domaine ... Je n'ai pas à tout apprendre sur l'informatique et le développement de logiciels! (Ai-je raison à ce sujet?)

Je connais VB .Net, C # et C ++. J'ai beaucoup de temps dans mes vacances donc je veux approfondir par programmation dans le "domaine électronique". Alors, que recommanderiez-vous d'apprendre ou de vous concentrer?

Je veux que ces langages soient utilisés dans la programmation des microcontrôleurs et autres circuits intégrés. Le C ++ est-il suffisant ou je devrais également maîtriser le C? Dites-moi vos pensées s'il vous plaît.

Siraj Muhammad
la source
3
"Solder" Ou plus sérieusement, le simple C est assez traditionnel pour les outils de support, bien que le python soit un peu à la mode actuellement.
Chris Stratton

Réponses:

29

Oui, c'est presque certainement une bonne chose pour apprendre à utiliser le C aussi bien que possible (C ++ vous donnera un point de départ utile, bien que gauche , il y aura encore beaucoup de choses à ramasser, en particulier les différences entre le codage pour les petits systèmes embarqués par rapport à l'écriture pour quelque chose comme Windows) étant donné son ubiquité.

La plupart des microcontrôleurs en dessous d'une certaine taille (par exemple PIC, AVR, MSP430, etc.) utilisent C (ou assembleur) car il existe de nombreuses versions de haute qualité (gratuites et $$ - par exemple, de nombreux compilateurs commerciaux sont basés sur le compilateur GCC gratuit) Compilateurs C disponibles .
Vous obtenez d'autres langues comme l'excellent JAL pour PIC (l'auteur original Wouter Van Ooijen qui est membre ici), PICBASIC, les variantes Ada, mais en raison de sa popularité et du nombre de compilateurs disponibles, je dirais que C est la langue de choix pour la plupart. Bien que cela ne signifie certainement pas que c'est la meilleure langue, l'utilisation de la langue la plus populaire présente des avantages évidents (documentation, support, portabilité, collaboration, etc.)
Pour les micros 32 bits plus complexes et plus grands comme de nombreuses variantes ARM, il existe également C ++ et autres compilateurs disponibles.

Je sauterais directement dedans et saisirais quelques conseils de développement et obtiendrais le codage. Vous pouvez choisir un micro 8 bits bas de gamme comme le PIC16F (de nombreux kits de démarrage sur Microchip Direct)
Un micro 16 bits milieu de gamme comme le PIC24, et également un ARM linux C / C ++ / embarqué d'une certaine sorte - le STM32F4 ARM Cortex M4 Discovery est une carte de développement très bon marché qui pourrait valoir la peine d'être saisie.
Du côté de la logique programmable et du langage de description matérielle (HDL - les deux grands sont Verilog et VHDL), il peut également être utile de se procurer une carte de développement FPGA ou CPLD de Diglent ou similaire.

Si vous ne voulez pas attendre une carte de développement, vous pouvez télécharger MPLAB ou MPLABX et utiliser l'excellent simulateur pour vous essayer au développement PIC. Il en va de même pour d'autres outils, par exemple, vous pouvez télécharger Xilinx ISE Webpack gratuitement et essayer des HDL et une conception de logique programmable.

Oli Glaser
la source
9
Les PIC peuvent être bon marché, mais au risque de déclencher une guerre des flammes, je dirais que l'utilisation d'un PIC comme outil d'apprentissage vous apprend à programmer des PIC plutôt que de vous apprendre à programmer un microcontrôleur à usage général. Pour cela, les MSP, AVR (Arduino), Low end ARM Cortex ou même les vénérables processeurs 8051 fourniraient des compétences plus facilement transférables.
u
Merci beaucoup ... c'était très utile. Mais pour résumer votre réponse: ce dont j'ai besoin en ce moment, c'est de continuer à travailler sur C ++ et à maîtriser le C, à apprendre Verilog ou VHDL ou les deux, et à saisir quelques conseils de développement pour pratiquer ou simplement utiliser ces simulateurs comme début.
Siraj Muhammad
1
@SirajMuhammad - Oui, c'est à peu près tout, à part apprendre à la fois Verilog et VHDL n'est probablement pas nécessaire, car ils peuvent généralement être utilisés ensemble dans une conception (ainsi, par exemple, vous pouvez utiliser un processeur soft core conçu par quelqu'un d'autre en VHDL, dans votre conception Verilog, et il fonctionnera bien) alors choisissez-en un.
Oli Glaser
4
@Ian - Je ne dis pas que ce doit être un PIC, c'est juste un exemple (d'où le "comme un PIC") En tout cas, si vous programmez en C, je ne pense pas qu'il y ait beaucoup de différence entre l'un des petits micros là-bas. Bien sûr, apprendre à vraiment connaître un micro à l'intérieur (assemblage et tout) est utile, mais pour commencer à un niveau supérieur, les choses devraient ressembler à peu près, les outils étant différents. Je pense qu'il vaut la peine d'essayer quelques-uns avant de s'engager sur quoi que ce soit.
Oli Glaser
2
"ne devrait pas être trop difficile si vous connaissez déjà le C ++"? Je ne serais pas d'accord là-dessus, quelqu'un qui connaît "VB .Net, C♯ et C ++" utilise probablement ce dernier dans un style RAII orienté objet plutôt élevé et pourrait bien avoir besoin de temps pour bien saisir le manuel gestion de la mémoire.
leftaroundabout
23

Apprenez C et obtenez une carte de développement de microcontrôleur bon marché, comme un MSP430 ou ARM Cortex, et au moins écrivez et chargez quelques programmes C.

J'ai un diplôme en informatique et une formation en développement de logiciels, principalement en programmation C ++ pour les jeux et maintenant des jeux et applications iOS, mais mon dernier travail était un concert semi-pro EE qui a commencé par faire un tas de programmation de firmware pour un système ARM Cortex M3 , puis j'ai fini par apprendre à faire une conception de circuit de base et une disposition de carte et à concevoir quelques cartes simples. J'ai donc dû essentiellement faire face au problème de l'utilisation du meilleur langage de programmation pour faire le pont entre la conception matérielle et logicielle en tant que responsable des deux extrémités.

C est absolument la langue que vous devez connaître. C'est facile pour les gens qui programment en C ++ et n'ont jamais vraiment à se limiter à l'ensemble de fonctionnalités de C pour dire "c'est la même chose" mais ce n'est pas le cas. Surtout la façon dont C ++ a évolué et rassemblé les fonctionnalités, et la façon dont les programmeurs C ++ traditionnels utilisent ces fonctionnalités, c'est vraiment très différent de travailler sur une application C assez grande par opposition à une application C ++. Votre SDK de firmware sera un tas de bibliothèques C, tout ce qui s'adaptera à un MCU sera une bibliothèque C, tout OS qui a du sens sur un MCU sera écrit en C, etc. etc.

Cela dit, puisque la plupart des chaînes d'outils MCU finissent par utiliser GCC comme compilateur, vous aurez presque certainement un compilateur C ++ disponible si vous utilisez une famille MCU décente. Mais vous devez faire très attention aux fonctionnalités que vous utilisez, en particulier les éléments de la bibliothèque standard, car il est très facile de se retrouver avec un binaire beaucoup trop gros pour tenir sur votre appareil. Je pense qu'il y a de bonnes raisons d'être en faveur de l'utilisation de C ++ sur les appareils intégrés, C ++ a quelques fonctionnalités intéressantes qui ont une litière ou aucune pénalité de taille ou de vitesse, il vous suffit de savoir ce que vous faites et d'écrire du code de cette manière plus loin sur l'extrémité de style C du spectre que l'extrémité STL du spectre en termes d'utilisation intelligente des fonctionnalités.

Ne faites pas trop attention aux gens qui disent que vous pouvez utiliser Lua ou Python sur un MCU avec le bon interprète intégré bla, bla. C'est vrai, je l'ai fait et c'est amusant, mais pour le moment c'est plus pour des projets de jouets et des trucs qui apparaissent sur Hack a Day. Je pense que nous verrons plus de ce genre de chose car la loi de Moore est appliquée sans relâche même aux plus petits processeurs, c'est quelque chose qui s'est produit avec des jeux où il y avait beaucoup d'assemblage, puis ils ont tenu plus longtemps avec C et C ++ que tout le monde, et maintenant tout est si rapide, et la productivité des développeurs est si importante que beaucoup de développement se fait avec des langages de haut niveau intégrés ou dans un langage de haut niveau. Même ainsi, il faudra quelques années avant de voir des entreprises embaucher des programmeurs de firmware avec des antécédents Python et Lua.

Ne passez pas trop de temps à l'assemblage non plus. Ce n'est pas mal de se familiariser avec les concepts, mais il est peu probable que vous vous retrouviez à faire beaucoup, voire aucune programmation d'assemblage. Il y a comme cette sagesse conventionnelle avec des jeux et embarqués que c'est un assemblage «bon à savoir», souvent répété par des gens qui ne travaillent pas réellement dans ces domaines. Mais en réalité, il est très peu probable que vous écriviez un assemblage, et si vous le faites, ce ne sera probablement que quelques lignes d'optimisation ou quelque chose avec le matériel pour lequel vous n'avez tout simplement pas d'API (mais vous après avoir écrit celui qui encapsule quelques lignes d'assemblage). J'ai travaillé sur plusieurs jeux et ce projet de conception de cartes / micrologiciels et le nombre total de lignes d'assemblage que j'ai écrites pour des projets commerciaux est probablement à l'adolescence. Il'

Suboptimus
la source
1
Il vaut la peine de dire que vos quelques lignes d'assemblage seront probablement dans des instructions d'assemblage en ligne ( asm()), bien intégrées dans votre code C. C'est une combinaison gagnante à tous points de vue. Niveau élevé mais compact avec des plongeons occasionnels dans l'assemblage lorsque, par exemple, le timing doit être juste. La avr-gccchaîne d'outils le fait déjà beaucoup avec les macros C, donc vous ne le remarquerez jamais.
Alexios
9
Il est probablement plus important de pouvoir LIRE l'assemblage plutôt que d'avoir à l'écrire. Cela vous permet de comprendre ce que le compilateur dit au micro de faire et, dans de très rares cas, d'être capable de repérer quand le compilateur se trompe. Vous devez également avoir une certaine compréhension de l'assemblage pour tirer le meilleur parti de vos outils de débogage et utiliser la fonctionnalité en une seule étape qu'ils fournissent.
u
1
Je suis définitivement d'accord avec ça. Je pense que l'un des meilleurs exercices pour un aspirant programmeur est d'écrire un compilateur de langage jouet et un générateur de code qui gère au moins les fonctions, les tableaux et les structures pour apprendre à quoi ressemble un cadre de pile et à quoi ressemblent les éléments de base d'un langage de programmation dans l'assemblage .
Suboptimus
3
@Ian - Pouvoir lire l'assembleur est inutile si vous ne savez pas l'écrire. Vous devez le lire et le comparer à ce que vous auriez fait si vous l'aviez écrit.
Rocketmagnet
2
@Rocketmagnet - Vous n'êtes pas là pour vérifier que le compilateur a généré l'implémentation d'assemblage la plus efficace. L'exigence est que vous avez la possibilité de lire l'assembleur généré et de vérifier que la logique du code implémenté correspond à votre intention. C'est la même chose que d'utiliser d'autres langues humaines. Je peux lire et comprendre beaucoup plus le français, l'allemand et le latin que je ne peux parler ou écrire.
uɐɪ
10

Je suis d'accord avec tout le monde que vous devez être très compétent en C.

Je recommanderais également d'apprendre au moins un langage d'assemblage. Faire cela vous fera un bien meilleur programmeur C. Vous devez savoir ce qui se passe sous le capot, et cela est beaucoup plus vrai dans le monde embarqué que dans le monde PC.

Comprendre l'assembleur que votre C génère vous permettra d'écrire un C plus optimal en termes de vitesse et de compacité. Un code plus rapide signifie:

  • vous pouvez utiliser un MCU moins cher et plus lent et réduire la concurrence.
  • vous pouvez réduire la fréquence d'horloge pour une meilleure conformité EMC.
  • dans une application à faible consommation d'énergie, le MCU peut passer plus de temps en veille, ce qui entraîne directement une augmentation de la durée de vie de la batterie.

Un code plus compact signifie que vous pouvez utiliser un MCU moins cher avec moins de mémoire. Ou avez de la place pour plus de fonctionnalités.


L'autre langue que vous pourriez envisager d'apprendre est Verilog . Il s'agit d'un langage de description du matériel, et il est vraiment très différent du C, non seulement dans son apparence, mais aussi dans ses fonctionnalités. Verilog ouvrira la voie à l' exploitation de puces très puissantes comme les Cypress PSoC3 et 5 . C'est un microcontrôleur avec du matériel reprogrammable analogique et numérique, qui vous permet de faire des choses incroyables qui sont très difficiles à faire avec n'importe quel autre MCU. Vous pourrez également faire la conception FPGA .

Rocketmagnet
la source
Qu'entendez-vous par "un seul langage d'assemblage"? Je sais qu'il existe une langue appelée Assemblée, a-t-elle des branches ou quelque chose comme ça? Pouvez-vous en nommer quelques-uns s'il vous plaît? Et merci beaucoup pour votre réponse.
Siraj Muhammad
4
Chaque type de CPU ou MCU a son propre langage d'assemblage avec des instructions différentes. Ils sont tous assez similaires, mais avec des différences importantes. Apprenez le langage d'assemblage pour le MCU que vous utilisez.
Rocketmagnet
1
J'allais dire exactement cela. C et Assembly sont les plus utilisés en génie électronique, car vous avez généralement affaire à des choses de bas niveau. Orienté objet n'est pas vraiment bien utilisé, le genre de réflexion de bas niveau qui vient de C / Assembly s'applique également à tout ce avec quoi vous travaillez.
Muz
9

En tant que MSEE qui travaille dans l'industrie de la défense depuis 8 ans, je peux vous dire que comprendre comment bien programmer dans LabVIEW (un langage de flux de données graphique et typé) signifie que vous ne serez jamais à court de travail.

LabVIEW a commencé comme un langage de programmation pour les ingénieurs hardware, vous pouvez le voir dans le fait que le code ressemble beaucoup à un schéma de circuit. Cependant, au cours des 25 dernières années, LabVIEW est devenu un langage à part entière riche en fonctionnalités prenant en charge l'orientation d'objet et le multithread. En fait, je dirais qu'il n'y a pas d'autre langage de programmation, basé sur du texte ou autre, qui soit plus facile à programmer une application multithread que LabVIEW; ceci est en grande partie dû à son paradigme de flux de données. Alors que le nombre de cœurs de CPU continue d'augmenter, LabVIEW deviendra de plus en plus pertinent en tant que langage à usage général.

Un autre avantage de la connaissance de LabVIEW est que vous n'êtes qu'à un jet de pierre de la programmation des FPGA à l'aide du module LabVIEW FPGA qui prend votre code LabVIEW et le convertit en VHDL dans les coulisses avant de le transmettre au compilateur Xilinx. Vous pouvez également utiliser vos compétences LabVIEW pour passer à la programmation de code en temps réel via le module LabVIEW en temps réel qui utilise VxWorks ou Phar Lap.

Remarque: je suis un développeur LabVIEW certifié.

entrez la description de l'image ici

SiegeX
la source
5
Toute la production LabVIEW que j'ai vue ressemble plus à ceci: thedailywtf.com/Articles/Labview-Spaghetti.aspx Je ne doute pas qu'il existe un marché du travail solide pour ceux qui souhaitent maintenir un tel code.
markrages
@markrages On m'a demandé de maintenir et / ou d'étendre du code qui était presque aussi mauvais, peut-être pire qu'il y avait aussi des appels de VI dynamiques et des globaux. Ce problème est l'épée à double tranchant qu'est LabVIEW. D'une part, ils le commercialisent comme un langage dans lequel tout ingénieur peut programmer, mais sans aucune base solide en architecture logicielle, vous finissez par obtenir du code comme celui-ci. Heureusement, NI a suffisamment résolu ce problème avec LabVIEW 2012 en fournissant des modèles bien écrits et commentés pour les architectures commençant par la machine d'état simple au cadre d'acteur complexe basé sur la POO.
SiegeX
@markrages Le problème est double. Premièrement, la direction donne aux ingénieurs juste assez de formation pour être dangereux. Je dirais que les programmeurs LabVIEW 9/10 que j'ai rencontrés dans mon entreprise et qui ont suivi une formation n'ont suivi que les deux premiers cours de base qui vous enseignent essentiellement la syntaxe. Deuxièmement, LabVIEW est devenu un langage riche en fonctionnalités qui rivalise encore avec tout langage moderne car sa gestion graphique pense que cela doit être facile. Managemnt ne demanderait jamais à un ingénieur logiciel de concevoir un circuit moyen à complexe, mais ils n'ont aucun problème à lancer une EE sur un problème logiciel complexe s'ils "connaissent LabVIEW"
SiegeX
@markrages: Juste quand on m'a rappelé pourquoi j'aimais LabVIEW, j'ai vu votre commentaire et je me suis souvenu pourquoi je le détestais. Oh, les heures de frustration sont revenues en même temps.
Jonny B Good
6

Si vous voulez faire de la programmation de bas niveau de microcontrôleurs, alors vous devriez être à l'aise avec la programmation en langage assembleur (plus les architectures sont différentes, mieux c'est), et oui, vous utiliserez C beaucoup plus que vous n'utilisez C ++.

Pour les travaux d'ingénierie générale, des langages mathématiques tels que Matlab (également Scilab et GNU Octave) seront couramment utilisés pour la modélisation et le prototypage.

En outre, de nombreux IDE pour les logiciels et le matériel sont scriptables, généralement en utilisant TCL ou LUA, donc une certaine familiarité avec les langages de script en général (également Perl, Python, PHP, Javascript, etc.) serait utile.

Pour la conception matérielle, vous aurez besoin de compétences Verilog et / ou VHDL.

Dave Tweed
la source
6

Le C ++ est-il suffisant? Peut être.

N'oubliez pas que C est utilisé dans quelque chose comme 90 à 99% de tous les mcu: s, donc C est un must sur votre CV.

Mais comme vous êtes un gars de haut niveau, vous pouvez commencer à jouer avec l'Arduino: car ils sont programmés avec un C ++ réduit, et cela donnerait une idée approximative de ce que C ++ peut faire dans le monde des mcu en ce moment.

Johan
la source
3

Pour les microcontrôleurs (et je ne traiterai que des microcontrôleurs), je pense que C est un langage d'entrée bien meilleur que C ++. L'assemblage serait la prochaine étape, fantastique pour vous aider à comprendre comment votre compilateur C vous gâche, crée des bogues, vole les tics d'horloge, etc. et tire le meilleur parti de votre plate-forme. Tout cela suppose que vous parlez d'un microcontrôleur - pas d'un Arduino, d'un BASIC Stamp ou de toute autre plate-forme impliquant un microcontrôleur enveloppé.

Difficile de dire ce qui est utile pour "votre domaine" - et de suggérer qu'en tant qu'étudiant, vous ne savez peut-être pas encore vraiment quel est votre domaine !! - mais je pense que votre langue semble assez raisonnable et vous vous en servirez encore et encore. À tout le moins, avoir une bonne maîtrise d'un langage structuré rend le suivant beaucoup plus facile, mais je pense que vous trouverez toujours vos compétences en programmation Windows agréables à avoir dans votre poche.

Scott Seidman
la source
2

Vous pouvez apprendre C et le type de code assembleur généré par les instructions C si vous travaillez avec des processeurs, mais vous devez également vous apprendre à utiliser un shell de ligne de commande Unix tel que bash et les outils qui l'accompagnent tels que sed, ed, awk, vim / vi, find, tar, gzip, ... ainsi que Python que vous pouvez utiliser sur de nombreuses plateformes et est un bon moyen de "faire avancer les choses".

Paddy3118
la source
2

Vous devez apprendre le C si vous voulez être un développeur embarqué sérieux. Vous devez également connaître l'assembleur même si vous l'utiliserez probablement très rarement.

mjh2007
la source
0

Je vais d'abord définir l'ingénieur en électronique comme désignant une personne impliquée dans la conception matérielle, du micrologiciel à la conception de la carte et à la conception de la puce. Dans certains cas, vous ferez un firmware, comme indiqué ci-dessus, vous aurez besoin de "C". Un logiciel plus profond devient simplement un outil, la compréhension de certains concepts comp sci dans des langages complémentaires du C / C ++ au langage Lisp sera plus importante que les spécificités. Vous aurez besoin d'un logiciel pour soutenir vos efforts de conception, mais cela ne prend pas le pas sur la compréhension des limites fondamentales de ce qui peut être fait dans une implémentation physique. La conception numérique n'est PAS Verilog / VHDL même si la conception est exprimée dans ces langues. Dans une conception entièrement personnalisée et in silico, vous verrez des langages similaires à Lisp et des langages fonctionnels C.

espace réservé
la source