Programando una MICA2
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>.
Esta aplicación se compone de:
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:
#/opt/tinyos-1.x/apps# ls Blink CountRadio Ident MicaWBVerify RfmToLeds SenseToLeds TelosADC TestMatchbox TestTinyViz BlinkTask GenericBase Makefile Oscilloscope SecureTOSBase SenseToRfm TelosPWM TestNewFlash TestUart CntToLeds GlowLeds Makerules OscilloscopeRF Sense SimpleCmd TestDeluge TestSnooze TestWDT CntToLedsAndRfm GlowRadio MicaHWVerify Pong SenseLightToLog Surge TestDripDrain TestTinyAlloc TOSBase CntToRfm HighFrequencySampling MicaSBVerify ReverseUART SenseTask SurgeTelos TestEEPROM TestTinySec TransparentBase
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:
felixjesus.villanueva(la arroba)uclm.es
Mi web