miércoles, 25 de junio de 2014

Crosscompilando y Crossdepurando programas en Raspberry

Ok esta bien se lo que estan pensando, no se dice asi....

Crosscompiling ----> Compilacion cruzada

Segun el google sabelotodo un compilador cruzado es un programa capaz de generar un codigo ejecutable de una plataforma distinta a la que se ejecuta.

En este caso nos interesa tratar el tema de Raspberry e ir un poco mas alla y hacer depuración remota, es decir desde mi computadora con MaxOSX, Linux o Windows puedo ejecutar un programa en un raspberry que por cierto puede estar ubicado al otro lado del planeta y por si fuera poco desde la IDE de desarrollo colocar breakpoints evaluar variables y seguir ejecutándolo como si nada.

Ahora veremos cómo hacemos todo esto en unos sencillos pasos.

1- Para hacernos la vida un poco más fácil googleamos algo así:
Cross-compile toolchain for raspberry <coloque aqui el nombre de su sistema operativo>

esto les llevara a algún link donde algun tío se tomo la molestia de generar un compilador cruzado y de querer compartirlo con la comunidad. Por lo general viene comprimido en tar.bz2 o algo parecido; deben descomprimirlo si usan MaxOSX o linux es recomendable por razones estéticas colocarlo en la carpeta /opt

Lo descomprimí en la carpeta:

/opt/arm-none-linux-gnueabi/

Si logran detallar dice linux pero en mi caso ese toolchain fue compilado para MacOSX.

2- Utilicen una buena IDE, yo se que a muchos les gusta Eclipse, a veces la uso pero prefiero Codeblocks, es libre y mucho más rápida; en esta entrada voy a mostrar el uso específico para esta IDE de desarrollo; los usuarios de Eclipse deben buscar la equivalencia, realmente no es nada del otro mundo.

3- En Compiler Setting deben ubicar la carpeta Toolchain executables, en esta parte se especifica el crosscompilador ubicado en /opt/arm-none-linux-gnueabi/

los ejecutables tienen el prefijo arm-none-linux-gnueabi- y estan en la subcarpeta bin


Hasta este punto ya deberíamos poder compilar el famoso programa holamundo.c, particularmente les recomiendo usar una herramienta gráfica que les permita transportar el programa Compilado a su raspberry para no tener que hacerlo por la terminal, yo utilizo el FileZilla deben haber muchos parecidos disponibles para Linux y Windows


Observen que lo arrastré al Raspberry remoto, es muy importante que el archivo tenga permisos de ejecución, hay que ponerselo porque por defecto no lo trae.

Ahora bien si abren una consola ssh podran ejecutar su holamundo del raspberry sin mayor dificultad


Pero que pasa si queremos colocar breakpoints para buscar solucionar algún problema difícil de detectar.

3- Uso del Depurador Remoto.

Ésta parte es un poco más complicada vamos paso a paso:

- Hay que utilizar el depurador gdb, pero no el de su sistema operativo sino el gdb crosscompilado para raspberryPi que se ejecuta en su sistema operativo.
Deben verificar que haya sido incluido en el tar.bz2, no siempre está presente y es indispensable para la depuración remota. Si no está mejor busquen un toolchain que si lo tenga.

el mio esta ubicado en

/opt/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gdb

se puede usar sin IDE es decir por comando pero es incómodo utilizarlo de esta manera mejor lo usamos de forma transparente con la IDE de CodeBlocks.

Cada vez que vayan a hacer una depuración remota deben asegurarse de llamar el gdbserver desde el Raspberry, lo que van a hacer es indicarle que holamundo se va a depurar desde otro equipo, el gdbserver permite depuracion por TCP/IP y por puerto serial, en este caso usaremos TCP/IP, adicionalmente indicaremos el puerto, es importante que no haya ningun proxy que esté bloqueando este puerto ya que impediría la comunicación, para éste ejemplo usaremos el puerto 1234


*:1234 significa que aceptará a cualquier ip por el puerto 1234 que se quiera conectar, luego se quedará esperando pacientemente a que alguien se conecte.

Ahora bien desde nuestro PC vamos a indicarle a nuestro CodeBlocks ya que es por primera vez que lo hacemos dónde esta ubicado el gdb para raspberry.



las imagenes hablan por si solas. Ya esta todo listo y preconfigurado para que podamos hacer de ahora en adelante con CodeBlocks depuraciones remotas.

Simplemente lo que tenemos que hacer es colocar los breakpoints donde nos interesa y darle a Debug


ya que coloqué el breakpoint justo despues que se ejecutí i=i+1 podrán observar en la ventana de Watches que dice que i = 2.

Saludos, hasta la proxima...