Title: TinyOS
1TinyOS
- Dhanshree Nimje
- Smita Khartad
2TinyOS - Design Design
3What is TinyOS?
- TinyOS is a highly modular software
- environment tailored to the requirements of
- Network Sensors, stressing efficiency,
- modularity and concurrency.
- Capable of fine grained concurrency
- (event-driven architecture)
- ??Small physical size
- Fewer context switches
- (FIFO/non-preemptable scheduling)
- ??Efficient Resource Utilization
- (Get done quickly and sleep)
- ??Highly Modular
4TinyOS - Features
- Event-driven architecture
- Lower layer sends events to higher layer
- Low overhead No busy -wait cycles
- Interrupt driven.Two kinds of interrupt
- ???? Clock
- ???? Radio
- Component driven programming model
- ???? Size - 400 bytes
- ???? Extremely flexible component graph
- Single Single-shared stack shared stack
5Features Contd.
- Network management - Active Messaging
- No kernel, process management, virtual memory
- File management - Matchbox
- 2-level FIFO scheduler events and tasks
- Complete integration with hardware
6Hardware Kits
- Two Board Sandwich
- Main CPU board with Radio Communication
- ?? Secondary Sensor Board
- ?? Allows for expansion and
- customization
- ?? Current sensors include
- Acceleration, Magnetic Field,
- Temperature, Pressure,
- Humidity, Light, and RF Signal Strength
- ?? Can control RF transmission strength Sense
Reception - Strength
7Hardware Abstraction
- LED (pin numbering/HW wiring)
- CLOCK (counter interrupt)
- UART (baud rate control, transfer)
- ADC (ADC interrupt handling)
- RFM (abstracts bit level timing, RFM specific
control logic)
8Communication stack
- building up from the RFM bit level
- bit level abstracts away radio specifics
- byte level radio component collects individual
bits into bytes - packet level constructs packets from bytes
- messaging layer interprets packets as messages
9Sensor stack
- photo, and temperature sensing components
- sits on top of ADC component
- typical request data, wait for data event
10TinyOS component model
- Component interface
- commands accepts (implemented)
- commands uses
- events accepts (implemented)
- events uses
- Component implementation
- functions that implement interface
- frame internal state
- tasks concurrency control
11Programming Model
Components .comp specification .C
behaviour .desc select and wire specification ac
cepts commands uses commands signals
events handles events
comp2 .desc
application .desc
12- Scheduler
- 2-level scheduling (events and tasks)
- single shared stack, used by events and function
calls - Tasks
- are preemptable by events
- may call commands
- may signal events
- not preempted by tasks
- Events
- Time critical
- Shorter duration (hand off to task if need be)
- Interrupts task
- Last-in first-out semantics (no priority among
events) - lowest level events support by hardware interrupt
13TinyOS Two-level Scheduling
- Tasks do intensive computations
- Unpreemptable FIFO scheduling
- Bounded number of pending tasks
- Events handle interrupts
- Interrupts trigger lowest level events
- Events can signal events, call commands, or post
tasks - Two priorities
- Event/command
- Tasks
14How to handle multiple data flows?
- Data/interrupt are handled by interrupt/event
- Respond to it quickly A sequence of non-blocking
- event/command (function calls) through the
component - graph
- e.g., get bit out of radio hw before it gets
lost - Post tasks for long computations
- e.g., encoding
- Assumption long computation are not urgent
- New events preempt tasks to handle new
- data
15Receiving a message
16What are tasks
- Requirement of realtime OS bounded delays
between events. - Event handler should run to completion within a
short duration. - If a lot of computation is involved in an event
handler we defer execution. How? - Implementing it as a task and scheduling it for
later execution. - TinyOS has simple FIFO scheduler using which
tasks are scheduled. - On occurrence of an event a task that is
executing is preempted.
17Data Memory Model
- STATIC memory allocation!
- No heap (malloc)
- No function pointers
- Global variables
- Available on a per-frame basis
- Local variables
- Saved on the stack
- Declared within a method
18Application
- Is the OS with some specific functionality.
- Application is interrupt driven.
- List of interrupts handled depend on list of
hardware components included in the application
(e.g. clock and receiver). - Waits for interrupts. On occurrence of interrupt,
calls interrupt handler.
invokes
Calls
Hardware Interrupts
ISR
Interrupt Handler
19A Complete Application
20Example Inter-Node Communication
21Message Buffer Ownership
- Transmission AM gains ownership of the buffer
until - sendDone() is signaled
- Reception Applications event handler gains
ownership - of the buffer, but it must return a free buffer
for the next - message
22Potentially Nasty Bug 1
- Whats wrong with the code?
- Symptom data saved
- in globalData is lost
- Reason Race
- condition between
- two tasks
- Solution Use a
- queue, or never rely
- on inter-task
- communication
uint8_t globalData task void processData()
call SendData.send(globalData) command
result_t Foo.bar(uint8_t data) globalData
data post processData()
23Potentially Nasty Bug 2
- Whats wrong with the code?
- Symptom message
- is corrupt
- Reason TOS_Msg
- is allocated in the
- stack, lost when
- function returns
- Solution Declare
- TOS_Msg msg in
- components frame.
command result_t Foo.bar(uint8_t data) TOS_Msg
msg FooData foo (FooData)msg.data foo.data
data call SendMsg.send(0x01,
sizeof(FooData), msg)
24Potentially Nasty Bug 3
command result_t Foo.bar(uint8_t data) FooData
foo (FooData)msg.data foo.data data call
SendMsg.send(0x01, sizeof(FooData), msg) Compo
nent
- Whats wrong with
- the code?
- Symptom some
- messages are lost
- Reason Race
- condition between
- two components
- trying to share
- network stack (which
- is split-phase)
- Solution Use a
- queue to store
- pending messages
Component 2 command result_t Goo.bar(uint8_t
data) GooData goo (GooData)msg.data goo.dat
a data call SendMsg.send(0x02,
sizeof(GooData), msg)
25