Je suis approché avec un travail pour écrire du C embarqué sur des microcontrôleurs. Au début, j'aurais pensé que l'intégration de la programmation est trop faible pour moi dans la pile logicielle, mais je pense peut-être mal.
Normalement, j'aurais ignoré l'occasion d'écrire du code intégré, car je ne me considère pas comme un ingénieur électricien. Est-ce une mauvaise hypothèse? Suis-je capable d'écrire des logiciels intéressants et utiles pour les systèmes embarqués, ou vais-je me donner un coup de pied pour être tombé trop bas sur la pile logicielle?
Je suis allé à l'école d'informatique et j'ai vraiment aimé écrire un compilateur, penser à des algorithmes simultanés, concevoir des structures de données et développer des cadres. Cependant, je suis actuellement employé en tant que développeur Web, ce qui ne crie pas les choses intéressantes que je viens de décrire. (Je traite actuellement des problèmes tels que: "cette case à cocher doit être de 4 pixels à gauche" et "cette date est mal formatée".)
J'apprécie la contribution de tout le monde. Je sais que je dois prendre la décision pour moi-même, je voudrais juste des éclaircissements sur ce que cela signifie d'être un programmeur intégré, et si cela correspond à ce que je trouve intéressant.
Si vous voulez être bon pour travailler sur des systèmes embarqués, alors oui, vous devez penser comme un EE de temps en temps. C'est généralement lorsque vous écrivez du code pour interfacer avec les différents périphériques (bus série comme UART, SPI, I2C ou USB), les temporisateurs 8 et 16 bits, les générateurs d'horloge et les ADC et DAC. Les "fiches techniques" pour les microcontrôleurs se retrouvent souvent dans les centaines de pages car elles décrivent chaque bit de chaque registre. Il est utile de pouvoir lire un schéma pour pouvoir sonder une carte avec un oscilloscope ou un analyseur logique.
À d'autres moments, il s'agit simplement d'écrire un logiciel. Mais sous des contraintes strictes: souvent, vous n'aurez pas de système d'exploitation formel ou autre framework, et vous pourriez n'avoir que quelques Ko de RAM et peut-être 64 Ko de mémoire de programme. (Ces limites supposent que vous programmez sur des micros 8 ou 16 bits plus petits; si vous travaillez avec Linux embarqué sur un processeur 32 bits, vous n'aurez pas les mêmes contraintes de mémoire mais vous devrez toujours faire face à n'importe quelle coutume matériel périphérique pour lequel votre distribution Linux ne fournit pas de pilotes.)
J'ai une formation en EE et en CS, donc j'apprécie les deux côtés de la médaille. Je fais également de la programmation Web (principalement PHP) et des applications de bureau (C # et Delphi), mais j'ai toujours aimé travailler sur des projets intégrés.
La réponse de @ tcrosley est excellente. Vous n'avez pas besoin d'être ingénieur électricien, mais connaître les bases aide.
Je ne pense pas que vous ayez à craindre d'être "trop bas sur la pile logicielle". J'ai dû résoudre de nombreux problèmes très intéressants en tant qu'ingénieur embarqué. Vous mentionnez une liste de tâches que vous avez appréciées:
Algorithmes simultanés - Le traitement des interruptions de niveau matériel asynchrones présente autant de défis intéressants que l'utilisation d'un modèle de thread OS.
Conception de structures de données - Vérifier. Conception pour la compacité et un accès efficace.
Élaboration de cadres - Vérifiez. Sur les systèmes bare bones, vous pouvez finir par concevoir un mini-OS.
Écrire un compilateur - peut-être pas, mais vous pouvez finir par faire une optimisation de code de bas niveau similaire à l'étape de génération d'assemblage d'un compilateur.
Je choisirais de travailler sur des systèmes embarqués plutôt que de coder des interfaces utilisateur n'importe quel jour. Vous n'oublierez jamais la première fois que vous regardez une machine commencer à bouger comme vous l'avez programmée. C'est bien plus satisfaisant que de pousser des pixels.
En tant que programmeur intégré, mon travail consiste à faire fonctionner du matériel personnalisé. En règle générale, j'ai développé un tas de logiciels sur une carte de développement ou une version précédente du matériel. Lorsque la nouvelle carte arrive, mon travail consiste à mettre mon logiciel sur la carte et à démontrer que tout fonctionne.
Parce qu'il y a presque toujours un problème quelconque, les compétences de débogage sont essentielles. Si le périphérique externe ne fonctionne pas, s'agit-il d'une puce défectueuse, d'une mauvaise connexion à la puce, d'un code de bogue ou d'une mauvaise utilisation du périphérique intégré? La seule façon de le savoir est un débogage étendu. Cela signifie être à l'aise avec les oscilloscopes, les analyseurs de réseau, les analyseurs logiques et les débogueurs cibles. Le processus de débogage devient presque scientifique. Je développe une hypothèse, conçois une expérience pour fournir des preuves pour ou contre mon hypothèse, et teste.
Lors de l'évaluation de stagiaires ou de nouveaux ingénieurs intégrés, cette compétence est la plus critique. Tous les logiciels ont des problèmes, mais une fois que vous commencez à vous interfacer avec les mondes physiques, la variété de ces problèmes augmente de façon exponentielle. L'essence de mon travail est de résoudre la longue série de problèmes entre concept et réalité.
D'après mon expérience, on obtient de meilleurs résultats en approchant le développement de logiciels de systèmes embarqués avec un chapeau de "développeur de logiciels" plutôt qu'avec un chapeau "d'ingénieur en électronique". (les pratiques comme TDD et CI sont moins courantes en génie matériel)
D'un autre côté, je pense que l'expérience de développement pour un système embarqué rend un meilleur; développeur de logiciels plus complet.
J'étais dans une situation similaire il y a environ 8 ans. J'ai eu à ce moment 7 ans de développement logiciel dans des environnements applicatifs et serveurs. Ma seule expérience dans le traitement de bas niveau avec du matériel auparavant avait été l'écriture dans l'assembleur Z80 à l'adolescence sur un spectre ZX.
C'était certainement un défi. J'ai trouvé le traitement des jeux de puces dans l'assembleur très agréable et j'ai certainement beaucoup appris sur le matériel. Une partie substantielle de mon rôle consistait à tester le matériel à l'aide de logiciels, donc apprendre à gérer la programmation et reconnaître que votre bogue logiciel est en fait un bogue matériel. En fait, il peut parfois falloir beaucoup de travail aux personnes chargées des logiciels et du matériel pour identifier si un bogue est matériel ou logiciel.
Un aspect que je n'ai pas réussi à livrer était le travail du pilote de périphérique. Je n'ai jamais vraiment compris cela, ce qui est une chose que moi-même et le chef d'entreprise n'avons jamais compris pourquoi. C'est devenu un fait accepté.
Se familiariser avec un occiloscope et un ion à souder sera essentiel. en se souvenant que lorsqu'un gars du matériel dit le numéro 26, il signifie TOUJOURS que 0x26 est utile. Se rendre compte que les ingénieurs en matériel trouvent très frustrant la gestion des logiciels, mais un projet matériel qui n'implique pas de logiciel s'appelle un câble.
Je suis resté dans ce rôle pendant 4 ans et je ne suis parti que parce que j'étais braconné pour une opportunité vraiment fantastique.
Je ne suis pas ingénieur électricien, mais j'ai fait un peu de développement de logiciels embarqués. Le plus gros problème que j'ai trouvé est que j'ai une formation beaucoup plus basique en mathématiques, et donc je ne sais pas comment décomposer facilement une série complexe d'algorithmes mathématiques avancés en code sans beaucoup d'aide.
Pour toutes les choses où j'ai dû jouer avec la signalisation, lire les valeurs des entrées, soumettre des données aux sorties, et tout ce genre de choses, je l'ai trouvé peu différent conceptuellement de ce que je fais au jour le jour comme un bon Développeur de logiciels à l'ancienne. L'écriture de logiciels est vraiment ce qu'elle est. C'est lorsque vous devez aller au-delà du logiciel réel que je trouve que les choses deviennent difficiles parce que je n'ai pas les connaissances nécessaires pour jouer directement avec le matériel. Cela se produit généralement lorsque vous essayez de déboguer ou de tester le code. Si vous avez une très bonne chaîne d'outils, vous pourriez avoir intégré un environnement de débogage et de simulation pour éliminer la plupart des problèmes, mais même avec tout cela pour vous aider, vous devez parfois revenir aux bases et tester votre code une sorte d'analyseur, et la réalité est que la plupart des plates-formes embarquées ne vous offrent pas le luxe de plus qu'un compilateur de base et un Ouija-Board d'EE pour vous aider.
De ce point de vue, je ne pense pas qu'être ingénieur électricien soit essentiel à la programmation intégrée si les tâches sont simples et que les exigences spécifiques au matériel sont minimes. Au-delà de cela, je pense qu'être EE rendrait la vie beaucoup plus facile lorsque l'on travaille dans un environnement intégré, en particulier lorsqu'une véritable science est nécessaire pour déterminer où sont les problèmes.
Je n'ai pas fait de programmation embarquée au niveau de l'entreprise, mais mon baccalauréat portait principalement sur les systèmes embarqués, dont j'ai quelques années d'expérience réelle. Nous avons utilisé C sur Atmel AVR et touché quelques puces Texas Instruments avec VHDL, et avons eu quelques trucs théoriques sur ARM.
Dans ce que nous avions, c'était environ 50 à 60% de programmation (C), 20% de planification/conception (UML), et le reste était de l'électronique physique (soudure, mesure, câblage, fabrication de câbles, etc.). Je suis également d'accord pour dire que c'était très intéressant et amusant à faire, et j'aimerais vraiment avoir une carrière dans les systèmes embarqués. Hélas, avec un très petit marché de systèmes embarqués, j'ai dû recourir à un ancien Java EE.
Mais je m'égare; Je dirais que les pourcentages mentionnés ci-dessus sont assez proches des emplois du monde réel, puisque nos enseignants ont leurs propres entreprises, et ont également mentionné qu'ils essaieront de le rendre aussi réaliste que possible. Nous avons même eu des virages aléatoires à 180 degrés dans les exigences à mi-projet, hé hé.
Quant à la pile. Connaître la programmation intégrée vous donnera de grandes chances de créer vos propres produits matériels et très réels que vous auriez pu fabriquer dans de vraies usines en Asie, puis de les assembler dans vos locaux (que ce soit à la maison ou dans votre propre entreprise). C'est très intéressant! Vous pouvez également créer de nombreux gadgets qui vous seront utiles à la maison, tels que des lampes à foyer contrôlé par le mouvement, une minuterie pour une machine à café pour préparer automatiquement votre joe du matin, etc. Des trucs excitants en effet!
Comme tout, cela nécessite une approche équilibrée. J'adore travailler avec des systèmes embarqués dans mon travail de jour. Ils me rendent meilleur en génie électrique. L'informatique physique et l'automatisation sont très excitantes. D'un autre côté, créer des applications Web et bricoler avec le cloud computing est génial.
Si vous le faites correctement, le côté logiciel cherchera des moyens de faire les choses plus intelligemment et mieux. Le côté matériel de vous vous gardera à l'esprit des ressources et super efficace.