¿Cuáles son las habilidades necesarias para ser un ingeniero de firmware exitoso?

Si está buscando un libro de principiante decente en sistemas integrados, le recomendaría Making Embedded Systems.

Para tener éxito técnico como ingeniero de firmware, es importante tener una buena comprensión del hardware y del software en el que está trabajando.

Hardware:
Como es un ingeniero eléctrico, el hardware puede ser más natural para usted, pero es importante comprender cómo funcionan los diversos componentes de una placa. Por ejemplo, tiene un circuito que activa un borde en un pin, lo que provoca que se dispare una interrupción. La mayoría de los ingenieros de firmware que trabajan en la creación de placas y depuración deben sentirse muy cómodos con el uso de ámbitos, analizadores lógicos, pruebas de circuitos, etc.

Software:
Comenzaré desde conceptos de muy bajo nivel a niveles superiores.
1. Arquitectura de la computadora: en primer lugar, comprender cómo funciona una computadora. Una buena comprensión de la arquitectura de la computadora es importante. Después de todo, está trabajando con una computadora, por lo que necesita comprender las instrucciones de ensamblaje que utiliza su micro, cuántos ciclos tarda una instrucción en ejecutarse, cuántas etapas hay en la tubería, si hay datos separados y un bus de instrucciones, etc.
Recuerdo haber visto un video de Dan García cuando aprendí arquitectura de computadoras. Es un gran maestro y hace que la clase sea divertida.
2. Comprensión de periféricos, manuales de referencia, hojas de datos: en mi opinión , este es el siguiente nivel de abstracción. Si bien el núcleo de la arquitectura de la computadora se aplica a todos los microcontroladores, varios fabricantes y micros tendrán varios periféricos e instrucciones sobre cómo acceder a ellos. Lo que quiero decir con periféricos son sus GPIO, temporizadores, ADC, UART, I2C, DMA, CAN, etc. Para ser un experto, desea comprender cómo funcionan estas cosas desde la perspectiva del hardware y del programador. ¿Qué tipo de errores se introducen con las lecturas de ADC? El manual de programación tendrá información sobre cómo usar el periférico correctamente, como la secuencia que debe usar para modificar la frecuencia de reloj PLL utilizada por el micro. Los manuales de programación para micros tienen cientos de páginas, así que si no ha hecho mucha programación integrada, elija un Arduino y revise el manual de referencia para el micro atmel.

3. Aprenda varias arquitecturas: bucles principales simples, interrupciones con primer plano / fondo, RTOS usando tareas / hilos. La mayoría de los sistemas embebidos en tiempo real están escritos en C / C ++. Lo que hay que saber es la interrupción de la sobrecarga, la implicación del cambio de contexto, la seguridad del hilo. Sugeriría aprender al menos un RTOS como FreeRTOS si no sabe mucho sobre el sistema operativo. Tiene una excelente documentación y el código está disponible gratuitamente.

4. Protocolos, redes y datos en movimiento: la mayoría de los dispositivos integrados se comunican con otros dispositivos, esencialmente están moviendo información. Los protocolos están en todas partes en las computadoras. Entonces, aprenda cómo se implementan varios protocolos, tanto en hardware como en software. ¿Cómo se garantiza la entrega de datos, cifrado, compresión, etc.

5. Lenguaje y estructura : Domine el lenguaje C / C ++. Puede que algún día veamos que el lenguaje de programación Go se haga cargo, pero eso aún no ha sucedido. Mis libros favoritos son los clásicos K&R, Expert C Programming, C ++ Primer y, por supuesto, el lenguaje de programación C ++ de Stroustrup.

Aún hay más, como algoritmos, DSP, estructuras de datos, sistemas de control, cálculos numéricos, multinúcleo y paralelismo, FPGA, lenguaje de diseño de hardware. Incluso entonces, cada uno de estos temas tiene muchos libros escritos sobre ellos, pero no se asuste si aún no sabe mucho. Mientras tenga el deseo de aprender a su debido tiempo, puede convertirse en un Maestro. El éxito, por otro lado, es una cuestión de perspectiva 🙂

La habilidad esencial está en la programación multiproceso dirigida por eventos con una cuidadosa utilización de los recursos. La analogía que me gusta usar es entre conducir un autobús (computadora de escritorio) y volar un avión de combate (integrado). Las cosas suceden mucho más rápido en el avión, hay muchas más cosas simultáneas que suceden (incluidas las que pueden matarte).

Una buena forma de acostumbrarse a un entorno incrustado es practicar primero la escritura de un programa GUI de escritorio de múltiples subprocesos (¿un juego?) Con una cadena de herramientas que lo acerque al metal.

La otra habilidad esencial es la competencia DOMINIO. Debe comprender el control de retroalimentación de bucle cerrado, la transformación de la señal, la medición, etc. Intente obtener una copia de Matlab / Mathmatica y obtenga una sensación intuitiva de lo que sucede con un conjunto de salidas dado un conjunto de entradas y una transformación. Las cajas de herramientas de control y procesamiento de señales tienen buenos tutoriales sobre problemas del mundo real que puede resolver y que cautivarán su imaginación.

Puedo contarle acerca de los sistemas básicos (que se ejecutan sin ningún sistema operativo). Para diseñar y desarrollar firmware para estas aplicaciones además de las estructuras de datos y la programación en C, se requiere una buena comprensión de la arquitectura de la computadora, especialmente de la organización de la memoria y el controlador de interrupción. También es necesario tener una buena comprensión de los protocolos de comunicación de bajo nivel como SPI, I2C, UART, etc. También puede ser necesario tener una comprensión de los conceptos DSP y la arquitectura DSP si desea trabajar en algunas aplicaciones de procesamiento intensivo. Además de estos, también será útil cierta experiencia de dominio del dominio para el que va a diseñar el producto como Industrial, Automotriz, etc.

Una cosa que otros no han mencionado es el conocimiento de hardware / mecánica en el dominio en el que trabaja.

Por ejemplo, como ingeniero de firmware en GE escribiendo código para posicionadores digitales, tengo que conocer la teoría básica de válvulas, la mecánica de válvulas y la ingeniería de control (PID). Para ser un ingeniero de firmware valioso (o FE “senior / principal”) que puede contribuir con código a todas las áreas de la base de código requiere una comprensión profunda de los impactos en el mundo mecánico.

Del mismo modo, si usted es ingeniero de firmware en Fitbit, probablemente sepa mucho sobre el espacio de los wearables y cómo trabajar con acelerómetros / LCD / LED / giroscopios. Y si es un tipo de firmware para Bosch / Tesla que trabaja en controles automotrices, debe conocer la mecánica del automóvil, los controles PID / del motor, etc.

Para mí, me encanta aprender sobre los sistemas mecánicos y es por eso que creo que el firmware es mucho más agradable que el software puro. Independientemente de la industria en la que se encuentre su equipo de firmware, conocerlo en ese campo no solo lo ayudará a comprender el código, sino que también lo distinguirá entre otros ingenieros y la gerencia lo apreciará.

Firmware = software integrado para un microcontrolador dentro de un chip.

Yo pondría esto como esencial:

  • Conocimiento de la arquitectura del procesador, conjunto de instrucciones (simulador) y conocimiento básico del ensamblador.
  • Para código de bajo nivel, ensamblador o C / C ++ con experiencia de compilación / enlazador / depuración.
  • Interrupciones (niveles, número de interrupciones, enmascaramiento).
  • Tipos de memoria, ROM, (S) RAM, EEPROM, flash, DDR, … Interno o externo.

Pondría esto como requisitos de firmware más experimentados:

  • Codificación de nivel superior: C / C ++, HAL (capa de abstracción de hardware) o incluso un sistema operativo.
  • Conocimiento de IC y PCB, velocidad de respuesta, cristales (y pines de reloj), configuración de pines IO (estado de alta impedancia), voltajes de suministro (y tapas),….
  • Depuración con JTAG u otro protocolo. Usando puntos de interrupción, evaluando aspectos internos (memoria, registros),…. Usando GPIO, por ejemplo, para controlar LED para cierto estado o condiciones de falla.
  • Experiencia de alcance digital y analógico. Protocolos depuradores o monitores (UART, I2C, I2S, SPI, USB, ethernet, …). Disparo, captura de datos.
  • Modos de arranque, cargadores de arranque, actualización o corrección de errores (en el campo) de actualización.
  • Secuencias de comandos para procesar rápidamente archivos de registro, convertir datos, post y preprocesamiento.
  • SSH, telnet, protocolo de red TCP / IP para dispositivos avanzados conectados a la red. Wifi, bluetooth también podría ser interesante, ya que se usan ampliamente en muchos sistemas.

Como puede ver, hay controladores muy simples y pequeños con casi ninguna capacidad para sistemas multiprocesador muy complejos con muchos protocolos y conexiones. Y, dependiendo del sector, hay otras cosas a considerar. Cumplimiento de seguridad, confiabilidad, EMC,….

Por firmware, supongo que ya sea escribiendo código para microcontroladores o controladores de dispositivos.
A menudo, mientras escribe a este nivel, tendrá que mirar el código de ensamblaje. Por lo tanto, sería muy útil si aprende la arquitectura de un MCU como ARM y escribe y ve programas simples ‘C’, los desarma y ve cómo las construcciones ‘C’ se convierten en ensamblajes. También una intuición de cómo es el código / datos extraído de la memoria, decodificado y ejecutado ayudaría a una comprensión sólida.

Creo que los microcontroladores son aptos para esto porque la programación de computadoras pondrá mucha abstracción en la parte superior, lo que complicaría las cosas.

Habilidades

  1. Comprensión del microprocesador / microcontrolador
  2. Lenguajes de programación (ensamblador, C, C ++)
  3. Compilador funcionamiento conocimiento
  4. Capacidad para comprender hojas de datos
  5. Habilidades de depuración
  6. Conocimiento de herramientas de depuración

y hábitos buscando en Google y explorando cosas para programar.

Aún así, no puedo decir que tendrás éxito, pero aumentarán las posibilidades.

Como se menciona en la mayoría de las respuestas, debe conocer la arquitectura del procesador que va a utilizar. Cuando desea aprovechar al máximo el sistema, necesita conocer la arquitectura específica. Puede haber muchas diferencias entre los proveedores, ya que proporcionan conjuntos de instrucciones específicas para hacer las cosas. También necesitaría aprender sobre la arquitectura de la memoria, por ejemplo, si se trata de un procesador con una arquitectura de Harvard, tendrá memoria de programa y datos por separado y necesita saber cómo utilizar estos dos de manera eficiente (por ejemplo, puede acceder a ambas memorias para obtener dos en un ciclo de reloj versus tomar dos relojes para obtener dos de una memoria). Estos son específicos de la arquitectura, debe prestar mucha atención al manual

¿En qué lenguajes de programación debo ser competente ? C en su mayoría, y también C ++
También debe estar familiarizado con un lenguaje de scripting de nivel superior porque los conjuntos de pruebas y la automatización se realizan en lenguajes de nivel superior como Python, Perl, Ruby, etc.
¿Con qué conceptos informáticos debería estar familiarizado? Ya ha mencionado el sistema operativo, los algoritmos y las estructuras de datos, lo cual es bueno. Aparte de esto, sería útil si repasas tus habilidades en lógica digital, microprocesadores, arquitectura de computadoras. Dado que estaría trabajando con equipos de hardware, también podría ser útil analizar estos conceptos. Diseños de chip, buses serie / paralelo, RTL, Verilog

– Buena habilidad de programación C

– Capacidad para comprender el mapa de memoria

– Registros de lectura / escritura en controladores

– Comprensión de la hoja de datos del controlador

– Habilidad de manejo de interrupciones

– Cálculos de tiempo.

– Conocimiento de DMA para los últimos controladores de alta velocidad

More Interesting

¿Cuáles son algunos buenos libros sobre diseño de sistemas integrados?

¿Cómo debo comenzar con la programación del microcontrolador 8051? ¿Alguien puede dirigirme a programas 8051 simples?

¿Existe algún hardware de dispositivo móvil de código abierto disponible?

Realmente quiero entender el código Linux BSP (paquete de soporte de placa). ¿Dónde empiezo?

¿Puede el sistema operativo modificar la tabla de vectores de interrupción del microcontrolador cuando está paravirtualizado?

¿Cómo es el mercado laboral para VLSI y sistemas integrados en Canadá?

¿Qué instituto, excepto VECTOR, es el mejor para la capacitación de sistemas integrados con buenas ubicaciones?

Soy lento en el pensamiento lógico, ¿es conveniente para mí considerar los sistemas integrados y la programación en sistemas integrados como una opción profesional?

¿Cómo podemos programar los microcontroladores PIC usando una placa Arduino?

¿Qué tipo de conocimiento se debe adquirir para el rol de programador de controladores de dispositivos integrados como un programa más reciente?

¿Cuál es el mejor instituto de capacitación para sistemas integrados en kolkata?

¿Cómo se debe comenzar a trabajar en sistemas embebidos?

¿Cuáles son algunos proyectos que podría hacer en 8 meses que podrían aumentar mis posibilidades de conseguir un buen trabajo en sistemas integrados?

Cómo convertirse en un buen programador integrado

Sistemas embebidos: ¿Cuáles son las restricciones físicas al construir un proyecto?