Recursos útiles - EDAE-Chile/tt-and-c GitHub Wiki

👩‍💻 Programación embebida

Para poder crear sistemas de telemetría, rastreo o telecomunicaciones de cohetes 🚀, primero se requiere conocimiento de programación embebida. La programación embebida es una sub-disciplina de la programación que se enfoca en un tipo específico de computadores, los sistemas embebidos:

Un sistema embebido es un computador de propósito especial, diseñado para cumplir una o más funciones específicas, generalmente bajo fuertes restricciones sobre los recursos disponibles y cómo estos se programan.

Cursos como Introducción a la Programación o Programación Avanzada tienen un enfoque en computación de uso general, creando programas que corren sobre computadores modernos con mucha memoria y capacidad de procesamiento. Esto significa que en la práctica podemos no preocuparnos de muchos detalles de "bajo nivel" sobre como exactamente el computador está ejecutando nuestro programa, mientras el programa se ejecute.

Los sistemas embebidos suelen ser computadores mucho más modestos, generalmente estando basados en microcontroladores: pequeños circuitos integrados que incluyen un procesador (usualmente uno o dos núcleos muy lentos), memoria (usualmente menos de 1 MB) y pines de entrada y de salida programables.

El Raspberry Pi Pico, un microcontrolador moderno que tiene dos núcleos de muy bajo consumo de energía, 264 kB de RAM y 16 MB de memoria interna.

La gran ventaja de usar sistemas embebidos es que tienen un consumo de batería mucho menor (usualmente uno o dos órdenes de magnitud menos corriente) y permiten tener un control fino de todos los aspectos del computador. Esto hace esta clase de dispositivos el estándar en la industria aeroespacial y más generalmente la electrónica.

Sin embargo, programar esta clase de computadores requiere ser extremadamente cuidadosos con los recursos que se tienen, por lo que general se opta por trabajar con lenguajes de bajo nivel como C o C++, que permiten manejar la memoria del microcontrolador de forma manual. Alrededor de estos lenguajes se han desarrollado herramientas para facilitar el desarrollo en este tipo de dispositivos, como PlatformIO o su hermano más popular, Arduino.

Estos lenguajes son poderosos, pero también son complejos de leer y escribir, y hacen extremadamente fácil cometer errores sutiles que no son detectados hasta después de un lanzamiento:

La explosión del Ariane 5

La explosión del cohete Ariane 5 de NASA ocurrió debido a un sutil bug denominado integer overflow que aparece al almacenar números enteros en bloques demasiado pequeños de memoria, lo que enfatiza la importancia de considerar aspectos de bajo nivel del código escrito en este tipo de contextos.

Existe una nueva generación de lenguajes de programación para sistemas embebidos, que enfatizan en el manejo seguro de memoria e incluyen funcionalidad moderna como librerías, haciéndolos significativamente más fáciles de usar, como Rust 🦀. Sin embargo, esta clase de lenguajes todavía no han alcanzado masa crítica en la industria aeroespacial, dada la cantidad de código antiguo en existencia y la poca madurez de estos lenguajes.

Por lo general, aprender cualquiera de estos lenguajes (C, C++, Rust, etc.) no basta por sí solo para programar sistemas embebidos, sino que también se requiere conocimiento sobre el microcontrolador y las librerías disponibles para interactuar con este. Lo mismo aplica al resto de sensores, actuadores o componentes en un cohete.

Por esta razón es que se han creado librerías como Arduino en el caso de C++, o Embedded HAL en el caso de Rust. Estas librerías permiten abstraer mucho de los detalles específicos de cada microcontrolador, permitiendo utilizar el mismo conjunto de funciones y herramientas para programar cualquier sistema embebido para los que tengan soporte.

📚 Recursos útiles

Esta es una lista de recursos curada para aprender C, C++ y Rust, respectivamente. Hasta ahora hay pocos recursos en español o específicos a la programación embebida (salvo por Rust).

Aunque el código actual usa C++ con Arduino, una buena opción es primero aprender C y luego aprender la funcionalidad adicional que C++ agrega. Igualmente, si bien no empleamos Rust 🦀 todavía, es una buena opción que podemos considerar a futuro, dado que suele ser más amigable que C y C++. De todas formas, es una buena idea entender la diferencia entre los tres lenguajes y que caracteriza a cada uno.

C

C es para todo propósito la lengua franca de la programación: es un lenguaje pequeño, autocontenido y que provee poca abstracción a cómo funciona un computador. Por esta razón, es el lenguaje más utilizado en programación embebida, con una larga historia desde 1972 y siendo soportado por prácticamente todos los microcontroladores en existencia.

  • 🎥 C in 100 Seconds (🇺🇸): Una introducción de alto nivel en 100 segundos al lenguaje.
  • 📕 Modern C (🇺🇸): Un libro introductorio al lenguaje C, con especial énfasis a buenas prácticas modernas. Es un libro bastante popular y amigable, que te enseña a evitar bugs comunes.
  • 📗 The C Programming Language (🇺🇸): El libro clásico sobre C, escrito en 1978 y luego actualizado en 1988. Es considerado una de las referencias más importantes sobre el lenguaje (siendo apodado "K&R" por las iniciales de sus autores), a pesar de que no incluye los significativos cambios al lenguaje desde entonces. Solo es recomendable como una referencia más avanzada.
  • 🔗 Learn C (🇺🇸): Una introducción rápida y amigable al lenguaje, basada en ejercicios online que muestran prácticas modernas.
  • 🔗 Awesome C (🇺🇸): Una lista curada de recursos, librerías y cosas útiles para C.
  • 🎥 CS50 Lecture 1 (🇺🇸): Una clase de CS50, el curso introductorio de ciencias de la computación de Harvard, que introduce la programación en C.
  • 🎥 CS50 Lecture 2 (🇺🇸): La clase siguiente del mismo curso, que introduce funcionalidad más avanzada en C, especialmente arreglos y el uso de herramientas para compilar código como clang.
  • 🎥 CS50 Lecture 4 (🇺🇸): La última clase de C en el curso, que introduce el manejo de memoria manual mediante punteros usando las funciones malloc y free.
  • 🎥 Intro a C (🇨🇱): Un taller amigable de C creado para los cursos del Departamento de Ciencia de la Computación de la Escuela.

C++

C++ es prácticamente una extensión de C, incorporando mucha funcionalidad adicional que no está en C, como clases, objetos, excepciones, entre otras cosas. Esto lo hace más conveniente para implementar cierta clase de programas complejos, con el costo de agregar complejidad en el lenguaje en sí mismo, y estar soportado por un número más pequeño de controladores. Existen muchos frameworks que utilizan C++ para la programación embebida, como Arduino.

El código actual del subsistema de Telemetría, Rastreo y Control (TT&T) del cohete está escrito en C++, usando PlatformIO como entorno de desarrollo y Arduino como librería para facilitar la programación de circuitos.

  • 🎥 C++ in 100 Seconds (🇺🇸): Una introducción de alto nivel en 100 segundos a C++.
  • 📄 C++ Beginner's Guide (🇺🇸): Una guía completa de C++ que asume solo conocimiento básico de programación. No incluye programación embebida, pero es una buena introducción general al lenguaje.
  • 📄 Learn C++ in Y minutes (🇺🇸): Una resumen rápido de conceptos de C++, especialmente para personas que ya tienen experiencia programando en C u otro lenguaje de bajo nivel. Es una buena referencia para revisar cosas rápidamente.
  • 📄 A Transition Guide: Python to C++ (🇺🇸): Una guía sobre la cómo pasar de programar en Python a programar en C++. Es útil para evitar problemas comunes que se tienen al pasar un lenguaje de alto nivel a un lenguaje de bajo nivel y entender por qué los lenguajes de bajo nivel son importantes (Python en sí mismo está escrito en C++).
  • 🎥 C++ Programming Course (🇺🇸): Un video todo en uno de YouTube que enseña C++ desde principante a avanzado en 31 horas. En la práctica es improbable que utilicemos cosas de más allá del capítulo 12.

Rust

Rust 🦀 es un lenguaje moderno para programación de sistemas, diseñado con un fuerte enfoque en la escritura de código seguro, eficiente y mantenible. Fue creado principalmente para reemplazar lenguajes como C, incorporando funcionalidad que evita la clase más frecuente de errores en lenguajes como C, los errores de seguridad de memoria (como el que causó la explosión del Ariane 5), al mismo tiempo que incorpora funcionalidad de "alto nivel" que hace más cómodo programar.

Si bien Rust requiere considerable aprendizaje inicial, tiene un ecosistema y comunidad extremadamente amigables, parte de la razón por la que ha ganado el primer lugar como el lenguaje de programación más amado entre programadores 6 años seguidos.

  • 🎥 Rust in 100 Seconds (🇺🇸): Una introducción en 100 segundos sobre qué es Rust y cuáles son sus ventajas.
  • 📘 The Rust Programming Language (🇺🇸): El libro de facto para aprender Rust, creado por la comunidad y actualizado continuamente con funcionalidad de las nuevas versiones del lenguaje.
  • 🏃‍♀️ Rustlings (🇺🇸): Una colección de pequeños ejercicios guiados para aprender a usar Rust.
  • 📄 A half-hour to learn Rust (🇺🇸): Un artículo que explica los principales conceptos detrás de Rust a partir de pequeños pedazos de código, con tal de aprender a leer Rust rápidamente.
  • 📕 The Discovery Book (🇺🇸): Un libro que introduce la programación de sistemas embebidos para personas que ya saben algo de Rust, sin asumir conocimiento sobre electrónica.
  • 📙 The Embedded Rust Book (🇺🇸): Un libro comprehensiva sobre programación de sistemas embebidos usando Rust, dirigida a personas con algo de experiencia en sistemas embebidos y Rust.