Programando PICs en Linux (Ubuntu 11.04) usando makefiles - Autor: Javier Zavala
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
Programando PICs en Linux (Ubuntu 11.04) usando makefiles Autor: Javier Zavala javierzavalaponce@gmail.com Fecha. Septiembre 22. 2012 09/22/12 Página 1 de 7 javierzavalaponce@gmail.com
Programando PICs en Linux (Ubuntu 11.04) usando makefiles Septiembre 2012 por Javier Zavala. Hace relativamente poco comencé a desenvolverme en Linux, y decidí poner en práctica lo poco que he ido aprendiendo con el fin también de indagar sobre lo que ocurre tras presionar el casi-mágico botoncito "build" o "build all" típico de muchos IDEs para micros. Este articulo describe: Cómo esribir un Makefile para automatizar la compilación de un proyecto. Voy a usar el SDCC -Small Device C Compiler-, se puede visitar la pagina oficial para mayores referencias. Abajo hago una breve descripcion de la instalación de SDCC en Ubuntu . En cuanto al target, utilizaré el popular pic18f2550 de Microchip. Opcionalmente se puede consultar la última seccion de este artículo con instrucciones de como echar a andar el programador pickit2 para flashear el programa sobe un pic18f2550, insisto, e objetivo del articulo es aprender de makefiles, por lo que no es indispensable contar con el PIC o con el programador pickit2. Pickit2 info: http://www.microchip.com/stellent/idcplg? IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023805 RESUMEN PRÁCTICO. El objetivo de todo esto es obtener un archivo llamado output.hex Descargar los archivos en una carpeta, digamos SDCC_prj0, luego, javier@javier:~$ cd SDCC_prj0/ javier@javier:~/SDCC_prj0$ make El resultado es la generacion de (entro otros archivo) output.hex, que ya se puede flashear en un PIC (18f2550 en este caso). Para flashear se utilizaría: javier@javier:~/SDCC_prj0$ make burn (Opcional, si se cuenta con el pic , programador & cable usb-serial): Para ver en accion el programa, se puede usar una terminal, por ejemplo minicom configurado a 9600 bauds 8n1. Aun cuando los makefiles son ampliamente usados y son sumamente útiles, posiblemente algunos van a encontrar este articulo algo anticuado considerando que las maravillas de la modernidad nos facilitan la vida al proporcionarnos IDEs que hacen muy facil todos estos procesos pero para otros puede ser un buen vistazo a todo lo que ocurre tras bambalinas, y además puede ser interesante para aquellos 09/22/12 Página 2 de 7 javierzavalaponce@gmail.com
que prefieren la consola en vez de las interfaces gráficas, o bien para los que quieres saber como comenzar un proyecto "desde cero" y no anclarse a un IDE en partiular. INSTALACION DE SDCC Ir a http://sourceforge.net/projects/sdcc/files/sdcc-linux-x86/ y elegir la version 3.2 (última al escribir este articulo en Septiembre de 2012), despues de descomprimir el archivo sdcc-3.1.0-i386-unknown-linux2.5.tar.bz2, navegamos dentro del folder (que debe tener la siguiente lista de archivos) : . +-- bin +-- INSTALL.txt +-- README.txt +-- share y en una terminal: sudo cp -r * /usr/local Es todo lo que se necesita hacer. Si quieres mas detalles de la instalación, estos se pueden encontrar INSTALL.txt y en README.txt INSTALACION DE GPUTILS GPUTILS es una coleccion de herramientas para PICs, incluye gpasm, gplink,y gplib. Mas adelante, veremos como utilizarlos dentro de un makefile para ligar los archivos objeto (.o), asi lo instalamos: sudo apt-get install gputils PREPARANDO LOS ARCHIVOS FUENTE Todos los archivos necesarios para completar las instrucciones descritas en este articulo son: (en mi caso , yo los puse todos dentro de una carpeta llamada SDCC_prj0) javier@javier:~/SDCC_prj0$ tree . +-- 18f2550.lkr +-- libdev18f2550.lib +-- libsdcc.lib +-- main.c +-- makefile +-- pic18fregs.h +-- suma.c +-- suma.h +-- usart.c +-- usart.h +-- 70-microchip.rules En realidad 18f2550.lkr , libdev18f2550.lib , libsdcc.lib & pic18fregs.h simplemente los copié de la instalacion del SDCC para facilitar la explicación, el código fuente quedo dividido en tres archivos .c (main.c, usart.c & suma.c) para 09/22/12 Página 3 de 7 javierzavalaponce@gmail.com
mostrar como compilar y ligar cuando se tiene un proyecto (como es usual) de varios archivos. El archivo 70-microchip.rules solo sirve por si el lector consulta la ultima seccion de este articulo (INSTALANDO EL PICKIT2). *Tip: con find . -iname "*2550*" puedes encontrar archivos que contengan la cadena de caracteres "2550" SOBRE EL COMANDO MAKE make es un comando que lee instrucciones de un archivo que nosotros creamos llamandolo makefile que a su vez, establece las reglas de compilación, este makefile puede hacer otras cosas como "limpiar" (borrar los archivos objeto por ejemplo), definir como flashear el micro, entre otras maravillas. Ademas ahorra tiempo al compilar solamente los archivos que han sido modificados. EL MAKEFILE Este es el contenido del makefile (solo de referencia), el makefile original viene con lor archivos de este articulo, se debe ser muy cuidadoso con los TABS incluidos en él: #_____________________________________________________ CC = sdcc -S -V -mpic16 -p18f2550 --use-non-free LINK = gplink -m -s 18f2550.lkr -o output.hex libdev18f2550.lib libsdcc.lib ASM = gpasm .PHONY: all burn clean all: output.hex .SUFFIXES: %.asm: %.c $(CC) $< %.o: %.asm $(ASM) -c $< output.hex: suma.o usart.o main.o $(LINK) suma.o usart.o main.o clean: rm -v *.asm *.o *.hex *.lst *.cod *.map burn: pk2cmd -P PIC18F2550 -F output.hex -M -W -R -Y -J N #_____________________________________________________ 09/22/12 Página 4 de 7 javierzavalaponce@gmail.com
EXPLICACION DEL MAKEFILE Lo que queremos lograr con este makefile es obtener un archivo (en este caso output.hex) que se pueda flashear al PIC, pero para lograrlo se requieren varios pasos, inlcuidos la compilacion de todos los archivos fuente, ok, vamos por partes: #, sirve para poner comentarios CC, define una macro, el nombre es CC y su valor es lo que esta a la derecha del = $(CC) , se puede leer como "el valor de la macro CC". Los Makefiles estan formados mayoritariamente por reglas, por ejemplo,en las dos ineas establecemos una "regla patrón": %.asm: %.c $(CC) $< Hay un TAB en la segunda linea, se debe ser cuidadose de no usar espacios en blanco en vez de TABS. La regla establece que el OBJETIVO (o TARGET) es crear archivos .asm a partir de archivos .c, es decir la DEPENDENCIA es un .c, el simbolo de porciento (%) es un comodín (o wildcard) para la generalizacion. Además de las reglas que acabo de describir, puede haber "reglas virtuales" como clean y burn en este makefile, que sirven para llevar a cabo otras tareas aparte de la compilacón. Por ejemplo, al invocar en la terminal, javier@javier:~/SDCC_prj0$ make clean vamos a borrar todos los archivos: *.asm *.o *.hex *.lst *.cod *.map y al invocar (esto va a funcionar solo si tienes instalado un pickit2, mas abajo viene una explicacion) javier@javier:~/SDCC_prj0$ make burn vamos a flashear al pic, tal como si hubieramos introducido pk2cmd -P PIC18F2550 -F output.hex -M -W -R -Y -J N en la terminal (este ejemplo esta usando un pickit 2 de microchiip, enseguida se explican lor argumentos del comando pk2cmd). 09/22/12 Página 5 de 7 javierzavalaponce@gmail.com
#-P PIC18F2550 , tipo de micro #-F output.hex ,archivo por flashear #-M ,programa la totalidad de la memoria #-W , El micro esta alimentado externamente, quitar -W si pk2 esta alimentando el micro #-R , Libera la linea /MCLR despues de flashear, para que comience a ejecutar el programa #-Y , Verifca el dispositivo , ENTERAMENTE # -J N , Muestra porcentaje de avance. N = cada actualización en una nueva linea # ademas esto puede ser util: # pk2cmd -P PIC18F2550 detiene la ejecucion # pk2cmd -P PIC18F2550 -r suelta la linea de reset para ejecutar el programa. Como existe la posibilidad de que exista un archivo llamado "clean" o "burn" dentro de nuestro proyecto, .PHONY es para que se se ejecuten los comandos necesarios aun cuando estos supuestos archivos existan. Mas Informacion sobre Makefiles en: http://es.wikipedia.org/wiki/Make http://www.gnu.org/software/make/manual/make.html INSTALANDO EL PICKIT2 (basado en http://tuxtronics.com/node/3) Se puede prescindir de esta parte si no se desea o no se tiene un micro o un progrador pickit2, En la pagina de microchip , http://www.microchip.com/stellent/idcplg? IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023805 buscamos el binario: PK2CMD V1.20 Linux Kernel 2.6 Executable Binary que es un tar, lo descomprimimos, se deben tener estos archivos: pk2cmd PK2V023200.hex usbhotplug.txt PK2DeviceFile.dat ReadmeForPK2CMDLinux2-6.txt en ReadmeForPK2CMDLinux2-6.txt vienen instrucciones, vale la pena leerlas los pasos a y b , enseguida solo muestran los comandos: 09/22/12 Página 6 de 7 javierzavalaponce@gmail.com
a) Cambia los permisos de pk2cmd para que (una vez copiado a ~/usr/local/bin/ ) se pueda leer incluso sin ser root. cd pk2cmdv1-20Linux2-6/ chmod 0755 pk2cmd sudo cp pk2cmd /usr/local/bin/ b) cambiamos permisos de PK2DeviceFile.dat y creamos el folder pk2 chmod 0644 PK2DeviceFile.dat sudo mkdir /usr/share/pk2 sudo cp PK2DeviceFile.dat /usr/share/pk2/ Este nuevo folder (pk2) necesita ser añadido al PATH, asi que abrimos el archivo .bashrc que esta en nuestra carpeta home, (javier en mi caso) javier@javier:~$ gedit .bashrc y añadimos al final: export PATH=$PATH:/usr/share/pk2 es buena pracica asegurarse de dejar una linea en blanco al final del archivo, guardamos y cerramos. (tomado de http://tuxtronics.com/node/3 ): Ahora necesitamos habilitar los permisos del USB device para que podamos usar pk2cmd (y por tanto Dwarf) sin ser sudo. Para hacer esto, necesitas decirle al sistema que es seguro permitir la escritura directa a este dispositivo (pickit2). Para hacerlo copia el archivo 70-microchip.rules (este archivo viene adjunto , con los archivos de ejemplo de este articulo) en /etc/udev/rules.d/ asi: sudo cp 70-microchip.rules /etc/udev/rules.d/ ahora estos 2 comandos: sudo groupadd microchip sudo usermod -aG microchip Reemplaza con tu nombre de usuario, por ejemplo: sudo usermod -aG microchip javier Antes de que esto surta efecto,se debe reinicirar el equipo. Espero que esta info sea de utilidad para alguien mas. Saludos. 09/22/12 Página 7 de 7 javierzavalaponce@gmail.com
También puede leer