web-dev-qa-db-fra.com

Développeur embarqué, quelles compétences sont importantes

Je veux dresser une liste des choses à apprendre qui sont précieuses pour ma carrière. Quelles compétences pensez-vous être vitales pour un développeur embarqué, maintenant et dans un futur lointain?

Je suis devenu assez compétent avec C et ARM assembleur en travaillant avec le noyau Linux embarqué et je suis sur le point de me plonger dans les pilotes Linux. Cependant, je ne peux m'empêcher de penser que je rétrécis peut-être Je veux continuer à travailler avec des systèmes embarqués dans le futur mais on ne connaît jamais le marché du travail (paranoïaque que je vais être externalisé en Chine et en Inde).

Je pense que je suis actuellement assez faible avec C++ et Java, j'aimerais aussi apprendre le noyau Android à l'avenir. Je ne connais pas non plus de langages de script.

Quelqu'un qui a travaillé avec des systèmes embarqués pendant un certain temps peut-il donner des informations sur les compétences/langages qu'il considère comme vitaux pour un développeur embarqué? Dois-je continuer à perfectionner uniquement mes compétences en C ou devrais-je apprendre de nouvelles choses.

14
MrGigu

Voici ma liste:

  • C essentiels
  • POO/C++ - classes, encapsulation, polymorphisme, surcharge/remplacement, modèles
  • Algorithmes - recherche, tri, arbres binaires
  • Modèles de conception - usine, observateur, singleton, etc.
  • Systèmes d'exploitation en temps réel - primitives (sémaphore, mutex), techniques de planification, espace utilisateur/noyau
  • Principes de base de Linux, écriture de pilotes, Shell
  • principes de base du microprocesseur - traitement des interruptions, registres, code d'assemblage, etc.
  • principes de base du microcontrôleur - ADC, DAC, minuteries, PWM, DMA, chien de garde, etc.
  • Mémoire - NOR, NAND, SRAM, DRAM, nivellement d'usure
  • Protocoles de base - I2C, SPI, UART, LIN
  • Protocoles avancés - SATA, PCIE, USB, CAN, MOST
  • Programmation simultanée/parallèle - MPI pour SMP etc.
  • UML - diagramme de classes, diagramme de composants, diagramme d'état, diagramme de séquence
  • Perl ou Python pour les scripts, par exemple pour modifier des fichiers texte simples.
  • Java et Android
  • Electronique de base - lecture de schémas, à l'aide d'un oscilloscope, d'un multimètre, d'un fer à souder
  • Techniques spécialisées pour la programmation intégrée, par ex. anti-rebond des interrupteurs, interrupteurs à échelle résistifs, encodeurs rotatifs, etc.
  • génie logiciel - SDLC, CMMI, méthodes agiles, par ex. SCRUM, contrôle de version (ClearCase, git, svn), suivi des bogues (JIRA?), Vérification de code statique, Lint, test unitaire, intégration continue
  • construire des environnements - makefile, cmake
  • FPGA de base/ASIC, DSP de base
31
ruben2020

Comme mentionné par Lundin, cette question est ouverte à de nombreuses réponses différentes. Vous disposez de petits périphériques embarqués bare metal alimentés par batterie et limités par la mémoire à des systèmes plus complexes exécutant Linux.

Tout d'abord, il est très important d'être un développeur flexible. Vous devez être capable de vous adapter le plus rapidement possible aux changements. Vous devrez peut-être créer un prototype à l'épreuve du concept en quelques semaines dans un langage que vous n'avez jamais utilisé auparavant, ou commencer à travailler dans un projet hérité pour corriger un bogue très rapidement.

Il est très important de connaître les concepts d'architecture logicielle, RTOS, les systèmes événementiels (les systèmes embarqués sont réactifs par nature) et la modélisation également (UML). Peut-être le développement piloté par les tests (TDD). Ceux-ci sont indépendants du langage et vous aideront à développer un bon firmware à partir de zéro.

En ce qui concerne les langages, je pense que C est utilisé dans les petits et grands systèmes, donc avoir une bonne expérience en C est un must. Ici, je ne parle pas de programmation c à un niveau novice. Je parle de savoir ce que font le processeur et le compilateur dans les coulisses. D'après ce que vous avez mentionné, vous possédez probablement ces compétences. Ceci est très utile dans le cas des petits systèmes, où chaque octet de RAM et ROM compte. Connaître quelque chose sur les règles MISRA-C vous aidera à développer code C plus sûr.

Vous aurez probablement besoin de programmation de script pour effectuer des tests automatisés, le traitement des données, des outils de génération de code, etc. J'utilise Python pour tout cela, et aussi des scripts Linux Shell.

Être capable de concevoir des applications sur PC est utile pour créer des montages de test pour tester les appareils embarqués dans la ligne de production, ou peut-être parce que l'appareil embarqué a juste besoin d'un logiciel PC pour fonctionner, comme un oscilloscope USB de poche. Dans ce cas, j'utilise Qt, car il est multiplateforme, mais vous pouvez utiliser Visual Studio avec C # si vous souhaitez uniquement travailler sous Windows.

Dans le cas des systèmes embarqués, il est préférable d'avoir une solide expérience matérielle. Vous devez également pouvoir utiliser un oscilloscope, un analyseur logique, un générateur de signaux, etc. Parfois, vous devrez résoudre des problèmes matériels avec un logiciel. :)

Voici une petite liste de livres que je trouve très utiles:

  • Statecharts UML pratiques en C/C++.
  • UML distillé.
  • Création de systèmes embarqués.
  • Les ordinateurs en tant que composants.
  • Introduction au logiciel intégré.
  • Meilleur logiciel de systèmes embarqués.

J'espère que cela aide.

Fernando

7
Fernando

Quel que soit le domaine que vous souhaitez sélectionner, vous devez non seulement connaître la programmation C, mais également bien connaître le matériel.

Peu importe le domaine sur lequel vous travaillez (linux, vlsi, arm ...). Mais peu importe l'efficacité de l'exécution de votre code sur le matériel.

Si vous souhaitez vraiment travailler dans le monde embarqué, vous trouverez votre chemin.

2
Kapil Chittewan