Gracias a internet, y a una enorme comunidad de creadores de contenido, vivimos en una época dorada para el auto-aprendizaje. El único problema es que existen muchos temas para los cuales la abundancia de información llega a ser abrumadora. Necesitamos de guías que nos ayuden a navegar en este extenso mar. Los sistemas embebidos es un ejemplo claro de esta situación, no sólo para la diversidad de sus implementaciones sino tambien la de sus aplicaciones:
Nota: Otra area de aplicación que ha cobrado mucha importancia para la transición a energías limpias es la de potencia digital aplicada a sistemas de energía eléctrica (una buena apuesta para demanda laboral futura).
¿Pero qué es un sistema embebido en primer lugar? Una definición concisa aparece en el glosario del sitio del fabricante de dispositivos electrónicos Analog Devices:
Un sistema embebido es un sistema en el que la computadora (generalmente un microcontrolador o microprocesador) se considera como parte integral del sistema.
Me parece una definición simple y adecuada porque facilita el pensar en sitemas que NO son embebidos: super-computadoras utilizadas en simulaciones de procesos fisicos/biologicos, servidores que proveen servicios de nube o computadoras personales. ¿En qué casos si se considera a una computadora como parte integral de sistema? Algunos ejemplos son:
- Smart phones
- Smart watches
- Satélites
- Robótica móvil
- Controladores de procesos industriales
Personalmente me desagrada la traducción de embedded como incrustado pero admito que esa palabra da la buena intuación de una computadora que incrusta en un producto de consumo o sistema más grande (autos, aviones o lineas de ensamblaje).
Estudiantes/egresados de ingenierías, ciencias físicas o profesionistas con planes de pivotear como desarolladores de sistemas embebidos. Las guías de estudio y el curso de STM32 de este repo tienen la intención de mostrar los temas esenciales para ejercer como un desarollador profesional. Estos temas podrían estar sobrados para quienes tengan la intención de ser hobbistas (soy fan del ecosistema Arduino y considero que es una excelente plataforma para ese propósito). Hago esta última aclaración sólo con la intención de enfatizar el tiempo y esfuerzo requerido para completar todo el road-map. El desarrollo y entendimiento de los sistemas embebidos es una habilidad académica que tiene buenas posibilidades de retorno de inversión. Recomiendo buscar las vacantes que ofertan en Linkedin y ver los requisitos de cada una para ajustar los temas en los que necesitan poner atención adicional.
Mi sagrada trinidad de libros en el tema que siempre recomiendo. Afortunadamente todos1 pueden encontrarse en ediciones en español:
- Make it Stick (Apréndetelo), Peter Brown, Mark McDaniel, Henry Roediger. El mejor libro que conozco con ténicas de estudio efectivas respaldadas por estudios.
- Ultralearning, Scott Young. El autor logró estudiar por su cuenta todo el plan de estudios de la carrera de Ciencias Computacionales del MIT pasando todos los exámenes en tiempo record. Este libro detalla las técnicas de autoestudio que descubrió durante el proceso.
- Deep Work (Enfócate), Cal Newport. El autor es un computólogo profesor-investigador que ha popularizado las ventajas de trabajar sin distracciones por tiempos cortos (45 a 90 minutos) y largos, y las reglas que hay que seguir para lograrlo.
Quiero comenzar desmintiendo un consejo que he visto muy a menudo en foros en el que se dice que para conseguir un trabajo como desarollador debes ser experto en todas las areas que cubren los sistemas embebidos: lenguajes de descripción de hardware, visión por computadora, Linux embebido, procesamiento digital de señales, teoría de control, radio comunicaciones, diseño de circuitos impresos, diseño de fuentes de alimentación y un largo etc... Esto no es verdad. Ciertamente existen muchos desarolladores veteranos (10-30 años de experiencia) que pueden dominar muchas areas, pero en la práctica es suficiente con que elijas unas pocas especializaciones para conseguir una buena posición. La guía que propongo es la base para conseguir una empleo como desarrollador Jr y es también la base de conocimiento sobre la cual especializarte más adelante según tu preferencia o retos laborales que se te vayan presentando.
En mi blog publiqué una guía bibliográfica completa para cubrir el core escencial para una ingeniería en electrónica. Puedes consultarla acá si lo deseas pero estará muy sobrada. Lo que hice fue reducirla de manera que cubra lo mínimo que necesitamos acá:
Por supuesto, si ya estudias o vienes de una ing. en mecatrónica o electrónica puedes omitir esta parte.
Si quieren profundizar en los cálculos (opcional), LTSpice es una herramienta muy buena para hacer simulaciones. Aquí hay un curso en español.
Recomiendo también instalar Kicad, que es una plataforma de diseño de circuitos impresos gratuita y de código abierto. Aquí hay un curso en Youtube muy bueno hecho por Antonio Raptors.
Ahora comenzamos con el corazón de los sistemas embebidos basados en procesadores. Como desarollador de firmware puedo asegurar que el entender la arquitectura de los procesadores no es mera cultura general sino una necesidad real a la hora de resolver problemas y diseñar software embebido. Es verdaderamente importante llevar el estudio de la arquitectura de la mano del estudio profundo del lenguaje C:
Si compilar desde terminal con gcc llega a ser muy tedioso, puedes instalar Visual Studio Code y seguir este tutorial para configurar la extensión para C/C++.
En las entrevistas que me han tocado (como entrevistado y entrevistador) el tema de los estandares de código es opcional para vacantes de entre 0 y 2 años de experiencia. No está de más que sepas que es MISRA C. No hace falta que memorices las cientos de reglas que tiene el estandar (en la práctica se revisa con analizadores estáticos) pero si es ventajoso que puedas responder qué es y para qué se usa.
El estandar que si recomendaría aprender y usar es el Barr Embedded C Coding Standard. Es bastante corto, práctico y le dará puntos a tus repos de Github.
Si no tienes problemas con el inglés escuchado, mi clase favorita es la del profesor Onur Mutlu. Puedes ver todo el curso en Youtube en esta lista de reproducción.
Estrictamente necesario ver este excelente video sobre el manejo de memoria en C de José Colbes para entender que son el heap y el stack. Después continuar con:
Estructuras de Datos en C, Luis Joyanes
- Cap. 5: Algoritmos de búsqueda y ordenación
- Cap. 7: Tipos abstractos de datos y objetos
- Cap. 8: Listas, listas enlazadas
- Cap. 9: Modificaciones de listas enlazadas
- Cap. 10: Pilas y sus aplicaciones
- Cap. 11: Colas, colas de prioridad y montículos
Si este libro les parece muy formal pueden intentar con Programacion En C/C++ Java Y Uml también de Luis Joyanes (tiene capítulos que cubren esos temas). Es más accesible y más facil de conseguir en librerias.
Teniendo estudiadas las guías 1 y 2 ya tienes todo lo necesario para aprovechar al máximo mi curso de STM32. La siguiente guía puede estudiarse simultánemente. En el curso cubriré más temas como máquinas de estado, schedulers y parsers pero estaré haciendo referencias a estos tres libros así que recomiendo seguirla completamente:
Si ya has desarrollado otros tipos de software seguramente sabes usar Git. Si no es así (Git y Github no son lo mismo), es importante que te familiarices con esta herramienta. Aquí hay un curso en español de Git desde terminal y con Sourcetree. Puedes practicar creando repos de tus prácticas de microcontroladores y subir o corregir tus cambios con Sourcetree. Uno de los mejores libros sobre Git es Pro Git de Scott Chacon ¡y es gratis!
Si han estudiado hasta este punto, tienen bien asimilado todo y además tienen inglés conversacional B2 fluido, es suficiente para calificar muy bien en una entrevista para una posición de desarrollador de firmware Jr en varias empresas grandes de tecnología. Las siguientes secciones podrían no ser necesarias para entrar pero definitivamente si serán necesarias para su día a día como profesional.
En las aplicaciones reales no basta con que el código "parezca funcionar". El código debe escribirse de manera que facilite el ciclo de vida de un producto y el trabajo con tu equipo de desarrollo. Pensemos en las siguientes preguntas:
- ¿Podemos añadir código de nuevas funcionalidades sin modificar demasiado el que ya existe?
- ¿Puedo cambiar el microcontrolador sin que impacte tanto al proyecto entero?
- ¿Puedo reutilizar el código de los módulos que ya tengo escritos para crear nuevos?
- ¿Cómo implementar los requerimientos que debe cumplir el producto de forma adecuada?
- Si sacamos al mercado productos distintos, ¿puedo agilizar la creación de nuevos proyectos firmware?
Esta es la parte de ingeniería de firmware. La sintaxis del lenguaje y el funcionamiento de los periféricos son sólo los cimientos de los proyectos. El siguiente paso es aprender a implementar patrones de diseño. El sitio de Embbedded Artistry tiene una muy buena recopilación de patrones de diseño para sistemas embebidos pero es fácil perderse si es la primera vez que se trabaja con ellos. En esta sección muestro un camino mejor navegable...
[En construcción]
[En construcción]
Footnotes
-
Make it Stick (Apréndetelo) dejó de ser editado en español por Paidos pero puedes encontrarlo en formato .epub si sabes dónde buscar. Puedes abrir esos archivos en tu móvil con la app Lithium. ↩



