TinyOS Programming
Philip Levis
October 27, 2006
2
This text is copyright
c
Philip Levis, 2006. All rights reserved. You may distribute and reproduce it
freely for non-commercial purposes as long as you do not modify it in any way.
Revision 1.3 (Oct 27 2006)
Contents
1 Preface 13
2 Programming Hints, Condensed 15
3 Linking and Namespaces 17
3.1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Components and Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.5 Why? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4 Interfaces and Modules 27
4.1 Split Phase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2 Interfaces with Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Module Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.4 Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.5 Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.6 Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5 Configurations and Wiring 53
5.0.1 The as keyword and other namespace tricks . . . . . . . . . . . . . . . . . . . . . . 60
5.1 Pass Through Wiring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.1.1 Multiple Wirings, Fan-in, and Fan-out . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.2 Combine Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3
4 CONTENTS
6 Parameterized Wiring 69
6.1 Defaults . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.2 unique() and uniqueCount() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7 Generic Components 81
7.1 Generic Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.2 HilTimerMilliC: An Example Use of Generic Components . . . . . . . . . . . . . . . . . . 84
7.3 Generic Configurations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.4 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.4.1 TimerMilliC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.4.2 AMSenderC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.4.3 CC2420SpiC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
7.4.4 BlockStorageC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.5 Configurations, revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
8 Design Patterns 105
8.1 Behavioural: Dispatcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
8.2 Structural: Service Instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
8.3 Namespace: Keysets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.4 Namespace: Keymap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.5 Structural: Placeholder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
8.6 Structural: Facade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
8.7 Behavioural: Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
8.8 Behavioural: Adapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
9 Advanced Topics 135
9.1 Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
9.2 Platform Independent Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Code Examples
3.1 The POSIX read(2) function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Calling read(2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3 Reading a byte with read(2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Naming scopes in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.5 C++ namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6 The namespace of a C++ class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.7 Private fields in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.8 Instantiating a Piece object in C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.9 A C++ Piece factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.10 Function binding in Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.11 SmoothingFilterC, a simple nesC module . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.12 The StdControl interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.13 Interfaces in component signatures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.1 The split–phase Send interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2 The Read interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Using the Read interface in MagnetometerC . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.4 The Timer interface and its typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5 Using the Timer interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.6 Providing the Timer interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.7 Providing a Timer with microsecond precision . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.8 PeriodicReaderC signature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.9 Complete PeriodicReaderC component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.10 PeriodicSenseAndSendC component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.11 A troublesome implementation of a magnetometer sensor . . . . . . . . . . . . . . . . . . . 33
5