Se trata de usar subversion para controlar los cambios en un directorio, normalmente ficheros de configuración, para que si metes la pata, puedes saber qué demonios has cambiado.
A veces, para tener nuestros paquetes Debian generados disponibles en un repositorio no es necesario montar uno complejo (por ejemplo, cuando tus paquetes sólo están para una arquitectura). Los repositorios triviales nos permiten tener nuestros paquetes Debian personalizados disponibles en menos de 10 minutos.
Estructura de directorios
Inicialmente, debemos crear una estructura de directorios para nuestro nuevo repositorio trivial. Vamos a tomar como raíz el directorio /var, y dentro creamos los siguientes directorios:
-var
+-mirepo
+-binary
+-source
Utilizamos el comando mkdir para crear el antrerior árbol de directorios.
Llenando el repositorio
Una vez creada la estructura, copiamos nuestros paquetes binarios Debian (los .deb) en el directorio binary y los paquetes fuentes (los .dsc) en el directorio source. A continuación, creamos los ficheros índices de nuestro repositorio trivial utilizando dpkg:
Como vemos, lo anterior nos crea los índices de nuestros paquetes que serán consultados por apt cuando consulte el repositorio.
Utilizando el repositorio
Una vez que hemos hecho todo lo anterior podemos añadir la siguiente línea a nuestro /etc/apt/sources.list para utilizar el repositorio de forma local:
deb file:///var/mirepo binary/
Y si quieres tenerlo accesible de forma remota, puedes crear un enlace simbólico en /var/www/ para redireccionar la consulta http a tu servidor Apache:
Vamos a tratar de describir el proceso de programación de un nodo Mica2 con un ejemplo mínimo. Para ello vamos a usar el equivalente para sistemas empotrados del hola mundo que es la aplicación Blink para el tinyOS. Adicionalmente iremos ampliando este tema con las herramientas que nos proporciona la toolchain.
Hardware
Los equipos adquiridos en el grupo Arco son las micas2 uno de los equipos mas ampliamente usados en Wireless Sensor Networks junto con el tinyOS.
Hay dos tipos de dispositivos, las micas2 (4 nodos) y las micas2dot (4 nodos) ademas de un programador MIB510.
Las micas2 cuentan con un puerto de extensión dónde se le pueden conectar plaquitas con sensores, nuestras micas2 tienen las placas MTS310CA que cuentan con sensor de luz, temperatura, micrófono y un pequeño altavoz ademas
de un acelerómetro y un sensor magnético.
El procesador y la radio de las micas2 cuenta con un MPR400CB que esta basado en el procesador Atmel ATmega128L, para mas datos mirar el datasheet
Las micas2dot son algo mas limitadas como podemos ver en su página web
Programando la Mica2
La instalación del tinyOS y del toolchain ya lo vimos en la receta anterior
Esta aplicación basicamente lo que hace es encender y apagar el led rojo de la mota a una frecuencia de 1Hz. La aplicación se encuentra en el directorio:
/opt/tinyos-1.x/apps/Blink
El compilador que vamos a usar es el de NesC que es el ncc:
ncc --help
Usage: avr-gcc [options] file...
Options:
-pass-exit-codes Exit with highest error code from a phase
--help Display this information
--target-help Display target specific command line options
(Use '-v --help' to display command line options of sub-processes)
-dumpspecs Display all of the built in spec strings
-dumpversion Display the version of the compiler
-dumpmachine Display the compiler's target processor
-print-search-dirs Display the directories in the compiler's search path
-print-libgcc-file-name Display the name of the compiler's companion library
-print-file-name=<lib> Display the full path to library <lib>
-print-prog-name=<prog> Display the full path to compiler component <prog>
-print-multi-directory Display the root directory for versions of libgcc
-print-multi-lib Display the mapping between command line options and
multiple library search directories
-print-multi-os-directory Display the relative path to OS libraries
-Wa,<options> Pass comma-separated <options> on to the assembler
-Wp,<options> Pass comma-separated <options> on to the preprocessor
-Wl,<options> Pass comma-separated <options> on to the linker
-Xlinker <arg> Pass <arg> on to the linker
-save-temps Do not delete intermediate files
-pipe Use pipes rather than intermediate files
-time Time the execution of each subprocess
-specs=<file> Override built-in specs with the contents of <file>
-std=<standard> Assume that the input sources are for <standard>
-B <directory> Add <directory> to the compiler's search paths
-b <machine> Run gcc for target <machine>, if installed
-V <version> Run gcc version number <version>, if installed
-v Display the programs invoked by the compiler
-### Like -v but options quoted and commands not executed
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>
-x <language> Specify the language of the following input files
Permissible languages include: c c++ assembler none
'none' means revert to the default behavior of
guessing the language based on the file's extension
Options starting with -g, -f, -m, -O, -W, or --param are automatically
passed on to the various sub-processes invoked by avr-gcc. In order to pass
other options on to these processes the -W<letter> options must be used.
For bug reporting instructions, please see:
<URL:http://gcc.gnu.org/bugs.html>.
Si analizamos el proceso de compilación que ya usamos para comprobar que la toolchain estaba correctamente instalada:
$make mica2
mkdir -p build/mica2
compiling Blink to a mica2 binary
ncc -o build/mica2/main.exe -Os -finline-limit=100000 -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x7d -Wnesc-all -target=mica2 -fnesc-cfile=build/mica2/app.c -board=micasb -I%T/lib/Deluge -DIDENT_PROGRAM_NAME=\"Blink\" -DIDENT_USER_ID=\"root\" -DIDENT_HOSTNAME=\"homer\" -DIDENT_USER_HASH=0xbc4a9a92L -DIDENT_UNIX_TIME=0x45b09151L -DIDENT_UID_HASH=0x04c03c51L Blink.nc -lm
compiled Blink to build/mica2/main.exe
1632 bytes in ROM
49 bytes in RAM
avr-objcopy --output-target=srec build/mica2/main.exe build/mica2/main.srec
avr-objcopy --output-target=ihex build/mica2/main.exe build/mica2/main.ihex
writing TOS image
Vemos que lo primero crea un directorio para meter los binarios y que todo lo va a meter en main.exe, las opciones le indican diversos parámetros para la generación del código entre los cuales podemos ver el target, en nuestro caso la mica2, el usuario y el host, y al final nos aparece los bytes generados para la RAM y para la ROM.
Si echamos un vistazo al directorio build/mica2 vemos los siguientes archivos:
donde aparecen diversos archivos como las imágenes generadas por avr-objcopy como són el formato de intel (.ihex) y el de motorola (.srec)
Para instalarlo concectar físicamente el nodo a la interfaz de programación (la placa mib510) y esta al puerto serie mediante un cable RS232, por último ejecutar el siguiente comando:
# make mica2 reinstall mib510,/dev/ttyS0
cp build/mica2/main.srec build/mica2/main.srec.out
installing mica2 binary using mib510
uisp -dprog=mib510 -dserial=/dev/ttyS0 --wr_fuse_h=0xd8 -dpart=ATmega128 --wr_fuse_e=ff --erase --upload if=build/mica2/main.srec.out
Firmware Version: 2.1
Atmel AVR ATmega128 is found.
Uploading: flash
Fuse High Byte set to 0xd8
Fuse Extended Byte set to 0xff
rm -f build/mica2/main.exe.out build/mica2/main.srec.out
installing mica2 bootloader using mib510
uisp -dprog=mib510 -dserial=/dev/ttyS0 --wr_fuse_h=0xd8 -dpart=ATmega128 --wr_fuse_e=ff --upload if=/opt/tinyos-1.x/tos/lib/Deluge/TOSBoot/build/mica2/main.ihex
Firmware Version: 2.1
Atmel AVR ATmega128 is found.
Uploading: flash
Fuse High Byte set to 0xd8
Fuse Extended Byte set to 0xff
Y ya esta, tanto el led rojo de la placa de programación (la MIB510) como el de la mota parpadean a una frecuencia de 1 Hz, a continuación puedes desconectar la mica de la placa de programación y el led continua parpadeando.
No es mucho, pero como ya comentamos es el hello world de las micas y la prueba definitiva de que todo el toolchain funciona correctamente.
Existen dentro del directorio apps bastantes ejemplos que podeis probar y sobre todo, podeis mirar como ejemplos de programación:
Lo siguiente es echarle un vistazo a NesC y ver como desarrollar nuestros propios programas, tambien veremos como usar las herramientas de depuración y el simulador TOSSIM, pero eso para las siguientes entregas.
Enlaces
Los enlaces básicos son los de la receta anterior:
Cómo usar el servidor subversion para ejecutar automáticamente programas personalizados. Como ejemplo, la receta explica cómo actualizar una página web mantenida en un repositorio.