Arhitektura bežičnog senzorskog čvora Mario Čagalj mcagalj@fesb.hr FESB Based on: Protocols and Architectures for Wireless Sensor Networks, H. Karl and A. Willig Introduction to Wireless Sensor Networks. Anna Förster Fundamentals of Wireless Sensor Networks. W. Dargie and C. Poellabauer
Pregled predavanja Struktura bežičnog senzorskog čvora Mikrokontroler, radio modem, osjetila (senzori), baterije Paspodjela potrošnje energije osnovnih komponenti senzorskog čvora Osnovni modovi rada senzorskog čvora i dizajn protokola za čvorove sa ograničenom količinom energije za napajanje Operacijski sustavi za senzorske čvorove
Bežična senzorska mreža Fundamentals of Wireless Sensor Networks. W. Dargie and C. Poellabauer Sensor network 2 Sensor network 1 Analysis Storage Mining Processing Internet
Arhitektura bežičnog senzorskog čvora Osnovne komponente Kontroler: malo računalo, uključuje procesor, nešto memorije, I/O portove (na koje se mogu spajati vanjski uređaji, radio, osjetila) Radio primopredajnik/modem: omogućuje razmjenu podataka (pretvara čvor u mrežni uređaj) Detektori i/ili aktuatori: sučelje prema okruženju u kojem se čvor nalazi (senzorska osjetila) Eksterna memorija: očitanja senzora - npr. Secure Digital (SD) kartice Napajanje: baterija Eksterna memorija Radio modem + kontroler SPI SPI, I2C, ili GPIO Detektori/ Aktuatori Kontroler Napajanje
Kontroleri Neke opcije za kontrolere Microkontroleri – procesori za generalne svrhe, optimizirani za rad sa malim kompaktinim aplikacijama, mala potrošnja DSPs (Digital Signal Processors) – optimizirani za obradu specifičnih signala (ne koriste se jer obrade senzorskih podataka nisu zahtjevne) FPGAs (Field-Programmable Gate Arrays) ASICs (Application-Specific Integrated Circuits) Nisu fleksibilni, mogu se koristiti za postizanje ekstremnih performansi Npr. specijalizirani procesori za usmjernike (router) i preklopnike (switch) Primjeri mikrokontrolera (na Arduino platformama) Atmel ATmega328: 8-bitni, 32KB flash memorije, 2KB RAM-a, 1KB EEPROM, SPI i I2C sučelja, 20 I/O pinova, brzina 16MHz Atmel ATmega168: 8-bitni, 16KB flash memorije, 1KB RAM-a, 512B EEPROM, SPI i I2C sučelja, 20 I/O pinova, brzina 8MHz
Mikrokontroleri: interna memorija RAM Radna memorija za privremenu pohranu podataka Gubitkom napajanja podaci se gube Ovdje se alocira memorija za vaše varijable, nizove (array), stringove Ovdje se također kreira stog (stack) potreban za funkcijske pozive ROM, EPROM, EEPROM, flash memorija Za trajnu pohranu jednostavnog programskog koda (vašeg programa) Sadržaj memorije ostaje sačuvan čak i nakon gubitka napajanja Primjer: Arduino platforma (Uno vs Mini) ATmega328P: 32KB flash, 2KB SRAM, 1KB EEPROM ATmega168: 16KB flash, 1KB SRAM, 512B EEPROM
Arhitektura bežičnog senzorskog čvora Osnovne komponente Kontroler: malo računalo, uključuje procesor, nešto memorije, I/O portove (na koje se mogu spajati vanjski uređaji, radio, osjetila) Radio primopredajnik/modem: omogućuje razmjenu podataka (pretvara čvor u mrežni uređaj) Detektori i/ili aktuatori: sučelje prema okruženju u kojem se čvor nalazi (senzorska osjetila) Eksterna memorija: očitanja senzora - npr. Secure Digital (SD) kartice Napajanje: baterija Eksterna memorija Radio modem + kontroler SPI SPI, I2C, ili GPIO Detektori/ Aktuatori Kontroler Napajanje
Radio primopredajnik/modem/transceiver Omogućava slanje i primanje podataka Radio primopredajnik emitira niz bitova kao radio val Također prima radio val i konvertira ga nazad u niz bitova Obično radi u half-duplex načinu rada (šalje ili prima) Istovremena emisija i prijem radio signala nije praktična Često ima integriran mikrokontroler Omogućava privremenu pohranu primljene poruke (buffering) Omogućava privremenu pohranu poruke za slanje Omogućava provjeru ispravnosti primljenih poruka/paketa Omogućava implementaciju MAC protokola (npr. IEEE 802.15.4) Radio modem generalno je najveći potrošač energije
Odabir radio primopredajnika Odabir ovisi o mogućnostima primopredajnika Usluge za više razine komunikacijskog modela Prijemnik prosljeđuje mikorkontroleru podatke u obliku paketa Alternativno, prijemnik prosljeđuje samo niz byte-ova ili bitova Podržan frekvencijski spektar Tipično u području 433MHz – 2.4GHz Industry, Scientific and Medical (ISM) frekvencijski pojas Podrška za komunikaciju preko više kanala Izbjegavanje interferencije Podržana brzina prijenosa podataka Komunikacijski domet (od nekoliko metara do nekoliko km)
Odabir radio primopredajnika Odabir ovisi o mogućnostima primopredajnika Podržane modulacije (ASK, FSK, PSK, spread spectrum, ...) Osjetljivost prijemnika Minimalna snaga signala na prijemniku da bi se postigla zadovoljavajuće niska razina grešaka u prijemu Carrier sensing i RSSI (Received Signal Strength Indication) Kod mnogih modernih bežičnih mreža, detekcija zauzeća kanala (drugi čvor koristi kanal) kritična je informacija RSSI omogućuje grubu procjenu udaljenosti transmitera Mogućnost kontrole snage s kojom se transmitira signal Potrošnja pri prijemu i slanju Potrošnja pri promjeni stanja primopredajnika Npr., prijem -> predaja i predaja -> prijem
Moguća stanja primopredajnika Radio modem generalno je najveći potrošač energije Ograničavanjem njegove aktivnosti značajno produžujemo životni vijek/trajanje baterijski napajanog senzorskog čvora Primopredajnici mogu biti u različitim radnim stanjima Stanje slanja (transmit) Stanje primanja (receive) Stanje mirovanja (idle): spreman za prijem ili slanje Stanje potpunog mirovanja (sleep): najveći dio hardverskih komponenti primopredajnika su isključene U ovom stanju primopredajnik nije u mogućnosti primiti signal Vrijeme opravka (recovery time) i energija potrebno za napuštanje ovog stanja može biti značajna
Arhitektura bežičnog senzorskog čvora Osnovne komponente Kontroler: malo računalo, uključuje procesor, nešto memorije, I/O portove (na koje se mogu spajati vanjski uređaji, radio, osjetila) Radio primopredajnik/modem: omogućuje razmjenu podataka (pretvara čvor u mrežni uređaj) Detektori i/ili aktuatori: sučelje prema okruženju u kojem se čvor nalazi (senzorska osjetila) Eksterna memorija: očitanja senzora - npr. Secure Digital (SD) kartice Napajanje: baterija Eksterna memorija Radio modem + kontroler SPI SPI, I2C, ili GPIO Detektori/ Aktuatori Kontroler Napajanje
Detektori/osjetila/senzori Osnovne kategorije Pasivni i aktivni senzori (ovisno o tome emitiraju li nekakv signal) Pokrivaju sve smjerove ili samo uži smjer? Pasivni i omnidirekcionalni detektori Detektori svijetla, termometri, mikrofoni, detektori vlažnosti Pasivni detektori koji pokrivaju usko područje: npr. kamera Aktivni detektori: radar - ultrazvučni ili radio Važan parametar: područje pokrivenosti (coverage) Koliko kvalitetno i adekvatno dani detektor pokriva određeno područje od interesa? Coverage problem: koliko detektora osigurava adekvatnu pokrivenost nadziranog područja? Pouzdanost detektora (može ovisiti o razini napajanja)
Arhitektura bežičnog senzorskog čvora Osnovne komponente Kontroler: malo računalo, uključuje procesor, nešto memorije, I/O portove (na koje se mogu spajati vanjski uređaji, radio, osjetila) Radio primopredajnik/modem: omogućuje razmjenu podataka (pretvara čvor u mrežni uređaj) Detektori i/ili aktuatori: sučelje prema okruženju u kojem se čvor nalazi (senzorska osjetila) Eksterna memorija: očitanja senzora - npr. Secure Digital (SD) kartice Napajanje: baterija Eksterna memorija Radio modem + kontroler SPI SPI, I2C, ili GPIO Detektori/ Aktuatori Kontroler Napajanje
Napajanje bežičnih senzorskih čvorova Neke opcije Primarne baterije – ne mogu se puniti Sekundarne baterije – mogu se puniti, ali je potrebna podrška za punjenjem iz okruženja (energy harvesting) Zahtjevi koji se postavljaju na baterije Visok kapacitet uz mali volument/cijenu/težinu (J/cm3) Visok kapacitet pod (dinamičkim) opterećenjem Visoka stabilnost napona Self-discharge mora biti nizak (baterije se prazne čak i ako se ne koriste, ako nisu pod opterećenjem) Primarne baterije imaju manji self-discharge od punjivih
Napajanje bežičnih senzorskih čvorova U teoriji baterija treba osigurati konstantan napon (npr., nominalni napon od 3.3V ili 5V) U praksi, napon opada sa stupnjem ispražnjenosti Potencijalan problem je što detektori na čvoru, radio modem, pa i sam mikrokontroler, mogu i dalje raditi na nižem naponu, ali ne više pouzdano (pogrešna očitanja, resetiranje, modem može slati ali ne i primati, ...) Cell voltage (V) Percent of capacity discharged 3.0 2.0 1.0 20 40 60 80 100
Prikupljanje energije iz okruženja Energy harvesting Kako napuniti bateriju? Laptop: vrlo jednostavno, spoji se na električnu mrežu Senzorski čvor: pokušaj prikupiti energiju iz okruženja Mogući izvori energije u okruženju Svjetlo Elektromagnetski valovi Temperaturna razlika Promjena pritiska (piezo-electric) – npr. u peti cipele Protok zraka ili tekućine, vibracije MEMS (Micro-Electro-Mechanical Systems)
Napajanje i upravljanje potrošnjom Racionalnim upravljanjem raspoloživom energijom možemo osigurati dugotrajan rad senzorskog čvora Popularna strategija upravljanja je dynamic power management (DPM) DPM propisuje da se komponenti senzorskog čvora osigura minimalna snaga potrebna za izvršavanje njene zadaće Npr., kada komponenta nema zadaća za odraditi može je staviti u sleep stanje (praktički, privremeno ugasiti) DPM se može primjeniti i na cijelu mrežu čvorova (potpuno isključivati čvorove koji nemaju zadaća za odraditi) Pri tome je velik izazov međusobno koordinirati senzorske čvorove i osigurati pouzdan protok i razmjenu informacija Kasnije u nastavku ćemo detaljno razraditi potencijalnu DPM stategiju za našu senzorsku mrežu
Arhitektura bežičnog senzorskog čvora Osnovne komponente Kontroler: malo računalo, uključuje procesor, nešto memorije, I/O portove (na koje se mogu spajati vanjski uređaji, radio, osjetila) Radio primopredajnik/modem: omogućuje razmjenu podataka (pretvara čvor u mrežni uređaj) Detektori i/ili aktuatori: sučelje prema okruženju u kojem se čvor nalazi (senzorska osjetila) Eksterna memorija: očitanja senzora - npr. Secure Digital (SD) kartice Napajanje: baterija Eksterna memorija Radio modem + kontroler SPI SPI, I2C, ili GPIO Detektori/ Aktuatori Kontroler Napajanje
Komunikacijska sučelja SPI,I2C i GPIO Mikrokontroler s ostalim komponentama senzorskog čvora često komunicira korištenjem serijskih sučelja Serial Peripheral Interface (SPI): npr. radio modemi u našem labu Inter-Integrated Circuit (I2C): npr. temp. osjetila, akcelerometri Mikrokontroler često koristi i General Purpose Input/Output (GPIO) pinove za očitavanje analognih detektora/osjetila Npr., napon očitan na analognom pinu (Arduino UNO, između 0 i 5V) digitalizira se u vrijednost između 0 i 1023 u 10-bitnom analog-to-digital (A/D) konverteru
Serial Peripheral Interface (SPI) SPI omogućuje brzu full-duplex sinkronu komunikaciju preko kratkih udaljenosti SPI sučelje je razvila Motorola Definira dvije uloge: SPI Master i SPI Slave Definira 4 pina: Master-Out/Slave-In (MOSI) Master-In/Slave-Out (MISO) Serial Clock (SCLK) Chip Select (CS) or Slave Select (SS) Master koristi SCLK za slanje sinkronizacijskog takta Master preko SS pina poziva slave komponentu s kojom zeli komunicirati Tijekom svakog takta po jedan bit se prenese istovremeno u oba smjera U slučaju senzorskog čvora, mikrokontroler ima ulogu SPI master-a Source: Wikipedia
Serial Peripheral Interface (SPI) SPI podržava konfiguraciju s više SPI slave komponenti SPI master preko CS (SS) pina poziva SPI slave komponentu s kojom zeli komunicirati Zahtjeva više CS (SS) pinova u ovakvoj konfiguraciji; ne može korisiti isti pin za prozivanje različitih slave komponenti SPI omogućava bržu komunikaciju u odnosu na npr. I2C sučelje ali zahtjeva veći broj linija i pinova Source: Wikipedia
Inter-Integrated Circuit (I2C) Multi-master multi-slave half-duplex sinkrono serijsko sučelje I2C sučelje je razvio Philips Semiconductors Koristi samo dvije bi-direkcionalne linije (SPI koristi 4) Serial Clock (SCL): master generira sinkronizacijski takt Serial Data Line (SDA): podatkovna linija Master izražava interes za slanje ili primanje slanjem START signala i proziva slave komponentu putem jedinstvene (10-bitne) adrese Slave potvrđuje slanjem ACK, te šalje ili prima Primatelj šalje ACK nakon svakog primljenog byte-a Master prekida komunikaciju slanjem odgovarajućeg STOP signala Master Slave SDA SCL
Inter-Integrated Circuit (I2C) I2C sučelje omogućava jeftinije povezivanje perifernih komponenti na račun manje brzine razmjene podataka Koristi jedan ACK bit za svaki poslani byte Podaci u oba smjera idu istom linijom (half-duplex) Ali su zato potrebne samo dvije podatkovne linije Atmel npr. ovo podatkovno sučelje naziva two-wire interface (TWI) Master Slave SDA SCL
Q: Koje sučelje koriste prikazani senzori?
Upravljanje potrošnjom energije na senzorskom čvoru Based on: Protocols and Architectures for Wireless Sensor Networks, H. Karl and A. Willig Introduction to Wireless Sensor Networks. Anna Förster Fundamentals of Wireless Sensor Networks. W. Dargie and C. Poellabauer
Potrošnja energije senzorskih čvorova Glavni potrošači su mikrokontroler, radio primopredajnik a u manjoj mjeri memorija i osjetila/detektori (ovisno o tipu) Veličina senzorske mreže (potencijalno veliki broj čvorova) praktički onemogućava čestu zamjenu ili punjenje baterije Veličina senzorskog čvora također je ograničavajući faktor (ograničava veličinu a time i kapacitet baterije) Prestanak rada samo nekoliko senzorskih jedinica može uzrokovati fragmentaciju mreže i onemogućiti isporuku podataka
Dinamičko upravljanje potrošnjom Opservacija: u tipičnoj aplikaciji, seznorski čvor većinu vremena ne radi ništa Ukoliko čvor nema događaja koje treba obraditi (očitanje senzora, komunikacija, obrada podataka) možemo ga privremeno isključiti Tipični modovi rada mikrokontrolera: active, idle, sleep (power down) Radio primopredajnik: isključi/uključi Osjetilo: isključi/uključi Example: Sleep modes of ATmega328P microcontroller
Dinamičko upravljanje potrošnjom Example: Modes of nRF24L01+ 2.4GHz Transceiver
Dinamičko upravljanje potrošnjom Example: Modes of DHT22 hum and temp sensor Component Mode Current draw DHT22 Standby 50uA Sensing 1.5mA Off
Dinamičko upravljanje potrošnjom Izazovi Kada ući u odgovarajući power-save mod? U koji power-save mode? Kada izići iz danog power-save moda? Primjer: Sljedeće 2 sekunde nema zanimljivih događaja Pretpostavimo da dani mikronoktroler (μC) treba 2 procesorska ciklusa/takta za izvršavanje neke osnovne instrukcije U 2 sekunde, 16MHz μC izvrši oko 8x106 instrukcija (za 2 cycles/inst.) Iz perspektive μC-a, 2 sekunde jako su dug period U aktivnom modu, ATmega328P troši oko 20mA a u power down modu svega nekoliko μA: ΔCsave = ( 20mA-1μA ) x 2s ≈ 0.011mAh (kapacitet tipične 1.5V AAA baterije je 1200mAh)
Dinamičko upravljanje potrošnjom Nameće se sljedeća strategija odlaska u niži mod rada Prijeđi u niži mod rada kad god je to moguće Vrijeme/energija potrebna za prijelaz u normalan radni mod i obrnuto nisu zenemarivi Dodatne operacije/radnje nužne tijekom kojih nije moguće raditi korisne poslove - obrađivati podatke, primati, slati, detektirati (stabilizacija oscilatora, priprema procesora za rad i sl.) Što je “dublji san” tim je potrebno više energije za “buđenje” ili prijelaz u viši operacijski mod, odnosno odlazak u štedljiviji mod rada Prijelazi između različitih modova su ok ako vrijedi Esaved > Eoverhead
Dinamičko upravljanje potrošnjom State Powers Processor Sensors Radio modem S0 P0 Active On Transmitting S1 P1 Idle S2 P2 Receiving S3 P3 Sleep Receving S4 P4 Off S5 P5 P0 P1 time t1 Td,1 Tu,1 S0 S1 Pk Sk power Active/Idle/Sleep Activek Active Td,k Tu,k tevent Overheadk
Dinamičko upravljanje potrošnjom Prijelazi između različitih modova ok ako Esaved > Eoverhead Esaved,k = Eactive – Ek = E0 – Ek E0 = P0 (tevent – t1) Ek = Pk (tevent – t1) + Td,k (P0 - Pk)/2 Eoverhead,k = Tu,k (P0 + Pk)/2 power Active Active/Idle/Sleep Overheadk Active S0 P0 Esaved Eoverhead Sk Pk t1 tevent time Td,k Tu,k
Dinamičko upravljanje potrošnjom Prijelazi između različitih modova ok ako Esaved > Eoverhead Q. Pokažite da vrijedi sljedeće: Neka je ΔTk = ½ [Td,k + Tu,k (P0 + Pk)/(P0 - Pk)] (tevent – t1) > ΔTk ==> Esaved,k > Eoverhead,k power Active Active/Idle/Sleep Overheadk Active S0 P0 Esaved Eoverhead Sk Pk t1 tevent time Td,k Tu,k
Dinamičko upravljanje potrošnjom Prijelazi između različitih modova ok ako Esaved > Eoverhead Za P0 >> Pk (tevent – t1) > ½ (Td,k + Tu,k) ==> Esaved,k > Eoverhead,k power Active Active/Idle/Sleep Overheadk Active S0 P0 Esaved Eoverhead Sk Pk t1 tevent time Td,k Tu,k
Dinamičko upravljanje potrošnjom time t1 S0 Pk Sk power Sleepk tevent,1 Esaved Eoverhead t2 Si Idlei tevent,2 Pi Active
Dinamičko upravljanje potrošnjom Ograničenja i izazovi Tijekom perioda overhead (Tu,k) senzorski čvor ne može procesirati događaje (npr., gubitak paketa ako je radio bio isključen) Senzorski čvor treba predviđati vrijeme sljedećeg događaja da bi znao kada napraviti tranziciju u aktivni mod rada power Active Active/Idle/Sleep Overheadk Activek S0 P0 Esaved Eoverhead Sk Pk t1 tevent time Td,k Tu,k
Dinamičko upravljanje potrošnjom Izazovi Kada ući u odgovarajući power-save mod? Kada izići iz danog power-save moda? Example: Poisson-ova distribucija događaja
Štednja skaliranjem napona i frekvencije μC ATmega328: Maximum Frequency vs Vcc
Štednja skaliranjem napona i frekvencije μC ATmega328: Active Supply Current vs. Frequency Smanjivanjem napona napajanja μC-a značajno se smanjuje snaga potrebna za njegov rad – moguće značajne uštede
Štednja skaliranjem napona i frekvencije μC ATmega328: ΔCsave = 11mA ∙T1 – 2.5mA ∙T0.5 = 6mA ∙T1 Za T1 = 4s i 6 tasks/h, ušteda po satu: ΔCsave/h = 0.04mAh 1 time 0.5 normalized frequency 0.75 0.25 Task T1 T0.5
Štednja skaliranjem napona i frekvencije Smanjivanjem frekvencije rada μC iste zadaće izvršavaju se sporije – moguća prekoračenja rokova (deadline) 1 Task 1 Task 2 Task 3 0.75 normalized frequency 0.5 0.25 deadline time 1 0.75 normalized frequency 0.5 Task 1 Task 2 Task 3 0.25 deadline time
Dynamic Voltage/frequency Scaling (DVS) Kontinuirano adaptiraj frekveniciju/napon procesora sa svrhom pravovremenog izvršavanja zadaća time 0.5 normalized frequency 0.75 0.25 Task 1 deadline Task 3 Task 2 1 1
Duty Cycle Power Management δ = Tactive/T = Tactive/(Tactive + Tsleep) Prosječna potrošnja struje Iavg(TB) u ciljanom vremenu rada čvora TB (B – označava baterijsko napajanje) dana je sljedećim izrazom (Iactive i Isleep prosječne su potrošnje u active odnosno sleep modu): Iavg(TB) = δ ∙ Iactive + (1-δ) ∙ Isleep time Iactive supply current Isleep ••• T Tactive Tsleep TB
Duty Cycle Power Management Senzor se napaja putem baterije radnog kapaciteta C [mAh] Prosječna struja Iavg zadovoljava: Iavg(TB) ≤ C/TB Iz navedenog možemo izvesti sljedeće ograničenje na Iactive: Iactive(Tactive) ≤ 1/δ ∙ [C/TB - (1-δ) ∙ Isleep(Tsleep)] time Iactive supply current Isleep ••• T Tactive Tsleep TB
Duty Cycle Power Management
Duty Cycle Power Management Primjer: Baterija radnog kapaciteta C = 2000[mAh] (npr. koristimo baterije nominalnog kapaciteta 2500[mAh], ali uzmemo u obzir samopražnjenje) Pretpostavimo prosječnu potrošnju u sleep modu od Isleep = 50μA Za δ = 5% imamo ograničenje na Iactive < 5mA (nije dovoljno za rad čvora) Za δ < 1% imamo ograničenje na Iactive ≈ 25mA (potencijalno dovoljno) Interpretacija: δ = 1%, za T = 10min => Tactive/10min = 6sec Pažljivo planiranje očitavanja i obrade senzorskih podataka, te komunikacije time Iactive supply current Isleep ••• TB
Duty Cycle Power Management Iactive i Isleep su prosječne potrošnje u active odnosno sleep modu 40mA Transmitting 28mA Sensing Iactive 22mA 17mA supply current 10mA Processing 10mA Wake up Go sleep time Tactive time Iactive supply current Isleep ••• T Tactive Tsleep TB
Kompromis: procesiranje vs komunikacija Je li moguć kompromis između potrošnje energije uslijed lokalnog procesiranja podataka i potrošnje uslijed komunikacije? Primjer: μC ATmega328 na 8Mhz izvrši jednostavnu instrukciju za 125ns (pri tom ATmega328 troši oko 2mA (napon napajanja 2,7V)) Radio modem brzine slanja 265kbs treba oko 4μs za slanje 1 bita i pri tome troši npr. 16mA Iz navedenog možemo procjeniti da slanje 1000 bitova „košta” jednako energije kao izvršavanje 250,000 instrukcija (okviran izračun) Slijedi iz navedenog da je bolje što više procesirati bitove lokalno nego iste komunicirati (kad god je to moguće) Pristup u kojem preferiramo lokalnu obradu podataka u odnosu na komunikaciju raw očitanja nazivamo in-network processing Kompresija podataka, agregiranje podataka, ...
Operacijski sustavi i upravljanje zadaćama (task scheduling) Based on: Protocols and Architectures for Wireless Sensor Networks, H. Karl and A. Willig Introduction to Wireless Sensor Networks. Anna Förster Fundamentals of Wireless Sensor Networks. W. Dargie and C. Poellabauer
Operacijski sustavi kod WSN: izazovi Zadaća operacijskog sustava je kontrola i zaštita pristupa resursima računalnog sustava i upravljanje alokacijom tih resursa između različitih korisnika (procesa) Opcije za “male” bežične čvorove Čvorovi moraju biti lako programabilni Podrška za procese (ovisno o primjeni) Budući da senzorski čvor obično implementira jednu aplikaciju, da nema potrebe štititi je od drugom malicioznog softvera, te da aplikacija obično može direktno kontrolirati hardver zapravo nema potrebe za klasičnim operacijskim sustavom Umjesto cijelog operacijskog sustava, implementiraj (koristi) jednostavno run-time okruženje Ovo je dovoljno da bi se “skrili” detalji komunikacije sa harverom
Istovremena obrada više zadaća Concurrency: mogućnost istovremenog izvršavanja više zadaća (tasks) Procesor (jedna jezgra) može istovremeno izvršavati samo jednu zadaću (task, process, thread, program) OS stvara privid istovremenog izvršavanja više različitih procesa What actually happens time Task 1 Task 3 Task 2 time Task 1 Task 3 Task 2 What it feels like
Concurrency: tradicionalan pristup Klasični OS (Win, Linux, RTOS) dozvoljavaju istovremeno izvršavanje više procesa (ili threads) Bazirano na interuptima i context switching-u Context switching ima određeni overhead zbog promjene procesa koji se trenutno obrađuje (pohrana registara, program counter/instruction pointer i sl.) Kod bežičnih senzorskih čvorova Koncept jedan proces po jednoj zadaći potencijalno implicira veliki overhead Mnoge zadaće kod WSN relativno su jednostavne u odnosu na overhead koji unosi context switching (npr., LED on/off, readSensor, sendData) Handle sensor process Handle packet OS-mediated process switching
Istovremena obrada više zadaća Zašto je concurrency važan u kontekstu bežičnih senzora? Mikrokontroler na senzorskom čvoru mora obrađivati/posluživati zahtjeve radio modema, raznih osjetila na senzorskom čvoru, izvršavati odgovarajuću aplikaciju, izvršavati komunikacijski protokol ...
Istovremena obrada više zadaća Moguć pristup kod senzorskih čvorova: synchronous polling Poll sensor Process sensor data Poll transceiver Process a received packet
Synchronous polling // Task1: reading/processing sensor void handleSensor() { int sensorValue = analogRead(A0); processData(&sensorValue, sizeof(int)); } // Task2: communication void handleCommunication() { uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN]; uint8_t len = sizeof(buf) if (nrf24.waitAvailableTimeout(500)) { if (nrf24.recv(buf, &len)) { processReceived(buf, &len) // Super loop void loop() { handleSensor(); handleCommunication(); delay(1000); // do not use this in your code :)
Istovremena obrada više zadaća Moguć pristup kod senzorskih čvorova: synchronous polling Potencijalni problemi: Riskira se situacija u kojoj je moguće propustiti važne podatke (npr. od primopredajnika) kada je kontroler zauzet obradom podataka očitanih sa senzora Neke zadaće imaju veći prioritet Različite period izvršavanja zadaća Poll sensor Process sensor data Poll transceiver Process a received packet
Asynchronous polling Različite zadaće mogu imati različite periode izvršavanja long nextTask1 = 0; long nextTask2 = 0; long intervalTask1 = 2000; long intervalTask2 = 10000; unsigned long now; // Super loop void loop() { now = millis(); if (now > nextTask1) { nextTask1 = now + intervalTask1; handleTask_1(); } if (now > nextTask2) { nextTask2 = now + intervalTask2; handleTask_2(); // delay(1000); NOTE: we do not need this anymore
Asynchronous polling: challenge Realizirajte istovremeno blinkanje dviju LED-ica s periodom od T1=2s i T2=3s, s tim da blinkanje prve kreće s inicijalnim kašnjenjem od D1=0ms a druge s kašnjenjem od D2=500ms HINT: Zadaću blinkanja LED-ice razložite na 2 zadaće: LED_off() i LED_on() time 1 2 T1 T2 D2
Asynchronous polling: challenge void LED1_on(); void LED1_off(); void LED2_on(); void LED2_off(); int ON_DURATION = 250; unsigned long now = millis(); long LED1_on_next = now; long LED1_off_next = now + ON_DURATION; long LED2_on_next = now + 500; long LED2_off_next = now + 500 + ON_DURATION; long LED1_interval = 2000; long LED2_interval = 3000; void loop(){ now = millis(); if (now > LED1_on_next) { LED1_on_next = now + LED1_interval; LED1_on(); } if (now > LED1_off_next) { LED1_off_next = now + LED1_interval; LED1_off(); if (now > LED2_on_next) { LED2_on_next = now + LED2_interval; LED2_on(); if (now > LED2_off_next) { LED2_off_next = now + LED2_interval; LED2_off();
Real-time multitasking using task schedulers Istovremeno i pravovremeno (real-time) izvršavanje više zadaća u ugradbenim računalima često zahtjeva primjenu tzv. real-time operating system (RTOS) Primjer jako popularanog RTOS je FreeRTOS Dio OS-a odgovoran za odlučivanje o tome koja zadaća/proces/nit će se izvršti kada naziva se scheduler Karakteristika RTOS u odnosu na klasični OS je ta da scheduler kod RTOS-a osigurava predvidivo kašnjenje izvršavanja pojedine zadaće Na ovaj način moguće je garantirati da reakciju ugradbenog sustava na dani događaj bude unutar striktno definirane vremenske granice (real-time response) U okviru naših aktivnosti ograničiti ćemo se na primitivne real-time task schedulere Jednostavnost, mali overhead, mali memory footprint Tehnika asynchronous polling na tragu je takvog task schedulera
Real-time task schedulers Periodično ili jednokratno izvršava dane zadaće (operativno, task scheduler u osnovi periodično poziva odgovarajće C funkcije) Razlikujemo dvije osnovne kategorije: Co-operative scheduler: tekuća zadaća izvršava se bez prekidanja (do kraja) Pre-emptive scheduler: tekuću zadaću može privremeno prekinuti druga zadaća time Task 1 Task 2 time Task 1 Tas... Task 2 ...k 1
Real-time task schedulers Razlikujemo dvije osnovne kategorije: Co-operative scheduler: tekuća zadaća izvršava se bez prekidanja (do kraja) Pre-emptive scheduler: tekuću zadaću može privremeno prekinuti druga zadaća Izazovi kod pre-emptive schedulera Treba raditi context-switch Zadaća koja je prekinula tekuću zadaću može uzrokovati gubitak/prepisivanje podataka prekinute zadaće (critical section of code) time Task 1 Task 2 time Task 1 Tas... Task 2 ...k 1
Simple co-operative scheduler Baziran na scheduleru opisanom u knjizi Patterns for Time-Triggered Embedded Systems, Michael J. Pont Timer interrupt periodički ažurira scheduler Interrupt izvršava interrupt service routine (ISR) funkciju Unutar ISR poziva se funkcija za ažuriranje rasporeda Funkcija za ažuriranje označava zadaće spremne za izvršavanje Konačno, unutar loop() petlje specijalna funkcija poziva označene zadaće time Task 1 Task 2 Interrupts/ticks Current tick: mark any task for execution? No Current tick: mark any task for execution? Yes, Task 1 and Task 2 T1 T1
Simple co-operative scheduler Example: Timer interrupt može okidati i manjom brzinom (npr. 1 tick = 10ms) Periode zadaća izražavamo kao višekratnike trajanja jednog ticka time Task 1 Task 2 T1 T2 Interrupts/ticks
Simple co-operative scheduler Uz period izvršavanja za svaku zadaću, definiramo i kašnjenje Delay-om možemo osigurati da se dvije zadaće ne pozivaju u isto vrijeme Ovo je značajno u slučajevima kada vrijeme potrebno za izvršavanje prethodne zadaće varira (uzrokuje tzv. jitter sljedećoj zadaći) time 1 2 T1 T2 T1 Missed schedule 2 time 1 T1 T2 D2 Executed on time
Simple scheduler: adding a new task #define TASK_COUNT 8 typedef void (*fun_pointer)(); typedef struct { fun_pointer name; unsigned long period; unsigned long delay; uint8_t run; } SCHEDULER_task; bool SCHEDULER_add_task(fun_pointer name, unsigned long period, unsigned long delay); void SCHEDULER_init(); void SCHEDULER_update_tasks(); void SCHEDULER_tick(); bool SCHEDULER_add_task(fun_pointer name, unsigned long period, unsigned long delay) { uint8_t task = 0; while (task < TASK_COUNT) { if (!tasks[task].name) { tasks[task].name = name; tasks[task].period = period; tasks[task].delay = delay; tasks[task].run = 0; return true; } task++; return false;
Simple scheduler: initialize timer interrupt // Fire every 1ms static void TimerSet() { cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 249; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS11) | (1 << CS10); TIMSK1 |= (1 << OCIE1A); sei(); } void SCHEDULER_init() { TimerSet(); }
Simple scheduler: update/mark tasks // Called from the ISR every approx 1ms void SCHEDULER_update_tasks() { uint8_t task = 0; while (task < TASK_COUNT) { if (tasks[task].name) { // Timeout expired - run the task if (tasks[task].delay == 0) { tasks[task].run = 1; // If not a one-time task, schedule it to run again // (one-time tasks are deleted after being run) if (tasks[task].period) { tasks[task].delay = tasks[task].period; } // Task not ready to run - decrement the delay } else { tasks[task].delay--; task++;
Simple scheduler: run marked taskes // Called from the super loop void SCHEDULER_tick() { uint8_t task = 0; while (task < TASK_COUNT) { if (tasks[task].run) { tasks[task].name(); // Run the task tasks[task].run = 0; // Delete one-time tasks (tasks with period 0) if (tasks[task].period == 0) { SCHEDULER_delete_task(task); } task++;
Step 1: implement tasks void task_LED_ON() { digitalWrite(LED_BUILTIN, HIGH); Serial.println("LED ON"); } void task_LED_OFF() { digitalWrite(LED_BUILTIN, LOW); Serial.println("LED OFF"); void task_readSensors() { Serial.println("Reading sensors"); void task_transmitReadings() { Serial.println("Transmitting readings"); void task_oneTime() { Serial.println("ONE TIME task");
Step 2: add tasks to the task array void setup() { SCHEDULER_add_task(task_LED_ON, 1000, 0); SCHEDULER_add_task(task_LED_OFF, 1000, 100); SCHEDULER_add_task(task_readSensors, 2000, 100); SCHEDULER_add_task(task_transmitReadings, 6000, 100); SCHEDULER_add_task(task_oneTime, 0, 1000); SCHEDULER_init(); // Sets Timer1 interrupt }
Step 3: add the task updater to the ISR //-------------------------------------------------------------- // Timer 1 interrupt handler routine ISR(TIMER1_COMPA_vect) { SCHEDULER_update_tasks(); }
Step 4: add the task dispatcher to loop() //-------------------------------------------------------------- // Super loop void loop() { SCHEDULER_tick(); // Sleep until awakened by the next timer interrupt LowPower.idle(SLEEP_FOREVER, ADC_OFF, TIMER2_OFF, TIMER1_ON, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF); }
Challenge for you Q. Dodajte zadaću koja provjerava serijski port (očekujete odgovarajuće naredbe preko serijskog porta) na način da ne blokirate/kasnite druge zadaće koje izvodi mikrokontroler. Pretpostavite da naredbe preko serijskog porta mogu doći u proizvoljno vrijeme.
Sljedeći put Jednostavan pre-emptive task scheduler Radio communication