Professional Documents
Culture Documents
Small microcontroller 8 kB code 512 B data Simple, low-power radio 10 kbps ASK EEPROM (32 KB) Simple sensors Designed for experimentation -sensor boards -power boards
Demonstrate scale
Mica2 12/02 38.4kbps radio FSK NEST open exp. Platform 128 kB code, 4 kB data 40kbps OOK/ASK radio 512 kB Flash
Reminder
watt = voltage * amphere
Unit of power
Bells Law
New computing class every 10 years
Streaming Data to/from the Physical World
log (people per computer)
year
Mote Evolution
Design Principles
Key to Low Duty Cycle Operation:
Sleep majority of the time Wakeup quickly start processing Active minimize work & return to sleep
Sleep
Majority of time, node is asleep
>99%
Run auxiliary hardware components from low speed oscillators (typically 32kHz)
Perform ADC conversions, DMA transfers, and bus operations while microcontroller core is stopped
Wakeup
Overhead of switching from Sleep to Active Mode Microcontroller Radio (FSK)
Active
Microcontroller
Fast processing, low active power Avoid external oscillators
Radio
High data rate, low power tradeoffs Narrowband radios
Low power, lower data rate, simple channel encoding, faster startup
Wideband radios
More robust to noise, higher power, high data rates
Mica2 (AVR)
MicaZ (AVR)
0.2 ms wakeup 30 QW sleep 33 mW active 250 kbps 2.5V min 2/3 of AA capacity
Report data once every 3 minutes with two AA batteries (<1% duty cycle)
453 days
328 days
945 days
Software challenges
Power efficiency Small memory footprint Application specific Modularity Concurrency-intensive operations
Multiple, high-rate data flows (radio, sensor, actuator) Real-time query and feedback control of physical world Little memory for buffering: Data must be processed on the fly TinyOS: No buffering in radio hw: deadline miss data loss TinyOS provides NO real-time guarantees! EDF (Earliest Deadline First) scheduling supported in TinyOS 2.x
http://www.tinyos.net/tinyos-2.x/doc/html/tep106.html Perfect???
Real-time
General-Purpose OS?
MANY functionalities & programming APIs Protection between untrusted applications and kernel
Overhead for crossing kernel/user boundary & interrupt handling
Multi-threaded architecture
Large number of threads Context switch overhead large memory
I/O model
Blocking I/O: waste memory on blocked threads Polling: waste CPU cycles and power
TinyOS Overview
Application = scheduler + graph of components
Compiled into one executable
Actuating
Traditional OS Architectures
Application 1 Application 2 Application 1 NFS Micro-kernel Scheduler IPC Scheduler HW VM I/O Monolithic kernel VM I/O HW
Problems Large memory & storage requirement Unnecessary and overkill functionality Address space isolation, complex I/O subsystem, UI Relative high system overhead, e.g, context switch Require complex and power consuming hardware support
Desirable OS architecture
Extremely small footprint Extremely low system overhead Extremely low power consumption
NO Kernel Direct hardware manipulation NO Process management Only one process on the fly NO Virtual memory Single linear physical address space NO Dynamic memory allocation Assigned at compile time NO Software signal or exception Function call Goal: to strip down memory size and system overhead.
Main (includes Scheduler) Application (User Components) Active Message Actuating Sensing Communication Mote Hardware
Commands
Events
Frame: static storage model - compile time memory allocation (efficiency) Command and events are function calls (efficiency)
An Example Application
application sensing application
routing
Routing Layer
messaging
Messaging Layer
packet
Radio Packet
byte
photo
Temp
SW HW
bit
RFM
clocks
ADC
i2c
Hardware
Time
Two-Level Scheduling
Event and Task
Tasks cannot preempt other tasks Single shared stack
Used by both interrupts and function calls
Simple FIFO scheduler Events can preempt a task Events can preempt each other When idle, scheduler shuts down the node except for clock
Event implementation
Event is independent of FIFO scheduler. Lowest level events are supported directly by Hardware interrupt Software events propagate from lower level to upper level through function call
Socket/TCP/IP?
Too much memory for buffering and threads Data are buffered until application threads read it Application threads blocked until data is available Transmit too many bits (sequence #, ack, retransmission) Tied with multi-threaded architecture
Active Message
Every message contains the name of an event handler Sender
Declare buffer storage in a frame Name a handler Request Transmission Done - completion signal
Receiver
The corresponding event handler invoked
No blocked or waiting threads on the receiver Behaves like any other events Single buffering
Scheduler: 178 Bytes code Totals: 3450 Bytes code 226 Bytes data
Time Breakdown
Time Breakdown
Power Breakdown
Evaluation of TinyOS
Small memory footprint Power efficient
Put microcontroller and radio to sleep
Efficient modularity
Function call (event, command) interface between components
Concurrency-intensive operations
Event-driven architecture Efficient interrupts/events handling (function calls, no user/kernel boundary)
Real-time v
Non-preemptable FIFO task scheduling No real-time guarantees or overload protection
End-to-end timing guarantees? Reliable synchronization mechanism? Internet or large scale service infrastructure?
Interoperability? Protocols?
TCP/IP, UDP, RTP?