¿Cómo convertirse en un desarrollador de software integrado?

Me gustaría algunos consejos para aquellos que quieren convertirse en buenos desarrolladores de software integrado o quieren mejorar en esta área.

¿Qué debo aprender sobre hardware, software?

¿Qué libros son los más recomendados? ¿Blogs?

Al final, ¿cómo podría pasar de ser un aficionado principiante a un excelente profesional?

Respuestas (10)

Todas las respuestas han sido buenas hasta ahora, pero daré mi granito de arena.

Aquí hay una repetición de algunos consejos con un giro y algunos extras:

  • Aprenda C: El lenguaje fundamental del hardware que todavía es portátil (demasiado grado). No solo lo aprenda, sino que conviértase en un experto en todas sus características, como volatile y por qué es importante para escribir controladores de dispositivos.
  • Comience con un buen kit de desarrollo como Arduino, pero como se dijo antes, aprenda otras arquitecturas una vez que tenga una buena idea de ello. Afortunadamente, hay algunas placas compatibles con Arduino construidas con otros procesadores, de esa manera puede reescribir el mismo diseño en un uC diferente sin estropear todo su diseño mientras se familiariza con algo nuevo.
  • En la etapa de aprendizaje, siéntase libre de reinventar la rueda en los controladores de dispositivos u otras piezas de código. No se limite a colocar el código de controlador de otra persona allí. Hay valor en reinventar la rueda cuando estás aprendiendo.
  • Ponte a prueba para volver a escribir tu código de manera más eficiente en términos de velocidad y uso de memoria.
  • Familiarizarse con los diferentes estilos de arquitecturas de software de sistemas embebidos. Comience con el procesamiento básico de bucles en segundo plano/impulsado por interrupciones, luego pase a los programadores en segundo plano y luego a los sistemas operativos en tiempo real.
  • ¡Obtenga un buen control de fuente! Yo prefiero Mercurial yo mismo.
  • Incluso regístrese en algunos sitios de alojamiento de control de fuente gratuitos como Sourceforge.net o Bitbucket.org para alojar su proyecto, incluso si es el único que trabaja en él. ¡Harán una copia de seguridad de su código, por lo que no tiene que preocuparse de que el disco duro se bloquee ocasionalmente y lo destruya todo! El uso de un VCS distribuido es útil, ya que puede verificar los cambios en su disco duro y luego cargarlos en el sitio host cuando esté listo.
  • ¡Aprende bien tus herramientas para cualquier chip en el que estés trabajando! Saber cómo el compilador crea el ensamblado es esencial. Debe tener una idea de cuán eficiente es el código, ya que es posible que deba volver a escribir en ensamblador. ¡También es esencial saber cómo usar el archivo del enlazador e interpretar la salida del mapa de memoria! ¡De qué otra manera vas a saber si esa rutina que acabas de escribir es la culpable de ocupar demasiado ROM/Flash!
  • ¡Aprende nuevas técnicas y experimenta con ellas en tus diseños!
  • No asuma nada al depurar. ¡Compruébalo!
  • Aprenda a programar a la defensiva para detectar errores y verificar suposiciones (como usar la afirmación)
  • Cree una información de depuración en su código donde pueda generar consumo de memoria o generar perfiles de código con temporizadores o usar pines de repuesto en el uC para alternar y medir la latencia de interrupción en un O-scope.

Aquí hay algunos libros:

Aquí hay algunos sitios web:

  • Gurús integrados
  • Ganssle Group Jack Ganssle tiene maravillosas historias históricas que contar. Lee los artículos. Sin embargo, se pone un poco sermoneador sobre algunas cosas.
  • Embedded.com Buena información sobre las últimas técnicas y consejos de Ganssle, Barr y otros expertos de la industria.
@Adam: ¡Me encanta ese libro! ¡Programador pragmático! ¡No puedo creer que lo olvidé!
+1 para Mercurial. Me gusta, aunque tengo la sensación de que la competencia con git sería más valiosa. Conocer los conceptos básicos con SVN es bastante importante si desea contribuir o extraer de otros proyectos, ya que eso es lo que muchos de ellos usan.
  • Recuerda, "No hay una bala de plata" , no caigas en la trampa de creer que existe una herramienta, metodología, lenguaje o sistema que puede resolver todos los problemas.
  • Conviértete en un experto en C
    • Aprende a arreglártelas sin malloc() y POSIX
  • No se obsesione con una sola arquitectura, es fácil convertirse en un fanático de PIC, AVR o ARM por accidente.
  • Cree cosas, elimínelas, hágalas funcionar. La práctica hace la perfección
  • Aprenda al menos un sistema de control de fuente (SVN/git/etc) y utilícelo
  • Esté siempre preparado para probar sus suposiciones. El error suele estar en lo que supones que funciona.
  • No confíe demasiado en los depuradores, son diferentes en cada sistema y de confiabilidad variable
  • Piensa frugalmente. Cuando resuelva problemas, piense en la huella de código, la huella de RAM y el costo del hardware

Para los libros, recomendaría indagar en la historia. La mayoría de las técnicas de software embebido de hoy en día provienen de la vanguardia de antaño.

Como todo, practica a diario.

De todas las cosas que he aprendido, el control de versiones (actualmente uso subversion) es lo más valioso para mi productividad. Teníamos sourcesafe de Microsoft cuando comencé aquí, así que usé una solución mala y luego una buena.
No puedo imaginar mi vida sin un sistema de control de fuente. También uso SVN actualmente. No sé cómo funcionaban las cosas antes de conocer SVN.
+1 para "El error suele estar en lo que supones que funciona"
"Aprende a vivir sin malloc" - ¿Por qué? ¿Para minimizar el riesgo de colisión de pila/montón?
@rzetterberg Muchos sistemas integrados evitan el uso de la asignación de memoria dinámica, ya que puede conducir a la fragmentación del montón y al indeterminismo.

Las otras respuestas son excelentes, pero la mayor diferencia entre un aficionado y un profesional debe ser la mentalidad sobre la calidad. Así que haga que su proyecto llegue hasta el final, no se detenga cuando haya terminado el 80% con un proyecto. Llévelo hasta el final, demuestre que funciona y documéntelo correctamente.

Asegúrese de que su código sea legible y mantenible.

Y no te olvides de divertirte también :)

Además de lo obvio, como aprender C y comenzar con alguna placa de desarrollador, querrá aprender a leer hojas de datos de microcontroladores .
Los fabricantes agregan cada vez más funciones a los microcontroladores, que por lo tanto se vuelven cada vez más complejos.
La hoja de datos no solo proporciona características eléctricas (que es más interesante para el ingeniero electrónico que para el desarrollador de software), sino también una descripción detallada de registros, mapas de memoria, etc. puede causar un dolor de cabeza más severo en la fase de depuración.

'Incrustado' es un término un poco cargado...

En algunos aspectos, cualquier sistema dedicado a ejecutar una sola aplicación podría denominarse sistema integrado, siempre que haya algún hardware que controlar. Podría decirse que puede llamar a un PPC604 de 400 MHz con 2 GB de RAM que ejecuta una aplicación Java sobre Linux como un sistema integrado, si está controlando un proceso a través de módulos de E/S locales. Por otro lado, un arduino que solo ejecuta algún tipo de aplicación de red mínima no sería un gran sistema integrado. Pero probablemente "incrustado" hace que la mayoría de la gente piense en controladores basados ​​en flash con solo unos pocos cientos de bytes de RAM, sin un sistema operativo del que hablar y una gran cantidad de periféricos en el chip.

Dicho esto, probablemente los dos mayores obstáculos que los programadores no integrados suelen enfrentar para aprender sistemas integrados son los registros de E/S y las interrupciones.

Las interrupciones en realidad pueden ser el más fácil de los dos conceptos para los programadores no integrados, ya que los principales problemas con estos, la concurrencia y la programación impulsada por eventos, a menudo se encuentran en las aplicaciones principales. Lo que hace que las interrupciones sean un dolor es darse cuenta de la extrema sensibilidad de un sistema a la calidad de su manejo de interrupciones y las complejidades de lidiar con el hardware para eliminar la condición de interrupción y configurar la siguiente. Con una GUI, un interbloqueo mata solo la aplicación. Con un controlador de interrupciones, un interbloqueo hace que todo el sistema se bloquee.

Los dispositivos de E/S parecen ser el área que causa la mayor dificultad. Para los no iniciados, puede ser toda una sorpresa descubrir que leer este registro aquí tiene un efecto en ese registro allá . Escribir 1 para borrar bits. Bits de estado que se borran solos cuando lee un registro de datos, etc. Hay tantas posibilidades con el hardware de E/S que no existe una regla general para manejarlo, excepto aprender a encontrar e interpretar las hojas de datos del dispositivo. Escribir un controlador de dispositivo para un puerto serie le enseñará mucho sobre la programación de E/S de bajo nivel.

Realmente no hay sustituto para aprender estas cosas que arremangarse y programar algo de C y/o lenguaje ensamblador en el metal desnudo. Incluso el sistema integrado basado en Java mencionado anteriormente eventualmente necesita un controlador de dispositivo para la E/S, y esto significa, en última instancia, lidiar con algo de C. La experiencia es el mejor maestro. Elija un microcontrolador, ya sea MSP430, TMS320, AVR, ARM, PIC, 68HC11, lo que sea, encuentre un kit de evaluación y construya algunos sistemas.

Sparkfun tiene una serie de buenas placas de desarrollo de menos de $\$$50. También vaya a TI para la familia Stellaris en $ ps 50 t o ps $ 100, también el Hawkboard que por ahora recomendaría antes que el Beagleboard para lo que pueda querer/necesitar aprender, también TI tiene la familia MSP430 y obtendría un EZ430 y un paquete de tres placas adicionales por $\$ $10 En Sparkfun , obtenga un Lillypad con la placa de alimentación/serial USB FTDI, el Lillypad es prácticamente igual que el Arduino pro minipero necesitas soldar para el pro mini. No soy un fanático de la familia PIC, pero es posible que desee obtener algo allí como una lección de historia, lo mismo ocurre con el 8051, ambas familias aún son populares y están en uso, solo que no son muy eficientes y otras arquitecturas las han pasado por alto. Absolutamente aprenda ARM y pulgar, tal vez MIPS (que es un pic-32, que no debe confundirse con la arquitectura PIC original más antigua). La ARMmite Pro es una buena placa ARM de nivel de entrada, aunque la Stellaris también puede serlo.

Lo que quiere aprender aquí es ensamblador para varias plataformas. C. C y la interacción del ensamblador. Diferentes herramientas GCC y no GCC. Cómo leer una hoja de datos/referencia de programadores (y darse cuenta de que todos tienen algunos errores o pueden ser engañosos, nunca confíe en ellos, el hardware gana a los documentos) y cómo leer o usar un esquema. Estos no son esquemas complicados normalmente. Varias de las placas son buenas para la interfaz en proyectos, lo que significa que no tienen basura en la placa en el camino, solo acceso directo a los pines de E/S. Pero eso no es lo mejor para aprender. Algo así como un StellarisEl tablero, que es doloroso para los proyectos, tiene muchas cosas divertidas a bordo para aprender incrustado y aprender a tomar prestados/usar controladores o escribir los suyos propios a partir de hojas de datos. La mariposa Atmel AVR también es una buena placa si aún está disponible, es posible que deba soldar en su propio puerto serie para programarla o simplemente atascar algunos cables en los orificios. Lo que te da son algunos periféricos que puedes aprender a programar.

Incluso si termina haciendo un trabajo integrado que implica escribir aplicaciones usando SDK o llamadas API en Linux o un RTOS (sin tocar nunca el hardware ni leer hojas de datos), el conocimiento anterior lo pondrá por delante del resto.

Este artículo (traducido automáticamente del portugués al inglés) tiene una buena descripción general del desarrollo de una carrera como desarrollador de software integrado. Nota: El original está aquí .

Comienza delineando las esferas de conocimiento que debes desarrollar:

  1. Conocimiento: Debes conocer la teoría involucrada en los sistemas embebidos. Esto significa hardware y software. Es imposible ser un desarrollador competente de software embebido sin conocer la arquitectura de hardware que está funcionando.

  2. Habilidad: Necesitas adquirir experiencia en el área. Necesita práctica. Puede decorar todos los mnemotécnicos del ensamblador PIC, pero no sirve de nada si no puede conducir un LED con este conocimiento.

  3. Actitud: Sobre todo, necesitas actitudes que te hagan crecer en esta área. Es un lugar muy dinámico con cambios y desarrollos frecuentes. Tienes que estar siempre motivado (a) ser autodidacta, disfrutar aprendiendo, "modificar" y entender cómo funcionan las cosas. Sin tales actitudes te darán pronto. Porque en esta área necesitas ser muy, muy persistente.

Luego da los siguientes consejos para dominar estas áreas (y los desarrolla con más texto, estos son solo los títulos):

  1. Lo que necesitas para aprender hardware (al menos)
  2. Lo que necesitas para aprender el software (al menos)
  3. Además, estudia sistemas operativos.
  4. Necesitas un entrenamiento
  5. ¡No te detengas, sigue aprendiendo y desarrollando tu networking!
Gracias por el enlace! La traducción de Google parece indicar que encaja perfectamente con esta pregunta. Sin embargo, preferimos que (1) el texto esté en inglés (somos una comunidad de habla inglesa , aunque muchos de nosotros somos al menos bilingües) - Traducir automáticamente solo si es necesario (2) la respuesta incluye un resumen del artículo en caso de que el enlace se corte. ¡He editado tu publicación para cumplir con estas pautas y te he votado a favor!

Piénselo dos veces antes de convertirse en un ingeniero de software integrado. He tenido etapas en mi carrera. Desarrollé software los primeros 5 años, luego pasé a ventas/marketing, lo hice durante 15 años, administré un negocio de más de 100 millones de dólares y ahora estoy de vuelta en el software.

Cuando vuelvo al software después de 15 años, recuerdo por qué lo dejé en primer lugar. Es difícil. Necesita concentración, varios cientos de líneas de código tocándose entre sí y todos deben mantenerlo en la memoria. Embebido es particularmente duro.

También necesitas comprenderte a ti mismo. Si en general eres un tipo inteligente, meticuloso y paciente, serías un gran ingeniero. Si te falta alguno de ellos, serás promedio en el mejor de los casos. Piénsalo. Si eres ultra inteligente y no tienes paciencia, no vale mucho porque no importa cuán inteligente seas, la buena ingeniería requiere paciencia y atención a los detalles.

También debe sentirse cómodo mirando el código horas a la vez sin hablar. Observo que las personas con buenas habilidades sociales encuentran esto insoportable.

Si todo esto funciona, entonces lea todos esos grandes libros, haga los ejercicios y será un gran ingeniero. Buena suerte.

Todos los demás dicen grandes cosas. Así que te daré un consejo general: ¡lee, lee, lee, lee, lee, lee, lee, lee!

Lea cada artículo en http://embeddedgurus.com Si no entiende algo, investíguelo. Si en la explicación de esas cosas encuentras algo que no entiendes, lee un poco más. Estoy a punto de ocupar un puesto de software integrado y mi experiencia es un puñado de proyectos profesionales en los últimos años y mucha lectura. La experiencia te permite probar cosas, pero la lectura te permite saber si las cosas que has probado se han hecho antes, tal vez mejor de lo que podrías. Te presenta conceptos con los que puedes trabajar en cualquier circunstancia.

¡Acabo de leer!

Conviértase en un experto en C Comprenda los temporizadores y las comunicaciones en serie. Deberías ensuciarte las manos con eso. Comprenda los protocolos de RF, ajústelos a sus requisitos. No pruebe ciegamente combinaciones de código mientras realiza la depuración. El código hace exactamente lo que le dices que haga. Lea el manual del usuario y la hoja de datos y luego haga un cambio si algo no funciona. Todo lo dicho y hecho, la única forma real de convertirse en un experto es practicar. Siga creando aplicaciones. Pronto, se convertirá en una segunda naturaleza.