lunes, 22 de julio de 2013

Compilación cruzada para Raspberry Pi desde Windows (fácilmente)

Aunque no excesivamente complicado, nunca ha sido del todo trivial la compilación bajo Windows de ejecutables Linux. Si además añadimos la complejidad de hacerlo para un sistema embebido y relativamente reciente como el de la Raspberry Pi (que abreviaremos en ocasiones como RPi), que supone gestionar funcionalidades hardware adicionales (GPIOs, I2C, SPI, PWM...), necesitamos un marco eficiente y claro que no resulta extremadamente sencillo de obtener en las primeras revisiones de todo lo que se nos ofrece. 

He elaborado un entorno de trabajo con herramientas gratuitas que, para proyectos moderados, proporciona facilidad de instalación, de gestión y de funcionamiento. Seguro que hay mecanismos más eficientes, pero este es el que he elegido (por encima del pesado Eclipse) y me funciona. El SO ha sido Windows Vista 64 bits, y no encuentro razones para que no se ejecute en otros sabores de la familia Windows. 

Como resumen previo, lo que vamos a hacer es lo siguiente: 
  1. Instalaremos una toolchain GNU en Windows particularmente sencilla de trabajar. La gente de SysProgs han generado una distribución de GCC y sus utilidades paralelas que acompañan con aplicaciones adicionales a las que daremos buen uso (particularmente a SmarTTY, un cliente SSH asombrosamente útil y fácil de utilizar).
  2. Como la toolchain no proporciona librerías para un acceso cómodo al hardware IO de la Raspberry Pi (aunque sí puede accederse de forma nativa según podemos ver en http://elinux.org/RPi_Low-level_peripherals#C_2), habilitaremos la librería BCM2835, de Mike McCauley (licencia GPL), en nuestro compilador cruzado de Windows. Una vez instalada tendremos un acceso útil y con poco código a los GPIOs (entradas y salidas de propósito general) de la RPi. El procedimiento que utilizaremos quizá puede resultar extensible a otras librerías, como WiringPi.
  3. Una vez hecho lo anterior, ya estamos en disposición de compilar programas C/C++ para RPi desde la línea de comandos de Windows. Pero le daremos una vuelta adicional a la situación para habilitar un IDE con Notepad++ que, además de editar el código, nos permitirá ejecutar cómodamente con teclas programables (o entradas de menú) el compilador GCC o el depurador GDB, así como transferir el programa compilado directamente a nuestra RPi con la ayuda de la utilidad pscp y de su hermano mayor, putty. El editor Notepad++, que también cuenta con licencia GNU/GPL, es una potente herramienta con enormes posibilidades de configuración que veremos cómo nos pueden ayudar para nuestros fines. 
Para quien esté leyendo este artículo, debo asumir que ya conoce como mínimo temas básicos de programación, de C, sobre qué es un compilador y la toolchain GNU, de la Raspberry Pi, del uso de los comandos Windows y del bash de Linux, de terminales, de GPIOs, y de algunos otros temas de relevancia sobre el asunto que nos ocupa. También asumo que, caso de necesitar alguna aclaración sobre los temas anteriores, el lector es capaz de hacer búsquedas de información con discriminación de los diferentes niveles de profundidad que sean necesarios. 


GNU Toolchain para Windows 

SysProgs ofrece precompilaciones para Windows de la toolchain GNU para distintas plataformas embedidas, y en particular para Raspberry Pi (aunque cualquiera puede también aventurarse en compilar las fuentes). El ejecutable de instalación puede obtenerse de http://gnutoolchains.com/raspberry/, y con un simple click del ratón tendremos lista la toolchain y un par de utilidades adicionales (un grabador de imágenes para tarjetas SD y el cliente SSH SmarTTY). Aunque no es crítico, conviene respetar el árbol de directorios de destino propuesto en la instalación, lo que permitirá compartir más fácilmente posibles acciones sobre los ficheros o directorios (como algunas de las propuestas en este documento). En cualquier caso, es aconsejable recordar que la instalación de este tipo de librerías y utilidades es conveniente realizarla en directorios y rutas que no contengan espacios, lo que evita errores posteriores en determinados casos.

En los parámetros de instalación, es útil dejar marcada la opción "Add binary directory to %PATH%", lo que nos permitirá invocar los ejecutables de la toolchain sin tener que teclear toda su ruta.  Lo agradeceremos cuando utilicemos la línea de comandos.  

En la web de SysProgs se proporciona también un completo tutorial, http://gnutoolchains.com/raspberry/tutorial/, en el que se incluye la descarga y grabación en una tarjeta SD de la imagen del sistema operativo Wheezy-Raspbian que ejecutará la RPi, y que en adelante asumiremos que es el instalado. Si ya tenemos la tarjeta grabada y en uso, tras la sencilla instalación de la toolchain ya podemos empezar a programar para la RPi en C/C++ bajo Windows con el siguiente esquema de trabajo: 



  1. Editar el código en cualquier editor de texto plano para Windows. 
  2. Una vez guardado el correspondiente archivo lo compilaremos con, por ejemplo, el comando arm-linux-gnueabihf-gcc.exe nombre_programa.c -o nombre_programa_compilado 
  3. El fichero compilado resultante lo trasladaremos desde Windows a la Raspberry Pi (con pscp o SmarTTY, por ejemplo), donde habrá que otorgarle los correspondientes permisos de ejecución mediante el comando chmod a+x nombre_programa_compilado 
  4. Tras lo anterior, podremos ejecutarlo en la Raspberry Pi mediante ./nombre_programa_compilado
En el tutorial ya comentado se incluye un ejemplo muy sencillo que hace uso del terminal SmartTTY para la comunicación con la RPi, incluyendo la transferencia del fichero compilado.

Por cierto, las transferencias de ficheros entre Windows y la placa no pueden ser más sencillas: arrastramos el icono del fichero a la ventana de texto del terminal, y nos guardará el ejecutable en el directorio de la RPi en el que estemos situados según el prompt de la línea de comandos de Linux, o bien utilizaremos las opciones del menú SCP. También se nos inicia en el uso del depurador cruzado: ejecutamos GDB bajo Windows depurando la ejecución bajo Raspbian del fichero compilado.

En cualquier caso, más adelante veremos un ejemplo completo con su guión de trabajo. Ahora es tiempo de complementar nuestra toolchain con una librería (libbcm2835) que nos permita acceder fácilmente al hardware de la RPi, lo que veremos en el siguiente post sobre este tema.

No hay comentarios: