variety of sensors, ranging from simple microphones to more sophisticated video
• Dedicated embedded sensor nodes: Examples include the Berkeley mote family ,
the UCLA Medusa family , Ember nodes and MIT µAMP . These platforms
typically use commercial off-the-shelf (COTS) chip sets with emphasis on small form
factor, low power processing and communication, and simple sensor interfaces.
Because of their COTS CPU, these platforms typically support at least one
programming language, such as C. However, in order to keep the program footprint
small to accommodate their small memory size, programmers of these platforms are
given full access to hardware but rarely any operating system support. A classical
example is the TinyOS platform and its companion programming language, nesC.
• System on-chip (SoC) nodes: Examples of SoC hardware include smart dust , the
BWRC picoradio node , and the PASTA node . Designers of these platforms try
to push the hardware limits by fundamentally rethinking the hardware architecture
trade-offs for a sensor node at the chip design level. The goal is to find new ways of
integrating CMOS, MEMS, and RF technologies to build extremely low power and
small footprint sensor nodes that still provide certain sensing, computation, and
communication capabilities. Among these hardware platforms, the Berkeley motes,
due to their small form factor, open source software development, and commercial
availability, have gained wide popularity in the sensor network research.
Sensor Network Programming Challenges
Traditional programming technologies rely on operating systems to provide abstraction
for processing, I/O, networking, and user interaction hardware. When applying such a
model to programming networked embedded systems, such as sensor networks, the
application programmers need to explicitly deal with message passing, event
synchronization, interrupt handling, and sensor reading. As a result, an application is
typically implemented as a finite state machine (FSM) that covers all extreme cases:
unreliable communication channels, long delays, irregular arrival of messages,
simultaneous events etc.
For resource-constrained embedded systems with real-time requirements, several
mechanisms are used in embedded operating systems to reduce code size, improve
response time, and reduce energy consumption. Microkernel technologies  modularize
the operating system so that only the necessary parts are deployed with the application.
Real-time scheduling  allocates resources to more urgent tasks so that they can be
finished early. Event-driven execution allows the system to fall into low-power sleep
mode when no interesting events need to be processed. At the extreme, embedded
operating systems tend to expose more hardware controls to the programmers, who now
have to directly face device drivers and scheduling algorithms, and optimize code at the
assembly level. Although these techniques may work well for small, stand-alone
embedded systems, they do not scale up for the programming of sensor networks for two