Elaborato Ruggiero Roberto N46000200
Transcript
Elaborato Ruggiero Roberto N46000200
Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Elaborato finale in Programmazione II Analisi di piattaforme per lo sviluppo di applicazioni su reti di sensori senza filo Anno Accademico 2014 - 2015 Candidato Roberto Ruggiero matr. N46000200 Indice Indice................................................................................... III Introduzione ......................................................................... 4 Capitolo 1: Reti di sensori senza filo ................................... 5 1.1 Stato dell’arte .............................................................................. 7 1.2 Applicazioni delle reti di sensori .............................................. 11 Capitolo 2: Piattaforme software ....................................... 12 2.1 TinyOS ...................................................................................... 13 2.2 Contiki ...................................................................................... 16 2.3 Nano-RK ................................................................................... 17 Capitolo 3: Modelli di programmazione ............................ 18 3.1 Programmazione ad eventi ....................................................... 19 3.1.1 La sintassi in TinyOS ................................................................. 21 3.1.2 Esempio: PowerUP .................................................................... 22 3.2 Waspmote programming model ............................................... 24 3.2.1 Ambiente di sviluppo ................................................................. 26 3.2.2 Esempio: lettura dall’accelerometro ........................................... 27 3.3 La programmazione in Contiki ................................................ 28 3.3.1 Struttura di un programma ......................................................... 29 Conclusioni ........................................................................ 30 Bibliografia .......................................................................... 31 III Introduzione I progressi nelle tecnologie dei sistemi microelettromeccanici MEMS, delle comunicazioni senza filo e dell'elettronica digitale, hanno permesso lo sviluppo di piccoli dispositivi a bassa potenza dai costi contenuti, multifunzionali e capaci di comunicare tra loro tramite tecnologia wireless. Questi piccoli apparecchi, chiamati nodi sensore, o mote, hanno un costo di produzione molto basso e sono caratterizzati da dimensioni e peso ridotti. Essi sono in grado di rilevare e acquisire grandezze fisiche mediante sensori: particolari trasduttori che si trovano in diretta interazione con il sistema misurato1. Inoltre sono in grado di elaborare i dati acquisiti e scambiare informazioni con altri nodi sensore. Una rete di sensori, o sensor network, è un insieme di nodi disposti in prossimità oppure all'interno del fenomeno da osservare. L’idea che sta alla base delle reti di sensori senza filo nasce molti anni fa, con il concetto "Smurt Dust"[1]. Lo scopo delle reti di sensori senza filo è principalmente quello di produrre, su un periodo esteso di tempo, un’informazione in tempo reale, globale, significativa, a basso costo anche in ambienti ostili [3], mediante una serie di dati locali provenienti dai singoli sensori. Negli ultimi anni le reti di sensori hanno subito un grosso sviluppo tecnologico, non solo dal punto di vista hardware. Come verrà approfondito nei capitoli 2 e 3 di questo elaborato, il progresso tecnologico ha “colpito” anche i sistemi operativi per i nodi delle reti senza filo, ed i modelli di programmazione delle applicazioni. Tale sviluppo ha permesso l’impiego delle reti di sensori senza filo, in numerosi ambiti[2], che vanno da quelli militari a quelli scientifici, industriali, medici e domestici. 1 In base alla norma UNI4546 Misure e Misurazioni 4 Capitolo 1 Reti di sensori senza filo Per comprendere appieno cos’è una rete di sensori senza filo risulta interessante partire dalle unità costituenti di tali infrastrutture: i nodi sensore. In figura 1 possiamo vedere una generica architettura hardware di un nodo sensore. Figura 1 – Architettura hardware di un nodo sensore • Microcontrollore: è la CPU del nodo e si occupa di rilevare i dati, elaborarli, decidere dove e quando spedirli, ricevere dati da altri nodi, gestire gli attuatori e i sensori. Si utilizzano i microcontrollori come unità di calcolo, poiché richiedono poca energia, hanno una memoria integrata, sono facilmente programmabili e si interfacciano bene con sensori e attuatori. • Memoria: la memoria è di tipo RAM, usata per le variabili temporanee, oppure di tipo EEPROM o FLASH per il codice e lo storage dei dati raccolti. • Dispositivo di comunicazione: solitamente un trasmettitore ad onde radio. Può operare a diverse frequenze e con diversi livelli di affidabilità nella trasmissione dei dati. I trasmettitori più impiegati sono quelli che operano a 2.4Ghz, seguendo lo standard IEEE 802.15.4 (ZigBee)[4]. 5 • Sensori: attraverso i convertitori ADC e le periferiche dei microcontrollori, un mote è capace di accogliere svariati tipologie di sensori sia digitali che analogici. • Fonte di alimentazione: solitamente batterie. Le reti che devono avere un lifetime molto lungo, spesso ricorrono a fonti energetiche ausiliare per ricaricare le batterie dei nodi[5]. Una rete di sensori senza filo può essere costituita da poche decine a centinaia di nodi sensore, in cui ciascun nodo, ha la capacità di accumulare e di instradare i dati fino ad uno o più nodi speciali della rete, detti nodi sink. I sink hanno lo scopo di raccogliere i dati e trasmetterli tipicamente ad un server o ad un calcolatore e quindi all'utente finale. La topologia dei nodi nell’area di sensing2 generalmente può essere: a stella, mash o peer-to-peer, oppure ad albero. E’ importante evidenziare che le reti di sensori senza filo, o reti di sensori wireless, presentano sostanziali differenze dalle reti ad hoc. Ciò è evidente dal fatto che: il numero di nodi di una rete di sensori può essere di alcuni ordini di grandezza maggiore rispetto al numero di nodi in una rete ad hoc, la topologia di una rete di sensori può cambiare frequentemente a causa di guasti o per la necessità di variare i punti di misura, i nodi utilizzano un paradigma di comunicazione broadcast e non punto-punto, sono limitati rispetto ad alimentazione, capacità di calcolo e memoria, solitamente non possiedono un identificatore globale. Per tali motivi, questa tipologia di rete necessita di algoritmi pensati e realizzati in maniera specifica per gestire la comunicazione e l’instradamento dei dati. La maggior parte delle reti di sensori, ad esempio sono modellate come dei database distribuiti. Un’ulteriore problematica circa le reti di sensori wireless è la riserva d'energia limitata e quasi sempre non rinnovabile dei nodi sensore. Ciò ha spinto fin da subito numerosi gruppi di ricerca a rivedere le tecniche di programmazione per mantenere costantemente bassi i consumi e aumentare il ciclo di vita dei nodi. Il primo meccanismo per ridurre i consumi è stato quello di permettere ai nodi di effettuare le elaborazioni sui dati grezzi prima di trasmetterli al sink, in modo da 2 Area all’interno della quale sono disposti i nodi sensore. 6 trasmettere solo i dati richiesti e già elaborati. In questo modo si riesce ad avere notevoli risparmi energetici e un abbattimento dei tempi in cui è attiva la trasmissione dati. Un’ulteriore metodo per ridurre il consumo energetico delle reti di sensori è quello di dotare i nodi sensore di capacità auto-organizzative. In questo modo i motes, possono effettuare un auto-apprendimento circa la loro posizione relativa al nodo sink più vicino, evitando così trasmissioni inefficienti o a potenza sovradimensionata. Fin ora abbiamo evidenziato due delle problematiche principali delle reti di sensori wireless: l’instradamento e la trasmissione dei dati raccolti e la gestione delle risorse energetiche dei motes. Le reti di sensori senza filo, allo stesso tempo, forniscono tutta una serie di benefici, quali: costi di cablaggio ridotti, bassa complessità di installazione in sito, numero elevato di punti di misura, topologia variabile della rete, scalabilità a basso costo, fault-tolerance3. 1.1 Stato dell’arte In commercio sono disponibili diverse piattaforme. La scelta dipende dall'applicazione specifica che si vuole creare, dal contesto in cui la rete di sensori wireless verrà adoperata, dalle dimensioni massime ammissibili dei nodi della rete, dal costo sostenibile, dalla loro efficienza energetica e dalla robustezza richiesta. Tra le piattaforme hardware più importanti, alcune delle quali ormai fanno parte della storia delle reti wireless, abbiamo: Mica Family (Mica, Mica2, Mica2dot, MicaZ) della Crossbow Technology[6]; Telos Family (Telos, TelosA, TelosB, TmoteSky) della Moteiv Corporation[7]; BTnodes dell'ETH di Zurigo[9]; FireFly della Carnagie Mellon University[8]; Lotus Cortex dalla Memsic[10]; Waspmote dalla Libelium[15]; 3 Capacità di un sistema di non subire avarie anche in caso di guasti 7 Dal punto di vista architetturale, questi nodi sensore sono tutti simili e rappresentabili come in figura 1. Di fatto sono tutte evoluzioni del nodo Mica. I nodi sensore Mica sono stati sviluppati dall'Università della California a Berkeley, verso la fine degli anni ‘90. Sono quattro i modelli appartenenti a questa serie: Mica, figura 1.1.1, Mica2, figura 1.1.2, Mica2Dot e MicaZ, figura 1.1.3, che differiscono in base a caratteristiche tecniche e dimensioni (distribuiti dalla Memsic[10]). Sono dotati tutti di microcontrollore Atmel[34] 8 bit a 4 Mhz, con 4 Kbyte di RAM, ADC a 10 bit a 8 canali, 128 Kbyte di memoria FLASH programmabile e 512 Kbyte per i dati. La sostanziale differenza tra i vari membri della famiglia dei Mica è il chip radio, nel MicaZ è il CC2420 con data rate di 250Kbit/s e compatibile con IEEE 802.15.4. Tutti i nodi della famiglia Mica non posseggono sensori integrati ma, attraverso dei pin di espansione, possono accogliere numerose tipologie di sensori per il rilevamento di temperatura, umidità, accelerazioni, pressioni, campi magnetici,… Figura 1.1.1 – Mica Figura 1.1.2 – Mica2 Figura 1.1.3 – MicaZ I motes della famiglia Telos, naturale evoluzione dei nodi Mica, sono disponibili in quattro versioni: Telos, TelosA, TelosB, figura 1.1.4, e TmoteSky. A differenza dei Mica, i Telos montano un nuovo microcontrollore. Si tratta dell’MSP430[11] a 16 bit, dotato di 10 Kbyte di memoria RAM, 48 Kbyte di memoria FLASH, di un convertitore ADC a 12 bit e di un controllore DMA4. Ogni nodo della famiglia Telos è dotato di 1 Mbyte di memoria FLASH esterna e dispongono on-board di sensori di temperatura, umidità e luminosità. Fig 1.1.4 – TelosB 4 Direct Memory Access 8 I BTnode[9], figura 1.1.5, sono nodi sensore progettati principalmente dall’ETH di Zurigo, è realizzati in tre versioni: la più recente, chiamata BTnode rev3, è la piattaforma che ha avuto più successo anche grazie alle numerose interfacce di comunicazione e periferiche quali: ISP, UART, SPI, I2C, GPIO. La parte di trasmissione radio rappresenta la particolarità di questo mote: consiste in un doppio sistema di trasmissione, dispone sia di un chip radio Bluetooth che di una scheda radio CC1000. In questo modo con il primo metodo di trasmissione può offrire una comunicazione molto affidabile e con un data-rate alto, ma con una copertura più bassa, con il secondo metodo si ottiene invece una comunicazione radio con una copertura superiore, ma con un data-rate più basso. Figura 1.1.5 – BTnode Il nodo sensore Firefly[3], visibile in figura 1.1.6, è nato per il monitoraggio nelle miniere. E’ dotato di un processore Atmega128L con 8 Kbyte di memoria RAM e 128 Kbyte di ROM. Attraverso una porta SDIO 5 si possono utilizzare schede di memoria FLASH. La trasmissione è garantita dal modulo radio CC2420 compatibile con lo standard IEEE 802.15.4. I consumi di questa tipologia di nodo sono estremamente ridotti: la durata prevista delle batterie è di quasi due anni. Questo è reso possibile da complessi meccanismi di sincronizzazione tra i vari nodi della rete che permettono di poter mandare i nodi sensore in sleep-mode molto rapidamente, minimizzando i periodi di idle. Figura 1.1.6 – FireFly 5 Secure Digital Input Output 9 Il Lotus Cortex, figura 1.1.7, prodotto dalla MEMSIC[10], possiede un’architettura estremamente avanzata. Adotta componenti di ultima generazione che migliorano notevolmente le prestazioni del nodo, rispetto ai motes precedenti, mantenendo comunque i consumi molto bassi6. Monta una CPU Cortex® M3[12], 10-100 Mhz a 32 bit e ha un modulo radio compatibile con IEEE 802.15.4. La memoria on-board è costituita da 64KByte di SRAM, 512KByte di memoria FLASH e 64 Mbyte di serial FLASH per i dati raccolti. Figura 1.1.7 – Lotus Cortex Con 51-pin di espansione il Lotus supporta: ingressi analogici su ADC, digital IO, I2C, SPI e UART. Viene configurato di fabbrica per accogliere sistemi RTOS7, come TinyOS[13], MoteRunner[14] e tutta una serie di software open source. Il Waspmote, figura 1.1.8, nodo sensore di casa Libelium[15] è tra le piattaforme hardware, nate per le reti di sensori senza filo, più versatili. Figura 1.1.8 – Waspmote Il Waspmote ha un microcontrollore ATmega1281[34] con una frequenza di 14 MHz, SRAM da 8KByte, EEPROM da 4KByte, memoria FLASH da 128KByte e uno slot per SD Card fino a 2GByte. Il Waspmote on-boad presenta un accelerometro MEMS e un sensore di temperatura. Attraverso tutta una serie di pin e board di espansione è 6 7 Da 50mA a 10μA in sleep mode Real-Time Operating System 10 possibile equipaggiarlo con vari tipi di sensori. L'azienda spagnola si è imposta una visione della connettività dei dispositivi altamente variegata, facendo in modo che le piattaforme hardware supportino diverse tecnologie di trasmissione: dalla lunga distanza, 3G/GPRS fino a 802.15.4, Bluetooth e NFC; inoltre supporta diversi protocolli: ZigBee, LoRa, IPv6 radio, Bluetooth… a diverse frequenze di trasmissione: 2.4GHz, 868MHz, 900MHz. Inoltre i Waspmote gestiscono tutta una serie di protocolli industriali come Modbus, RS234, RS485, CANbus… 1.2 Applicazioni delle reti di sensori Negli ultimi anni sono stati numerosi i gruppi di ricerca che hanno applicato le reti di sensori senza filo in contesti reali, dimostrando le effettive potenzialità di tale tecnologia. Come si può osservare in figura 1.2, una rete di sensori può essere impiegata principalmente per due scopi: il monitoraggio e il tracking. I campi d’applicazione riportati in letteratura([2][16][17][18][19][20]) sono numerosi. Figura 1.2 – Applicazioni delle reti di sensori 11 Capitolo 2 Piattaforme software Il mondo delle reti di sensori senza filo richiede, oltre ad un insieme di componenti hardware specifici, come abbiamo visto nel capitolo precedente, anche piattaforme software dedicate ([21][22][23]). Ogni nodo sensore, data la sua architettura, è in grado di effettuare operazioni complesse, come il campionamento e la trasmissione dei dati via radio. Risulta quindi fondamentale avere un sistema operativo compatto che possa essere flessibile e adatto all’architettura hardware tipica dei nodi sensore. Un sistema operativo per i nodi di una rete di sensori wireless deve possedere le seguenti caratteristiche: • Elaborazione con poche risorse: i microcontrollori hanno memorie di qualche decina di Kbyte, sono progettati per il risparmio energetico, a discapito delle prestazioni. • Consumi energetici ridotti al minimo: i sistemi operativi devono essere pensati per il risparmio energetico, sia in fase di elaborazione che in fase di trasmissione dei dati. • Alta concorrenza: la velocità e la prontezza del sistema operativo è essenziale. Il sistema operativo deve essere in grado di gestire le comunicazioni via radio e i sensori, in maniera concorrente. • Gestione diretta dell’hardware: l’hardware deve essere gestito mediante un sottile strato software, che astrae i comandi di accesso alle risorse. Esistono pochi controller secondari, nei motes il microcontrollore gestisce direttamente il chip radio e gli ADC che governano i sensori. • Robustezza: le reti di sensori senza filo sono pensate per un utilizzo intensivo e continuativo. Il software, deve essere semplice, robusto e affidabile. 12 Si possono distinguere due macro tipologie di sistemi operativi per nodi sensore: quelli in cui i componenti del sistema operativo vengono compilati insieme all’applicazione, come TinyOS[13], e i sistemi invece con i tradizionali strati software general purpose, in versione ridotta, come Contiki[26], Nano-RK[28], MoteRunner[14]. La prima tipologia di sistema operativo solitamente ha una sola applicazione in esecuzione. Ciò permette di avere consumi molto ridotti, non essendoci in genere context switch e bassa occupazione di memoria. Lo svantaggio derivante da tale approccio è la limitata versatilità e i seri vincoli di riconfigurabilità dell’applicazione. Nel secondo caso è più difficile tenere i consumi sotto controllo e risparmiare risorse hardware, ma si guadagna in versatilità potendo eseguire più applicazioni contemporaneamente. 2.1 TinyOS Le soluzioni attualmente esistenti alle problematiche sopra citate sono molteplici. TinyOS8 è sicuramente il più noto e diffuso sistema operativo per reti di sensori senza filo. E’ un sistema open - source, originariamente sviluppato come progetto di ricerca dall’Università della California, Berkeley, in collaborazione con Intel. La sua popolarità negli anni è cresciuta tantissimo, fino ad avere una comunità internazionale di sviluppatori e utilizzatori. La prima versione del sistema è stata rilasciata nel 2000, mentre l’ultima, la versione 2.1.2, è del 2012. Il linguaggio di programmazione con cui è stato sviluppato TinyOS è il nesC 9[24], che offre un modello di programmazione basato su eventi. TinyOS, ha dimensioni molto ridotte, l’occupazione di memoria è di circa 10 Kbyte, e può essere visto come un ambiente di esecuzione che segue un modello ad eventi. Infatti è un sistema operativo completamente non bloccante, in cui non è previsto il supporto per i threads10. L’Architettura è component-based, fornisce una ricca libreria di componenti predefiniti: tra cui protocolli di rete, servizi distribuiti, astrazioni 8 Tiny Operating System, sistema operativo “minuscolo” Network embedded system C 10 Introdotti dalla versione 2.1 (TOSThreads architecture) 9 13 hardware, timer, driver per sensori e strumenti di acquisizione dati. Tutti questi componenti possono essere utilizzati così come sono, oppure ridefiniti. Grazie all’architettura a moduli di TinyOS, sui nodi sensore verranno caricati solo i componenti strettamente necessari all’applicazione da eseguire. Il componente principale, responsabile del funzionamento di TinyOS è lo scheduler. Tale componente manda in esecuzione i task con una politica FIFO 11 run to completion12. Lo scheduling ha due livelli di priorità: normale, per i task, e quello più alto per gli eventi o comandi, i quali possono interrompere i task. Il modello a componenti di TinyOS possiede i command handlers e gli event handlers. I componenti comunicano tra loro invocando comandi, e sollevando eventi. Comandi ed eventi, vengono eseguiti a livello alto di priorità dello scheduler. Ogni componente presenta un frame, che rappresenta l’area dati del componente, allocata staticamente, dato che in TinyOS non è prevista l’allocazione dinamica. I componenti possono essere suddivisi in: hardware abstractions, componenti che mappano le funzionalità fornite sull’hardware via software, creando un’astrazione dello stesso e rendendolo utilizzabile dai moduli superiori, ad esempio un componente che legge un bit da un canale radio. I synthetic hardware, moduli che simulano il comportamento di hardware più sofisticato di quello realmente presente sul mote, ad esempio un componente che assembla 8 bit e li invia a quelli ai livelli superiori. Infine gli high level software component, componenti di livello più alto che si occupano di eseguire algoritmi e gestire protocolli che si distaccano dal particolare hardware presente, ad esempio il componente che implementa un protocollo di comunicazione. Active Messages (AM) è la tecnologia di rete utilizzata da TinyOS per gestire la comunicazione radio, da mote a mote, o seriale, da pc a mote. Non specifica meccanismi connection-oriented, ogni pacchetto è un’entità indipendente. La comunicazione con AM avviene tramite messaggi, che presentano un identificatore chiamato AM Type, che identifica il tipo di evento da generare nel nodo che riceve il messaggio. 11 12 First-in-first-out Un task non può interrompere un altro task. 14 Il principale svantaggio dell’approccio Active Messages è che tutti i nodi comunicanti devono avere lo stesso software o implementare un componente che definisca lo stesso tipo di identificatore. La versione più recente di TinyOS, la 2.1.2, apporta lievi migliorie rispetto alla versione 2.1. Per questo ai fini della nostra analisi considereremo la versione 2.1. Il più grosso miglioramento del “sistema operativo minuscolo” è avvenuto con il passaggio dalla versione 1.x alla 2.x. La versione 2.x, si presenta come una riscrittura completa del TinyOS 1.x con lo scopo di riorganizzarlo, ottimizzarlo con nuove funzionalità. Tale riscrittura, però, ha reso incompatibili i software eseguibili tra le due versioni. Vediamo ora, quali sono state le maggiori novità introdotte in TinyOS versione 2.1: • Lo scheduler diventa un componente modulare che può essere sostituito o modificato con maggiore facilità. • Supporto per i threads, attraverso la libreria TOSThreads e protezione della memoria a run-time attraverso il meccanismo Safe TinyOS. • La struttura architetturale basata su livelli di astrazione è stata rivisitata per migliorare il supporto con l’hardware. Nuove piattaforme possono accogliere così TinyOS, inoltre alcuni servizi livello applicazione sono stati migliorati. • Nuovi protocolli di comunicazione e instradamento dei frame introducono un miglioramento del 35% sull’efficienza e sull’occupazione di memoria RAM[13]. • Le funzionalità radio sono state impostate in modo tale da essere sempre non operative dopo il boot del sistema. E’ necessario uno start esplicito ed esclusivo. Così si evitano sprechi energetici. • Il formato dei frame 802.15.4 viene modificato per supportare in un futuro reti 6LoWPAN13 e un livello MAC compatibile sempre per le reti 802.15.4. • La struttura dei buffer dei messaggi è stata modificata e riorganizzata, in modo tale da avere differenti modalità di accesso per le varie tipologie di comunicazione, così da rendere più semplice la programmazione. 13 IPv6 over Low power Wireless Personal Area Networks 15 • I timer diventano solo di tipo assoluto. E’ stata rimossa la possibilità di implementare timer relativi. Non è più possibile reimpostare il clock hardware interno con un valore differente di quello impostato in fase di boot. 2.2 Contiki Contiki[26] è un sistema operativo open - source, multitasking, nato nel 2002 e giunto alla versione 2.7. Sa adattarsi ad un vasto numero di piattaforme, che vanno dai computer a 8 bit ai sistemi embedded e quindi ai microcontrollori. Il kernel di Contiki è stato sviluppato principalmente da Adam Dunkels al "Networked Embedded Systems group" dell'Istituto svedese di Informatica. In seguito, hanno preso parte allo sviluppo di tale sistema operativo anche importanti sviluppatori provenienti da Atmel, Cisco, ENEA, politecnico di Zurigo, RWTH Aachen University, Oxford University, SAP, Sensinode, ST Microelectronics, costituendo un’importante community[27]. Contiki è scritto nel linguaggio di programmazione C. La sua occupazione di memoria RAM è di soli 10 Kbyte, che arrivano a 30 Kbyte nel caso di GIU 14 grafica, e 30 Kbyte di memoria ROM per il codice. Lavora con velocità di elaborazione dell’ordine dei MHz e una banda di rete dell’ordine di qualche centinaia di Kbit/secondo. Contiki, offre un kernel che permette di poter allocare dinamicamente i programmi. Lo scheduling è di tipo non-preemptive, ovvero la CPU viene rilasciata dal processo solo se quest’ultimo termina oppure si blocca in attesa di un evento. I processi di Contiki sono costituiti da threads molto snelli, chiamati protothreads, che comunicano attraverso l’uso di messaggi. Le caratteristiche offerte da questo sistema operativo, alcune delle quali opzionali, sono le seguenti: multitasking kernel, application preemptive multithreading, TCP/IP networking including IPv6, windowing system and GUI, networked remote display, web browser, personal web server, simple telnet client, screensaver. 14 Grafic User Interface 16 Contiki funziona su un grosso numero di piattaforme: per quanto riguarda i microcontrollori, gira sui TI MSP430[11], Atmel AVR[34], STMicroelectronics STM32W, Microchip PIC32, Freescale MC13224, LPC2103, TI CC2430[11], TI CC2538[11], TI CC2630[11] e CC2650[11]. Contiki è stato utilizzato in svariati contesti reali, implementando sistemi di illuminazione delle strade, monitoraggio del suono per le città intelligenti, sistemi di monitoraggio delle radiazioni e sistemi di allarme.[25] 2.3 Nano-RK Nano-RK[28], è un sistema operativo open-source, real-time della Carnegie Mellon University, specifico per le reti di sensori senza filo. E’ scritto in C e funziona sulla piattaforma di nodi sensore FireFly con microcontrollori Atmel[34], e sulla piattaforma hardware MicaZ con microcontrollore MSP430[11]. Il consumo di memoria di Nano-RK è di soli 2 Kbyte di RAM, mentre sono 18 Kbyte quelli occupati in memoria FLASH. Lo scheduler di Nano-RK è a una priorità fissa, full-preemptive, con una serie di primitive di sincronizzazione per il supporto all’attività real-time. I tasks, fanno richiesta di risorse e il kernel di Nano-RK garantisce e controlla gli accessi alla CPU del mote, controllando anche i consumi di ogni operazione, riducendo la frequenza di trasmissione se quest’ultima è troppo dispendiosa. Nano-RK supporta tecniche di power-management e provvede direttamente a funzioni di routing, occupandosi dell’incapsulamento dei pacchetti e della trasmissione [29]. 17 Capitolo 3 Modelli di programmazione Se si vuole sviluppare un’applicazione destinata ai motes delle reti di sensori senza filo, bisogna riflettere su alcuni requisiti: • Risorse hardware limitate: i sistemi embedded, quindi i motes delle reti di sensori, hanno a disposizione una quantità limitata di risorse, nella loro progettazione c’è sempre un compromesso tra costi, dimensioni e consumo di energia. Una prima criticità da considerare nella programmazione è la ridotta quantità di memoria per il codice da caricare sulla piattaforma. Una seconda, e non ultima criticità, è quella di mantenere i consumi più bassi possibili se si desidera che la rete rimanga operativa a lungo senza bisogno di interventi. • Affidabilità: come già accennato nel capitolo 1, questo tipo di reti viene utilizzato per il monitoraggio e il trekking di parametri di vario genere e, in molti casi, si ha la necessità che la rete di sensori continui a funzionare per lunghi periodi di tempo senza bisogno di interventi umani. • Reattività: le reti di sensori senza filo, nella maggior parte dei casi sono sistemi real-time. Pertanto nello sviluppo software dei nodi, bisogna sempre considerare le limitazioni temporali, in modo tale che l’informazione sia acquisita e trasmessa entro un tempo prefissato. In questo capitolo verranno trattati nello specifico i modelli di programmazione delle reti di sensori senza filo, cioè, l’insieme degli strumenti e delle astrazioni concettuali fornite agli sviluppatori per scrivere il codice sorgente di un programma. Nell’ambito delle reti wireless, uno dei problemi fondamentali, affrontati nei modelli di programmazione, è la gestione della concorrenza. Le applicazioni dei motes, sono fondamentalmente di tipo asincrono: un frame radio, ad esempio, potrebbe presentarsi 18 in qualsiasi momento. Uno dei modi più semplici per la gestione di tali contesti è quella del polling, ovvero la verifica ciclica di un determinato evento atteso. Tale modello, però, in alcuni casi utilizza eccessivamente la CPU con il rischio di ritardi nelle elaborazioni. Nei paragrafi che seguono vedremo il modello, o paradigma, di programmazione ad eventi, utilizzato in TinyOS, quello utilizzato per i Waspmote di casa Libelium, infine dei brevi cenni circa il paradigma di programmazione di Contiki, basato su protothread. Non verranno trattati, in questa sede, modelli di programmazione più complessi come il paradigma publish/subscribe. 3.1 Programmazione ad eventi Il modello di programmazione ad eventi, o event-driven, è un paradigma di programmazione concettualmente molto semplice: il sistema gestisce un evento, mediante una fase di polling e le interrupt. Un evento può essere derivante dall’hardware: sensori, ricezione radio,… Dal software: timer, operazioni effettuate da applicazioni… Oppure da entrambi. In questo elaborato prendiamo in esame il paradigma di programmazione ad eventi associandolo a TinyOS. Come abbiamo visto nel capitolo 2, dalla versione 2.1 in poi, TinyOS permette anche un modello programmazione a thread, attraverso apposite librerie. Quest’ultimo paradigma di programmazione, però verrà trattato nel paragrafo 3.3, in Contiki. In TinyOS, un evento viene gestito da una breve sequenza di istruzioni che compie solo le attività più elementari e semplici. L'elaborazione effettiva, degli eventuali dati acquisiti, viene gestita separatamente e disaccoppiata dalla routine dell’evento. Di conseguenza, questo modello di programmazione basato su eventi crea due diversi contesti: uno per gli eventi, time-critical, e uno per i normali flussi di istruzioni. C’è da dire, che nel caso di applicazioni di dimensioni maggiori, i programmatori possono trovare tale metodologia di programmazione più complicata, rispetto ad un approccio tradizionale, basato su stack e switching del contesto di esecuzione. 19 Le applicazioni in TinyOS vengono scritte in nesC, linguaggio di programmazione molto simile al C e adatto per gestire i problemi derivanti dai requisiti stringenti delle applicazioni su reti di sensori senza filo. Questo linguaggio presenta alcune restrizioni quali la gestione della memoria statica, l’assenza di puntatori a funzione e di ricorsione. Al tempo stesso però permette una stesura dei programmi con una strutturazione a componenti, con un modello di programmazione ad eventi e la cui concorrenza è basata su task ed eventi. NesC implementa un sottoinsieme dei costrutti del linguaggio C, allo scopo di limitarne la potenza espressiva alle sole parti che realmente interessano, definendo vari nuovi comandi, orientati a strutturare le applicazioni, eliminando la necessita di usare un linker dinamico a tempo di esecuzione. Questo permette al compilatore, il NesCC, che si basa sul GCC della GNU, di conoscere esattamente tutti i componenti in uso in una determinata applicazione, come anche l'occupazione di memoria, producendo il relativo codice oggetto, linkato staticamente con le sole parti richieste del kernel, in modo da avere un codice flessibile e modulare, il tutto quanto più possibile ottimizzato in termini di occupazione di memoria. Grazie all’architettura modulare di TinyOS, una tipica applicazione può essere implementata assemblando tra loro vari componenti. Per questo motivo, la programmazione in TinyOS viene detta anche component-based. In TinyOS, il programmatore ha l’arduo compito di rendere il codice per la gestione degli eventi, quanto più semplice e breve possibile, in modo da ridurre al minimo i tempi di risposta. L’unità software fondamentale di un programma scritto in TinyOS è il componente. Solo attraverso le interfacce è possibile accedere ad un componente. L’interfaccia definisce i comandi e i gestori degli eventi. I comandi definiscono i servizi offerti da un determinato componente, mentre i gestori degli eventi notificano il verificarsi di un determinato evento. Esistono due tipi di componenti: i moduli e quelli di configurazione. I moduli implementano i comandi e i gestori degli eventi. I componenti di configurazione invece sono delle unità software che assemblano componenti già esistenti, per crearne nuovi più complessi. 20 Come supporto per il programmatore, TinyOS include una libreria di componenti progettati per svolgere le più classiche operazioni sulle reti di sensori senza filo. Per questo motivo, lo sviluppo di un'applicazione, nei casi più semplici, può consistere nel solo collegamento dei componenti di libreria necessari. Nei casi più complessi invece, bisognerà scrivere i componenti aggiuntivi ed i loro collegamenti con il kernel e con le periferiche. Vediamo a questo punto alcuni frammenti di codice, utili per comprendere appieno la programmazione in TinyOS. 3.1.1 La sintassi in TinyOS NesC per gestire i comandi e gli eventi usa le seguenti parole chiave: command, event, call, signal, return. Con type, indica il tipo della variabile. Un comando deve essere associato ad un’interfaccia, la sintassi è la seguente: command type my_interface.my_command (type variabile,...) { // Qui si inserisce il codice che costituisce il comando return(stato); } La chiamata di un comando non può avvenire all’interno del componente che lo implementa, ma deve venire tramite dall'apposita interfaccia: call my_interface.my_command (variabile,...); La chiamata in seguito all’esecuzione del codice fornisce lo stato risultante. Anche un evento deve essere connesso ad un’interfaccia, la sintassi è la seguente: event type my_interface.my_event (type variabile,...) { // codice per la gestione dell'evento return(stato); } Come per i comandi, anche la chiamata di eventi deve essere effettuata attraverso un’apposita interfaccia. Si usa la seguente sintassi: Signal my_interface.my_event (variabili,...); 21 All'interno di un componente, potrebbe presentarsi la necessità di invocare una funzione, oppure definire come eseguire una porzione di codice. In questi casi esistono le funzioni e i task. Le sintassi per gestire una funzione è la seguente: type my_function (type variabile) { // Qui si inserisce il codice della funzione } Per chiamare una funzione basta la seguente sintassi: my_function (variabile,...); La sintassi per gestire i task è la seguente: Task void my_task () { // Codice del task } Per fare in modo che il sistema operativo esegua un task prima possibile, si utilizza la seguente sintassi: Post my_task (); 3.1.2 Esempio: PowerUP L’esempio di codice che segue, accende il led della piattaforma dopo la fase di avvio della stessa. E’ il classico codice utilizzato per testare l’ambiente di sviluppo. L’applicazione è formata da due moduli: PowerupC che realizza la logica e PowerupAppC che collega PowerupC con i componenti di TinyOS necessari. module PowerupC { uses interface Boot; uses interface Leds; } 22 implementation { event void Boot.booted() { call Leds.led0On(); } } Vengono utilizzate le interfacce Boot e Leds: interface Boot { event void booted(); //Implementa il gestore degli eventi booted richiesto da Boot } interface Leds { command void led0On(); //Accende il led 0 invocando il comando led0On di Leds command void led0Off(); } Infine viene assemblata l’applicazione usando i componenti predefiniti MainC e LedsC: configuration PowerupAppC{ } implementation { components MainC, PowerupC, LedsC; MainC.Boot <- PowerupC; // Assemblaggio dei componenti PowerupC -> LedsC.Leds; } TinyOS possiede un sistema di compilazione basato su Makefiles. Nel caso dell’esempio risulta: COMPONENT=PowerupAppC include $(MAKERULES) Per compilare un programma basta usare il comando: make <platform> 23 Il risultato della compilazione sarà un file binario che include TinyOS e tutti i componenti dell’applicazione. Infine è importante dare alcune note sull’ambiente di sviluppo. Applicazioni per TinyOS possono essere sviluppate sotto Linux e Windows, attraverso Cygwin[33]. Per i sistemi Mac OS invece esistono dei port. Tutto il necessario e maggiori chiarimenti sono presenti sul sito[13]. Inoltre molto interessante e utile per il programmatore è il tool NesDoc che permette di visualizzare, attraverso un documento ipertestuale, una rappresentazione grafica dei collegamenti tra i vari componenti e accedere al componente specifico, così da comprendere le interfacce che offre, le funzioni e le variabili implementate. 3.2 Waspmote programming model L'architettura del Waspmote[15] si basa sul microcontrollore Atmel ATMEGA 1281. Quest’unità di elaborazione, prima di eseguire la prima istruzione del codice sviluppato dal programmatore, e caricato in memoria, avvia l'esecuzione del bootloader. Tale fase consiste in una serie di primitive che eseguono operazioni di inizializzazione, tra cui, caricare in memoria librerie, header file, inizializzare i registri, periferiche.., in modo da permettere l'esecuzione del programma caricato in memoria. La fase di bootloader dura circa 62.5ms, se un nuovo programma da eseguire viene inviato in memoria durante questo intervallo di tempo, verrà eseguito, sostituendosi al codice presente in precedenza. I programmi per Waspmote vengono scritti in C, seguono un paradigma di programmazione ad eventi, o event-driver, estremamente semplificato rispetto a quello utilizzato in TinyOS. Infatti, esiste un’unica funzione, che attraverso un loop gestisce gli eventi; non ci sono altri event hendlers e dispatcher e non esiste una vera e propria coda degli eventi. Il codice di un programma per Waspmote si suddivide in due parti, o procedure: setup( ) e loop( ). L’esecuzione è di tipo sequenziale all’interno di queste funzioni. 24 Nel file “.pde”, estensione di un programma per Waspmote, setup( ), ha lo scopo di configurare la piattaforma hardware. Il suo codice viene eseguito solo una volta dopo la fase di bootloader (e ogni volta che il Waspmote viene resettato). In questa procedura vengono inizializzati i moduli del Waspmote che si vogliono utilizzare. Terminata la parte di setup( ), viene eseguita la seconda parte del programma, che consiste in un ciclo infinito loop( ). Nella seconda parte del codice del programma, vengono effettuate le operazioni di misura, l’invio delle informazioni, vengono gestite eventuali interruzioni ed infine, per il risparmio energetico, lo stato attivo/sleep/hibernate del Waspmote. Uno schema generale di codice per Waspmote è il seguente[15]: // 1. Include Libraries // 2. Definitions // 3. Global variables declaration void setup( ) { // 4. Modules initialization } void loop( ) { // 5. Measure // 6. Send information // (7. Routine of interrupt) // 8. Set sleep mode } Una tecnica di programmazione comune per il risparmio energetico è quella basata sul blocco dell’esecuzione del programma, mandando il dispositivo in sleep mode oppure in hibernate mode, fino a quando non si verifica un determinato evento. Attraverso le interruzioni e, assegnando ad esempio un flag ad un particolare evento, si possono ottenere notevoli risparmi energetici. Quando Waspmote viene ripristinato, l’esecuzione ricomincia a partire dalla funzione loop ( ). 25 La programmazione può essere effettuata in locale, attraverso un collegamento al PC via USB o seriale, oppure tramite OTAP 15. Quest’ultimo metodo di programmazione, con i nuovi concetti di reti di sensori wireless, può risultare fondamentale. Da qualche anno l’OTAP si può effettuare, oltre che attraverso le tecnologie di telefonia mobile come 3G e GPRS, anche attraverso protocolli come: WiFi/FTP e 802.15.4/ ZigBee. Nella programmazione dei Waspmote, suddivisa in parti, presentata in precedenza, si concentra tutta la filosofia di sviluppo delle applicazioni per questi motes. L’idea che c’è alla base è di non cercare di scrivere codici, abilitando tutte le funzionalità fin dall'inizio, ma sfruttare il motto "Keep it simple!". In poche parole rendere i codici più semplici possibili, attraverso l’utilizzo solo delle funzionalità strettamente utili. Qualsiasi sia il progetto da sviluppare, la suddivisione del codice in parti, permette allo sviluppatore, passo dopo passo di arricchire sempre più il programma, scegliendo quali funzionalità sono necessarie e quali no. In questo modo, anche la fase di test dell’applicazione scritta, risulterà più semplice. 3.2.1 Ambiente di sviluppo Libelium fornisce librerie API, compilatore e numerosi strumenti come un IDE opensource, in modo tale da rendere la programmazione dei motes molto semplice. Waspmote Pro IDE è l’ambiente di sviluppo integrato (IDE) per i Waspmote di casa Libelium. Il Waspmote Pro IDE deriva dall’IDE di Arduino, ha infatti le stesse caratteristiche e funzionalità e una veste grafica molto simile. Come tutti gli IDE, possiede tutta una serie di funzionalità: permettere la stesura del codice sorgente, attraverso un editor di testo dotato di alcune particolarità, come il syntax highlighting, il controllo delle parentesi, e l'indentazione automatica. E’ in grado di compilare, caricare il codice eseguibile all’interno del Waspmote, visualizzare i risultati frutto del programma sviluppato, monitorare l’uscita seriale ed effettuare il debug del codice. 15 Over The Air Programming 26 3.2.2 Esempio: lettura dall’accelerometro Il seguente esempio mostra il codice dell’applicazione che permette di effettuare le letture dei valori dall’accelerometro triassiale presente on-board. void setup() { ACC.ON(); // Attivazione l’accelerometro USB.ON(); // Attivazione della comunicazione USB USB.println(F("Lettura Accelerazioni")); } void loop() { // Controllo per verificare il corretto funzionamento dell’accelerometro // in caso di esito positivo deve restituire 0x32 come valore byte check = ACC.check(); //Lettura del valore lungo l’asse x int x_acc = ACC.getX(); //Lettura del valore lungo l’asse y int y_acc = ACC.getY(); //Lettura del valore lungo l’asse z int z_acc = ACC.getZ(); USB.print(F("\n------------------------------\nCheck: 0x")); USB.println(check, HEX); //Stampa del registro USB.println(F("\n \t0X\t0Y\t0Z")); //per il check USB.print(F(" ACC\t")); USB.print(x_acc, DEC); //Stampa in decimale (OUTPUT) USB.print(F("\t")); // per ogni asse USB.print(y_acc, DEC); USB.print(F("\t")); USB.println(z_acc, DEC); delay(1000); } Esempio di output: Lettura Accelerazioni ----------------------------Check: 0x32 0X 0Y 0Z ACC -14 4 988 27 3.3 La programmazione in Contiki Un altro modello di programmazione, sicuramente più articolato di quello dei Waspmote, è quello basato sui protothread[30] in Contiki. Inizialmente i modelli di programmazione thread-driven, sono stati messi da parte nello sviluppo di applicazioni su reti di sensori senza filo, a causa delle risorse estremamente limitate delle piattaforme hardware esistenti in passato. In seguito però questa scelta è stata contestata e sono state sviluppate, non solo in Contiki, ma anche in LiteOS[31], Mentis[32], applicazioni basate su tale modello di programmazione. Un protothread è un'astrazione che permette una programmazione efficiente per la memoria e più semplice per il programmatore, il quale è in grado di ragionare più facilmente sull’esecuzione sequenziale dei programmi. Come già trattato nel paragrafo 2.2, Contiki presenta un kernel ad eventi, sul quale le applicazioni, scritte nel linguaggio di programmazione C, vengono caricate e scaricate dinamicamente a run-time. La CPU del dispositivo viene rilasciata dal processo solo quando termina o si blocca in attesa di un evento. Il vantaggio principale dei protothread è il loro basso overhead sul sistema. Essi non hanno uno stack, bensì lavorano su variabili globali, in questo modo occupano pochissimo spazio in memoria e non sovraccaricano la CPU del mote con le operazioni di context-switch. In risposta a un evento interno o esterno, il kernel richiama il thread “leggero” associato al particolare evento del processo in esecuzione. In questo modo è garantita la risposta in tempo reale del sistema. Esempi di eventi interni possono essere i timer. Eventi esterni sono i sensori che raccolgono dati oppure i pacchetti in arrivo da motes vicini. Esistono diverse primitive utilizzate per la programmazione di applicazioni in Contiki, primitive per la gestione dei processi, protothread, timer, connessioni e multithreading. Per brevità, riporterò solo alcune primitive circa i protothread, rimandando il lettore alla documentazione ufficiale per le ulteriori primitive [26]. 28 PT_INIT(pt) //Inizializza un protothread. PT_THREAD(name_args) // Utilizzata per dichiarare un protothread PT_BEGIN(pt) // Inizio/Fine del corpo di un protothread / PT_END(pt) PT_WAIT_UNTIL(pt, condition) //Blocca l'esecuzione del protothread PT_WAIT_THREAD(pt, thread) //Blocca l'esecuzione del protothread in attesa della conclusione del thread indicato come parametro. PT_RESTART(pt) // Blocca l'esecuzione del protothread e lo reinizializza PT_EXIT(pt) // Termina l'esecuzione di un protothread. PT_SCHEDULE(f) // Invoca l'esecuzione del thread passato come parametro PT_YIELD(pt) // Sospende l'esecuzione dando modo ad altri di eseguire PT_YIELD_UNTIL(pt, cond)//Sospende fino a quando la condizione non diviene vera 3.3.1 Struttura base di un programma Un'applicazione in Contiki si sviluppa definendo anzitutto un processo. La struttura base di un programma è la seguente: #include "contiki.h" //Deve essere incluso #include "process.h" PROCESS(Esempio, "Esempio di processo"); AUTOSTART_PROCESSES(&Esempio); // Definizione del processo // Avvio PROCESS_THREAD(Esempio, ev, data) { PROCESS_BEGIN( ); // Inizio del processo while(1){ PROCESS_WAIT_EVENT ( ); // Si attende l’evento // Quì si scrive l’applicazione } PROCESS_END( ); } Infine il Makefile, si definisce attraverso la seguente sintassi: CONTIKI = ../.. // In base alla posizione del progetto all: app-name include $(CONTIKI)/Makefile.include 29 Conclusioni Il lavoro di analisi svolto per questo elaborato mette in evidenzia che, dal punto di vista hardware, l'evoluzione tecnologica consentirà lo sviluppo di microcontrollori sempre più piccoli, efficienti e performanti, come si è potuto notare osservando le piattaforme presentate nel capitolo 1, in particolare il Lotus Cortex e il Waspmote. Da una prospettiva software, l’estrema semplicità della programmazione delle nuove piattaforme per reti di sensori senza filo, abbiamo visto in particolare i Waspmote, il gran numero di librerie API, tool di sviluppo, nella maggior parte dei casi opensource, le comunità di supporto, costituite da accademici, professionisti e semplici appassionati, i sistemi operativi, sempre più ricchi di funzionalità, permettono una stesura dei programmi applicativi semplificata, efficace e sempre più innovativa, con la conseguente possibilità di utilizzare tale tecnologia, in numero crescente di contesti reali. E’ facile immaginare che in un prossimo futuro sarà necessaria l'adozione di nuovi standard e tecniche di programmazione per sviluppare applicazioni sempre più complete e sofisticate, per gestire meglio la comunicazione tra sensori e sviluppare sistemi di service discovery, per creare interazioni tra nodi appartenenti a reti diverse, in modo da implementare impianti costituiti da più reti di sensori senza filo che lavorano insieme. 30 Bibliografia [1] http://robotics.eecs.berkeley.edu/~pister/SmartDust/ [2] C. Buratti, A. Conti, D. Dardari, and R. Verdone, “An overview on wireless sensor networks technology and evolution,” Sensors, vol. 9, no. 9, pp. 6869–6896, 2009. [Online]. Available: http://www.mdpi.com/1424-8220/9/9/6869 [3] http://www.ece.cmu.edu/firefly/ [4] http://www.zigbee.org/ [5] A. Kansal and M.B. Srivastava, “An Environmental Energy Harvesting Framework for Sensor Networks”. In Proceedings of the International Symposium on Low Power Electronics and Design (ISLPED), Seoul, Korea, August 2003. [6] Crossbow Technology Inc. web site, http://www.moog-crossbow.com/ [7] Moteiv Corporation web site, http://www.moteiv.com. [8] “RealTime Wireless Sensor Network Platforms”, 2007, http://www.ece.cmu.edu/firefly/ [9] “BTnodes A Distributed Environment for Prototyping Ad Hoc Networks”, http://www.btnode.ethz.ch/ 2007, [10] Memsic web site: http://www.memsic.com/wireless-sensor-networks/ [11] http://www.ti.com/ [12] http://www.arm.com/ [13] http://www.tinyos.net/ [14] http://www.zurich.ibm.com/moterunner/ [15] http://www.libelium.com [16] Riccardo Crepaldi. “Algoritmi di localizzazione per reti di sensori: progettazione e realizzazione di una piattaforma sperimentale”. PhD thesis, Università degli Studi di Padova Dipartimento di Ingegneria dell’Informazione, 2006. [17] A. Bonivento, C. Fischione, A. Sangiovanni-Vincentelli, F. Graziosi, and F. Santucci. Seran: “A semi random protocol solution for clustered wireless sensor networks”. In Proc. of MASS, Washington D.C., November 2005. [18] D. Culler, D. Estrin, and M. Srivastava. “Overview of sensor networks”. IEEE Computer, 37(8):41_49, August 2004. [19] D. Snoonian. Smart buildings. IEEE Spectrum, pages 18_23, 2003. 31 [20] Jennifer Yick, Biswanath Mukherjee, Dipak Ghosal . “Wireless sensor network survey” Department of Computer Science, University of California, Davis, CA 95616, United States. April 2008. Computer Networks 52 (2008) 2292–2330www.elsevier.com/locate/comnet [21] D. Gay, P. Levis, D. Culler “Software Design Patterns for TinyOS”, reperibile su www.tinyOS.net. [22] D. Gay, P. Levis, D. Culler and other “The nesC Language: A Holistic Approach to Networked Embedded Systems”, sito www.tinyOS.net [23] A. Zanella, M.Zorzi “Reti di sensori: dalla teoria alla pratica”, Notiziario Tecnico Telecom Italia, Anno 15 n. 1 Giugno 2006. [24] D. Gay, P. Levis, R. von Behren, M.Welsh, E. Brewer, and D. Culler. “The nesC language: A holistic approach to networked embedded systems”. In Proceedings of Programming Language Design and Implementation (PLDI). 2003. [25] Adam Dunkels, Bj Granvall, and Thiemo Voigt. “Contiki - a lightweight and flexible operating system for tiny networked sensors”. Local Computer Networks, Annual IEEE Conference on. 2004. [26] Contiki OS. http://www.contiki-os.org/ [27] Contiki Community. http://www.contiki-os.org/community.html [28] Nano-RK OS. www.nanork.org [29] A. Eswaran, A. Rowe and R. Rajkumar, "Nano-RK: An Energy-Aware Resource-Centric Operating System for Sensor Networks," IEEE Real-Time Systems Symposium, December 2005. [30] A. Dunkels, O. Schmidt, T. Voigt, and M. Ali, “Protothreads: Simplifying Event-Driven Programming of Memory-Constrained Embedded Systems”, Proc. ACM SenSys, Boulder, CO, USA, Nov 2006. [31] Cao, Q., Abdelzaher, T., Stankovic, J., He, T.: “The LiteOS Operating System: Towards UnixLike Abstractions for Wireless Sensor Networks”. Proceedings of the International Conference on Information Processing in Sensor Networks (IPSN) pp. 233–244 (2008) [32] Bhatti, S., Carlson, J., Dai, H., Deng, J., Rose, J., Sheth, A., Shucker, B., Gruenwald, C., Torgerson, A., Han, R.: MANTIS OS : “An Embedded Multithreaded Operating System for Wireless Micro Sensor Platforms”. In: ACM/Kluwer Mobile Networks & Applications (MONET), Special Issue on Wireless Sensor Networks, August. Secaucus, NJ, USA (2005) [33] Cywin web site: https://www.cygwin.com [34] Atmel web site: www.atmel.com 32
Documenti analoghi
Realizzazione di un servizio WSN su sistema Energy Scavenger
per l’alimentazione di moduli embedded. I circuiti e le tecniche di recupero e conversione
sono diverse e dipendono dalla fonte da cui vogliamo attingere energia (solare, cinetica,
termica…) e dal ...