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

22

Quisiera algunos consejos para aquellos que quieran convertirse en un buen desarrollador de software integrado o que quieran mejorar en esta área.

¿Qué debo aprender sobre hardware y 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?

Daniel Grillo
fuente

Respuestas:

39

Todas las respuestas han sido buenas hasta ahora, pero arrojaré mis dos centavos.

Aquí hay una repetición de algunos consejos con un toque y algunos extra:

  • Aprenda C: El lenguaje fundamental del hardware que todavía es portátil (también en cierta medida). No solo lo aprenda, sino que se convierta en un experto de todas sus características, como volátil 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. 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 siente 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 coloques el código de conductor de otra persona ahí abajo. Hay valor en reinventar la rueda cuando estás aprendiendo.
  • Desafíate a reescribir tu código de manera más eficiente en términos de velocidad y uso de memoria.
  • Familiarizarse con diferentes estilos de arquitecturas de software de sistemas integrados. Comience con el procesamiento básico de interrupción / bucle en segundo plano, luego pase a los planificadores en segundo plano, luego a los sistemas operativos en tiempo real.
  • ¡Obtenga un buen control de la fuente! Prefiero Mercurial yo mismo.
  • Incluso regístrese en algunos sitios de alojamiento de control de código fuente gratuitos como Sourceforge.net o Bitbucket.org para alojar su proyecto, incluso si usted es el único que trabaja en él. Realizarán una copia de seguridad de su código, por lo que no tiene que preocuparse de que el bloqueo ocasional del disco duro destruya todo. El uso de un VCS distribuido es útil, ya que puede registrar los cambios en su disco duro y luego cargarlos en el sitio host cuando esté listo.
  • ¡Aprenda bien sus herramientas para cualquier chip en el que esté trabajando! Saber cómo el compilador crea el ensamblaje es esencial. Debe tener una idea de cuán eficiente es el código, porque es posible que deba volver a escribir en el ensamblaje. ¡Saber cómo usar el archivo enlazador e interpretar la salida del mapa de memoria también es esencial! ¿De qué otra manera vas a saber si esa rutina que acabas de escribir es la culpable de tomar demasiada ROM / Flash!
  • ¡Aprende nuevas técnicas y experimenta con ellas en tus diseños!
  • No asuma nada al depurar. ¡Verifícalo!
  • Aprenda a programar a la defensiva para detectar errores y verificar suposiciones (como usar aserción)
  • Cree una información de depuración en su código donde pueda, como generar el consumo de memoria o crear un código de perfil con temporizadores o usar pines de repuesto en el uC para alternar y medir la latencia de interrupción en un osciloscopio.

Aquí hay algunos libros:

Aquí hay algunos sitios web:

  • Gurús incrustados
  • Ganssle Group Jack Ganssle tiene algunas historias históricas maravillosas que contar. Lee los artículos. Sin embargo, se pone un poco predicador sobre algunas cosas.
  • Embedded.com Buena información para las últimas técnicas y consejos de Ganssle, Barr y otros expertos de la industria.
Jay Atkinson
fuente
1
@ Adam: ¡Me encanta ese libro! Programador pragmático! ¡No puedo creer que lo haya olvidado!
Jay Atkinson
1
+1 para Mercurial. Me gusta, aunque tengo la sensación de que el dominio de git sería más valioso. 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.
tyblu
17
  • Recuerde, "No hay bala de plata" , no caiga en la trampa de creer que hay una herramienta, metodología, lenguaje o sistema que puede resolver todos los problemas
  • Conviértete en un experto en C
    • Aprenda a sobrevivir sin malloc () y POSIX
  • No se obsesione con una arquitectura, es fácil convertirse en un fanático de PIC o AVR o ARM por accidente
  • Construye cosas, depúralas, haz que funcionen. La práctica hace la perfección
  • Aprenda al menos un sistema de control de fuente (SVN / git / etc.) y úselo
  • Siempre esté preparado para probar sus suposiciones. El error generalmente está en lo que estás asumiendo que funciona
  • No se vuelva demasiado dependiente de los depuradores, son diferentes en cada sistema y de fiabilidad variable
  • Piensa frugalmente. Cuando resuelva problemas, piense en la huella de código, la huella de RAM y el costo de hardware

Para los libros, recomendaría profundizar en la historia. La mayoría de las técnicas de software integradas actuales provienen de la vanguardia de antaño.

Como todo, practica diariamente.

rev. Toby Jaffey
fuente
55
De todas las cosas que he aprendido, el control de versiones (uso subversion actualmente) es lo más valioso para mi productividad. Cuando comencé aquí, teníamos fuentes seguras de Microsoft, así que usé una mala solución y luego una buena.
Kortuk
No puedo imaginar mi vida sin un sistema de control de fuente. Yo uso SVN actualmente también. No sé cómo funcionaban las cosas antes de conocer SVN.
Daniel Grillo
1
+1 para "El error generalmente está en lo que estás suponiendo que funciona"
JustJeff
"Aprende a sobrevivir sin malloc" - ¿Por qué? Para minimizar el riesgo de colisión de pila / montón?
rzetterberg
@rzetterberg Muchos sistemas integrados evitan el uso de la asignación dinámica de memoria, ya que puede conducir a la fragmentación del montón e indeterminismo
Toby Jaffey
8

Las otras respuestas son geniales, pero la mayor diferencia entre un aficionado y un profesional debe ser una mentalidad sobre la calidad. Por lo tanto, haga que su proyecto funcione hasta el final, no se detenga cuando haya terminado el 80% con un proyecto. Tómelo todo, demuestre que funciona y documente correctamente.

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

Y no olvides divertirte también :)

Johan
fuente
7

Además de lo obvio, como aprender C y comenzar con una placa de desarrollador, querrás aprender a leer hojas de datos de microcontroladores .
Los fabricantes agregan más y 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 los registros, mapas de memoria, etc.
Al leer una hoja de datos puede parecer desalentadora, pero no entenderla puede causar un dolor de cabeza más severo en la fase de depuración.

revs stevenvh
fuente
3

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

En algunos aspectos, cualquier sistema dedicado a ejecutar una sola aplicación podría llamarse un sistema integrado, siempre y cuando haya algo de hardware que controlar. Podría decirse que puede llamar a un PPC604 de 400MHz con 2GB de RAM que ejecuta una aplicación Java encima de Linux como un sistema integrado, si es que controla 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 'integrado' hace que la mayoría de las personas piense en controladores basados ​​en flash con solo unos pocos cientos de bytes de RAM, sin sistema operativo para hablar y una gran cantidad de periféricos en chip.

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

Las interrupciones en realidad pueden ser el más fácil de los dos conceptos para los programadores no integrados, ya que los problemas principales con estos, la concurrencia y la programación basada en eventos, a menudo se encuentran en las aplicaciones convencionales. Lo que hace que las interrupciones sean dolorosas 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 el siguiente. Con una GUI, un punto muerto mata solo la aplicación. Con un controlador de interrupciones, un punto muerto 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 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 cuando se lee un registro de datos, etc. Hay tantas posibilidades con el hardware de E / S que no existe una regla general para tratarlo, 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 remangarse las mangas y programar algo de lenguaje directo C y / o 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 tratar 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 cree algunos sistemas.

JustJeff
fuente
3

PS50toPSpero necesitas soldar para el pro mini. No soy 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, pero no son muy eficientes y han sido ignoradas por otras arquitecturas. Aprenda absolutamente ARM y pulgar, tal vez MIPS (que es una imagen 32, que no debe confundirse con la arquitectura PIC original más antigua). El ARMmite Pro es un buen tablero ARM de nivel de entrada, aunque el Stellaris también puede serlo.

Lo que quieres 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 referencia de hoja de datos / 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. Algunas de las placas son buenas para interactuar 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 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 de las hojas de datos. La mariposa Atmel AVR también es una buena placa si aún está disponible, puede necesitar soldar en su propio puerto serie para programarla o simplemente atascar algunos cables en los agujeros. Lo que le ofrece son algunos periféricos que puede aprender a programar.

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

Daniel Grillo
fuente
3

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

Comienza describiendo las esferas de conocimiento que debe desarrollar:

  1. Conocimiento: debe 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: necesita adquirir experiencia en el área. Necesita práctica. Puede decorar todos los mnemónicos del ensamblador PIC, pero no sirve de nada si no puede manejar un LED con este conocimiento.

  3. Actitud: Sobre todo, necesitas actitudes que te harán crecer en esta área. Es muy dinámico con frecuentes cambios y desarrollos. Siempre debe estar motivado (a) ser autodidacta, disfrutar del aprendizaje, "ajustar" y comprender cómo funcionan las cosas. Sin esas actitudes te dará pronto. Porque esta área necesita ser muy, muy persistente.

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

  1. Lo que necesitas para aprender hardware (al menos)
  2. Lo que necesitas para aprender el software (al menos)
  3. Además, estudie los sistemas operativos
  4. Necesitas un entrenamiento
  5. ¡No te detengas, sigue aprendiendo y desarrollando tus redes!
Kevin Vermeer
fuente
1
Gracias por el enlace! La traducción de Google parece indicar que se ajusta perfectamente a esta pregunta. Sin embargo, preferiríamos que (1) el texto esté en inglés (somos una comunidad de habla inglesa , a pesar de que muchos de nosotros somos al menos bilingües) - Traducción automática solo si tiene que (2) la respuesta incluye Un resumen del artículo por si el enlace se corta. ¡He editado tu publicación para cumplir con estas pautas y te he dado un voto positivo!
Kevin Vermeer
2

Piénselo dos veces antes de convertirse en un ingeniero de software integrado. He tenido fases en mi carrera. He desarrollado software los primeros 5 años, después de pasar a ventas / marketing, lo hice durante 15 años, gestioné un negocio de más de 100 millones de dólares y ahora he vuelto al software.

Cuando vuelvo al software después de 15 años, recuerdo por qué me fui en primer lugar. Es difícil. Necesita concentración, varios cientos de líneas de código que se tocan y todos deben mantenerlo en la memoria. Incrustado es particularmente difícil.

También necesitas comprenderte a ti mismo. Si generalmente eres un tipo inteligente, meticuloso y paciente, serías un gran ingeniero. Si te falta alguno de esos, serás promedio en el mejor de los casos. Piénsalo. Si eres ultra inteligente y no eres paciente, no vale mucho porque no importa qué tan inteligente seas, una buena ingeniería requiere paciencia y atención al detalle.

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

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

Frank
fuente
1

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

Lea todos los artículos en http://embeddedgurus.com. Si no entiende algo, investigue. Si en la explicación de esas cosas encuentra algo que no comprende, lea un poco más. Estoy a punto de entrar en una posición 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. Le presenta conceptos con los que puede trabajar en cualquier circunstancia.

¡Acabo de leer!

AngryEE
fuente
0

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

Dominic Pritham
fuente