Mostrando entradas con la etiqueta crosscompiling. Mostrar todas las entradas
Mostrando entradas con la etiqueta crosscompiling. Mostrar todas las entradas

domingo, 18 de enero de 2015

Crosscompilando y Crossdepurando programas C/C++ en Intel Edison

Ahora vamos con el crosscompiling y crossdebugging en Intel Edison.

El Edison puede ser programado básicamente de dos maneras; usando la IDE estilo Arduino y la otra forma es compilando directamente para su microprocesador. 

En este caso compartiremos la experiencia que hemos tenido en éste aspecto; tiempo atras habíamos dicho que la distribución por defecto del Edison es Yocto, en esta primera etapa nos estamos encargando de probar bien ésta distribución con el objeto de ver sus fortalezas y debilidades que siempre hay que tener muy en cuenta.

Lo primero que hay que hacer es buscar la pagina de descarga y bajar el SDK de nuestro sistema operativo en este link.



Buscamos en la sección Source files, Image and SDK's ....

Personalmente recomiendo trabajar el Edison con Ubuntu, ustedes se habrán dado cuenta por mis capturas de pantallas que uso MacOSX; el hecho de que recomiende linux es simplemente porque los gallos de Intel no incluyeron el gdb crosscompilado para Mac, no se si es a proposito o simplemente un olvido, osea que en la Macbook Pro por los momentos sólo podré compilar mas no depurar, me va a tocar generar el SDK más adelante a mano.

Lo bueno del SDK de linux es que cuando uno lo descomprime se desprende un unico archivo .sh de instalación que funciona a la perfección.


 el archivo es el que está en letras verdes, lo ejecutan

./poky-edison-eglibc-i686-edison-image-core2-32-toolchain-1-6-sh

y proceden con los parametros por default.

Si están usando CodeBlock hay que hacer un pequeño truco.


Si observan bien los ejecutables del toolchain están en 
/opt/poky-edison/1.6/sysroots/i686-pokysdk-linux/usr/bin/i586-poky-linux

pero ésto no le gusta a CodeBlocks, él necesita que al final esté en bin, asi que lo que hice fué duplicar la carpeta i586-poky-linux con el nombre de bin como se ve en la captura anterior.Tal vez quedo un poco feo ../bin/bin pero bueno funciona.

Ahora que ya está el toolchain instalado vamos con el Codeblock.

Obviamente el perfil del compilador para Edison no esta predefinido en el Codeblocks, por lo tanto hay que hacerlo, básicamente lo que podemos hacer es duplicar el de GNU GCC compiler.

Primero vamos a Setting/Compiler and debugger 



En Selected compiler está el GNU GCC Compiler presionamos Copy



y le ponemos iEdison Compiler presionamos OK.


 Ahora nos vamos a la pestaña de Toolchain y la colocamos como en la captura de pantalla anterior.

En Debugger Setting preferiblemente deberiamos tener seleccionada la opción de Evaluate expression under cursor, y muy importante debe estar seleccionado en el combobox Custom(specify instruction-set:) 



Le dedimos que genere los simbolos de depuración.

En Debugger Setting

Ahora desde el Edison vamos a iniciar el gdbserver.




Como se puede ver en la figura nos ubicamos donde está nuestro programa a depurar y le decimos 

gdbserver *:1234 holamundo

1234 es por supuesto el puerto TCP de depuración, aqui puede ir cualquier número de puerto siempre y cuando esté libre.

Volvemos a nuestro PC en linux nos vamos a propiedades



y le decimos como va a depurar el programa.



observen que la conexión es de tipo TCP la dirección la que tiene el Edison y el puerto que colocamos en gdbserver 1234.

Ésto va permitir que cada vez que le demos a Debug busque el Edison por la Red en el puerto indicado para depurar.



Vemos según la pantalla anterior que todo funciona a la perfección.

Hay que recordar que cada vez que se vaya a depurar hay que ejecutar del lado del Edison el gdbserver.


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...