💻 C y ensamblador con Raspberry Pi

Prefacio

Encontrar buena literatura sobre ensamblador ARM sigue siendo una tarea difícil. Incluso en Internet, suele llevar mucho más tiempo del deseado encontrar respuestas claras y bien fundamentadas.

¿Por qué elegir ensamblador ARM? El conjunto de instrucciones ARM está omnipresente: está en la gran mayoría de smartphones, tabletas e innumerables sistemas embebidos (embedded systems). Y cuando Apple dio el paso definitivo al migrar su línea Mac a sus propios chips ARM, quedó totalmente claro el papel clave de esta arquitectura en el futuro.

Aun así, muchos se preguntan: ¿Por qué aprender ensamblador hoy en día si existen alternativas modernas y, en apariencia, más sencillas?

Para la mayoría de las tareas cotidianas, los lenguajes de alto nivel tienen todo el sentido del mundo. Sin embargo, tienen sus límites. Quien se adentre en la programación bare-metal —es decir, el desarrollo directo sobre el hardware sin un sistema operativo— encontrará muchos ejemplos en C o C++ para la Raspberry Pi. Pero incluso ahí, el ensamblador resulta indispensable: es necesario para poner en marcha el sistema antes de que C o C++ puedan ejecutarse. Además, las ventajas habituales de los lenguajes de alto nivel se reducen en un entorno bare-metal, ya que la gran mayoría de las bibliotecas estándar no están disponibles.

Por otro lado, acceder a los registros del sistema en C o C++ suele resultar innecesariamente criptico. Las hojas de datos y manuales de referencia de los fabricantes de hardware están redactados pensando prácticamente en ensamblador. Una vez que le coges el truco, te das cuenta de que el ensamblador no es ninguna ciencia oculta. El mayor beneficio es lograr una comprensión profunda de cómo funcionan realmente el procesador y el sistema en su conjunto; un conocimiento que las capas de abstracción suelen ocultar. No es casualidad que se siga enseñando ensamblador en las carreras de informática de muchas universidades.

Sé por experiencia propia lo difícil que es el comienzo. La mayor fuente de referencia para el desarrollo bare-metal en Raspberry Pi es el proyecto Circle, escrito en C++. Tomé muchas ideas de ahí y las traduje pacientemente a C, especialmente el soporte para USB (teclados, ratones y memorias). Tan solo para comprender en profundidad cómo se relacionaban todos los elementos entre sí, pasé unos cuatro años dedicándole sesiones intensivas de trabajo cada cierto tiempo.

Qué encontrarás en este libro: Este libro está pensado tanto para servir de guía paso a paso como de manual de consulta práctica. Se centra en la programación bare-metal para la Raspberry Pi 4, combinando el modo de 32 bits en Ensamblador con el modo de 64 bits en C. Aunque los ejemplos de código están diseñados específicamente para la Pi 4, en los capítulos correspondientes explico cómo adaptar estos conceptos a modelos anteriores.

A finales de 2023 llegó la Raspberry Pi 5. Este modelo ya no admite código de 32 bits a nivel de hardware y presenta diferencias sustanciales con respecto a sus predecesoras. El primer gran obstáculo fue la salida de vídeo, ya que los desarrolladores eliminaron mecanismos que se venían usando tradicionalmente. En un capítulo dedicado explico cómo superar estos nuevos desafíos.

El libro se publica inicialmente en versión online. Confío en vuestros comentarios y en el apoyo de la comunidad para mejorar los contenidos juntos y convertir esta obra en un recurso de referencia indispensable.

¡Mucho éxito programando directamente sobre el hardware!