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?
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:
Aquí hay algunos libros:
Aquí hay algunos sitios web:
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.
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 $ $ 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:
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.
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.
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):
- Lo que necesitas para aprender hardware (al menos)
- Lo que necesitas para aprender el software (al menos)
- Además, estudia sistemas operativos.
- Necesitas un entrenamiento
- ¡No te detengas, sigue aprendiendo y desarrollando tu networking!
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.
jay atkinson
tiblu