Programmering af sensor netværk
PC Programmering 101 En PC er typisk udstyret med: en 32/64 bit CPU Har en masse RAM En harddisk En skærm Et antal I/O porte og Er på netværk. Den benytter BIOS (Basic Input/Output System) til opstart Den benytter et operativsystem der indeholder: Memory Management Proceshåndtering I/O og Et filsystem Den understøtter et programmerings miljø med editor, oversætter, linker og flere forskellige slags programmeringssprog
Sensor netværk Programmering En sensor node er typisk udstyret med: En MCU på 8/16/32 bit En lille smule RAM (KB) En flashdisk Et antal lysdioder (LEDs) Et Seriel og/eller USB interface En radio Et antal sensorer og Et batteri HUSK: et sensor netværk er en samling af mange sensor noder Hvordan loader man et program? Hvordan skriver man et program? Hvordan udfører man et program?
Tilgængelige sensor node testnet Harvard Motelab har et netværk bestående af 190 Tmote Sky sensor noder. http://motelab.eecs.harvard.edu/ DSN Testbed at ETH Zurich. De har flere forskellige slags sensor noder tilgængelige http://www.btnode.ethz.ch/projects/jaws DIKU Testbed. The testbed has about 40 Freescale DIG-528 boards. A full scale deployment with about 120 boards is planned for 2006. http://www.distlab.dk/remote/
DIKUs testbed - Re-mote DEMO! (..det skal nok gå galt..)
Kryds-kompilering A cross compiler is a compiler capable of creating executable code for a platform other than the one on which the cross compiler is run. Cross compiler tools are generally found in use to generate compiles for embedded system or multiple platforms. It is a tool that one must use for a platform where it is inconvenient or impossible to compile on that platform, like microcontrollers that run with a minimal amount of memory for their own purpose.
Virtual machines Java Virtual Machine (JVM) er en virtuel maskine der fortolker og udfører Java bytekode. I programmeringssproget Java skrives alt source kode i alm. tekstfiler der ender med.java. Disse filer oversættes med javac compileren til.class filer. En.class fil indeholder bytekode der kan udføres på en JVM. Fordi JVM er tilgængelig på mange forskellige styresystemer, kan den samme.class fil udføres på både Microsoft Windows, såvel som på Solaris eller Linux eller Mac OS.
Oversættelse af java programmer Write once run anywhere
Squawk JVM Squawk is java virtual machine for embedded system and small devices. Most JVMs, if not all, are written in low level languages such as C/C++ and assembler. What makes Squawk different from the other virtual machine is that Squawk's core is mostly written in Java.
Hvordan man loader et program 1 node af gangen: En binær fil uploades via seriel eller USB interface fra host PC direkte til 1 sensor node Flere noder på en gang: En binær fil transmitteres over netværket til flere noder på en gang. Der findes en mekanisme til at holde styr på flere programmer på en gang (f.eks. En scheduler) Rent praktisk bruger man et lille program der kalders en programmer til at overføre programmet til sensor noden med
Udviklingsmiljø uundværlige redskaber 1) Programmet Make http://www.gnu.org/software/make/ 2) CVS/SVN concurrent versioning system http://subversion.tigris.org/ http://en.wikipedia.org/wiki/subversio n_(software) http://www.nongnu.org/cvs/ 3) Et godt IDE (Integrated Development Environment) til udvikling f.eks. Eclipse http://www.eclipse.org/ http://www.dcg.ethz.ch/~rschuler/arti cles/tutorial_wizard.htm
Hvad er TinyOS? TinyOS is an event based operating environment designed for use with embedded networked sensors. More specifically, it is designed to support the concurrency intensive operations required by networked sensors with minimal hardware requirements. The programming language of TinyOS is stylized C that uses a custom compiler 'NesC' (network embedded system C). The source for NesC as well as TinyOS are available on SourceForge. TinyOS was initially developed by the U.C. Berkeley EECS Department
Installing TinyOS 1) Installing a Java 1.5 (Java 5) JDK. Java is the most common way of interacting with mote base stations or gateways that are plugged into a PC or laptop. 2) (Windows only) Install Cygwin. This gives you a shell and many UNIX tools which the TinyOS environment uses, such as perl and shell scripts. 3) Installing native compilers. As you're compiling code for low-power microcontrollers, you need compilers that can generate the proper assembly code. If you using mica-family motes, you need the AVR toolchain; if you're using telos-family motes, you need the MSP430 toolchain. 4) Installing the nesc compiler. 5) Installing the TinyOS source tree. 6) Installing the Graphviz visualization tool. http://www.tinyos.net/tinyos-2.x/doc/html/install-tinyos.html
Hvad er et embedded program? Styresystemer er en del af programmet Styresystemet tilbyder ressourcestyring og kørselsmodel. Det laver initiel opsætning af og adgang til de forskellige hardware komponenter Der er ingen krystalklar grænse mellem userland og system space. Et program udfører følgende: Initialiserer hardwaren Sover Behandler hændelser
NesC struktur En nesc applikation består af en eller flere komponenter, der er blevet samlet eller wired til at forme en applikation. Komponenter spænder over to virkefelter: Et der indeholder deres specifikation, som indeholder navnene på deres interfaces og et andet til deres implementering. En komponent tilbyder og benytter interfaces (grænseflader). Den tilbyder interfaces, som er beregnet til at repræsentere den funktionalitet som komponenten gør tilgængelig for brugeren og de benyttede interfaces repræsenterer den funktionalitet som komponenten har brug for, for at kunne udføre opgaven i selve implementeringen. Interfaces er tovejede: De specifikerer et kommandosæt, som er funktioner der skal implementeres af service provideren, og en samling af events (hændelser), der skal implementeres af interfacets bruger. For at en komponent kan kalde kommandoerne i et interface, skal den implementere de mulige events. En enkelt komponents kan bruge og tilbyde mange forskellige interfaces og også flere instancer af det samme interface.
Modules and Configurations Configurations Modules Configurations are used to assemble other components together, connecting interfaces used by components to interfaces provided by others. Modules provide the implementations of one or more interfaces. Every nesc application is described by a top-level configuration that wires together the components inside. BlinkAppC.nc er testprogrammet Blink's konfiguration Module implementations are for the most part written in C, with some extra constructions for nesc abstractions. Modules can declare state variables. BlinkC.nc er testprogrammet Blink's modul
Konfigurationen BlinkAppC configuration BlinkAppC { } implementation { components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0; components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC -> MainC.Boot; MainC.SoftwareInit -> LedsC; BlinkC.Timer0 -> Timer0; BlinkC.Timer1 -> Timer1; BlinkC.Timer2 -> Timer2; BlinkC.Leds -> LedsC; }
Modulet BlinkC.nc module BlinkC { uses interface Timer<TMilli> as Timer0; uses interface Timer<TMilli> as Timer1; uses interface Timer<TMilli> as Timer2; uses interface Leds; users interface Boot; } implementation { // implementation code omitted }
Events implementation { event void Boot.booted() { call Timer0.startPeriodic( 250 ); call Timer1.startPeriodic( 500 ); call Timer2.startPeriodic( 1000 ); } event void Timer0.fired() { call Leds.led0Toggle(); } event void Timer1.fired() { call Leds.led1Toggle(); } }
Events - fortsat interface Leds { /** * Turn LED n */ async command async command async command on, off, or toggle its present state. void led0on(); void led0off(); void led0toggle(); async command void led1on(); async command void led1off(); async command void led1toggle(); /** * Get/Set the current LED settings as a bitmask. Each bit corresponds to * whether an LED is on; bit 0 is LED 0, bit 1 is LED 1, etc. */ async command uint8_t get(); async command void set(uint8_t val); }
Tasks Alt det kode vi har kigget på indtil nu har været synkront. Det vil sige at det udføres i en enkelt udførselssammenhæng og at det ikke giver slip på CPUen før det er kørt færdigt. Men hvis et lille stykke synkront kode kører i lang tid forhindrer det anden synkronkode i at blive kørt og kan påvirke systemets reaktionstid. En komponent kan have brug for at dele en stor beregning op i mindre dele, der kan udføres en af gangen. Nogle gange er det også i orden hvis beregningen bliver skubbet tidsmæssigt det behøver ikke være lige nu. Dette kan gøres med en task. Den declareres i implementationen og kan derefter kaldes med kommandoen: post taskname();
Lidt om datatyper i TinyOS Til forskel fra std. C navne som int, long eller char benytter TinyOS mere eksplicitte typer, der samtidig declarerer deres størrelse. TinyOS kode undgår f.eks. At bruge bruge den rene datatype int, fordi den er platform specifik. På Mica og Telos noder er int 16 bit, hvorimod den på IntelMote2 er 32 bit. TinyOS kode er storforbruger af unsigned værdier. De bliver brugt som wrappere, fordi negative tal kan føre til meget utilsigtede konsekvenser. signed unsigned 8 bits int8_t uint8_t 16 bits int16_t uint16_t 32 bits int32_t uint32_t 64 bits int64_t uint64_t
Afprøvningsstrategier Der er primært to slags måder at afprøve sit program på: Simulering Til TinyOS findes programmet TOSSIM, der er skrevet i java der simulererer et kørerende system Instumentation Konkret afprøvning på sensor noden Vha. En pakkesniffer Vha. Traces Ved at koble I/O enheder til der kan give synligt output "When all you have is a hammer, every problem looks like a nail."
Afrunding Næste gang skal i høre mere om hvordan selve netværket i sensor netværk fungerer.