first steps in tinyos and nesc programming

44
Feb 2007 WSN Training: First Steps in nesC Programmin g 1 First Steps in TinyOS and nesC Programming Topics Timer Application: MyApp Application directory contents Do and Dissect Configuration Wiring Module StdControl Timer Leds

Upload: zuwena

Post on 12-Jan-2016

77 views

Category:

Documents


0 download

DESCRIPTION

First Steps in TinyOS and nesC Programming. Topics Timer Application: MyApp Application directory contents Do and Dissect Configuration Wiring Module StdControl Timer Leds. First Steps in TinyOS Programming. Objectives What files needed in an application directory - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: First Steps in TinyOS and nesC Programming

Feb 2007WSN Training: First Steps in nesC Programming 1

First Steps in TinyOS and nesC Programming

Topics Timer Application: MyApp

Application directory contents Do and Dissect

Configuration Wiring

Module StdControl Timer Leds

Page 2: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 2 Feb 2007

First Steps in TinyOS Programming

Objectives What files needed in an application directory How to use the Timer and LED components How to compile and download an application to a Mote Application: MyApp in

/MoteWorks/apps/tutorials/lesson_1/

Page 3: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 3 Feb 2007

About MyApp

This timer application uses one of the timers on the ATmega128L Mote. The timer will be set to fire continuously every

second and the Mote red LED will toggle on and off to show this visually.

So why go through the trouble of this program? This is TinyOS’ version of “Hello World” To help the learn unfamiliar TinyOS and nesC

programming methods

Page 4: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 4 Feb 2007

/** * This configuration shows how to use the Timer and LED components**/ configuration MyApp {}implementation { components Main, MyAppM, TimerC, LedsC; Main.StdControl -> TimerC.StdControl; Main.StdControl -> MyAppM.StdControl; MyAppM.Timer -> TimerC.Timer[unique("Timer")]; MyAppM.Leds -> LedsC.Leds;}

The MoteWorks/apps/tutorials/lesson_1/MyApp

MyApp.nc configuration

Specifying the INTERFACE

Specifying the IMPLEMENTATION TimerC LedsC

Main

MyApp_Timer

MyApp

StdControl

StdControl

Timer Leds

LedsTimerStdControl

Page 5: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 5 Feb 2007

Lab Outline

1. Enter/review in all necessary code and auxiliary files

2. Build (compile) and download the application3. Take a closer look at the code and auxiliary files

You should already have these One MICA Mote: standard editions of MICA2 (MPR4x0) or

MICAz (MPR2400) or OEM editions of MICA2 or MICAz One gateway / programming board: MIB510, MIB520, or

MIB600 and the associated hardware (cables, power supply) for each

A Windows PC with MoteWorks installed

Page 6: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 6 Feb 2007

MyApp Application Review

The application folder (directory) is where all your top-level application code and associated files will be stored.

1.Navigate to the directory /MoteWorks/apps/tutorials/ lesson_1

Page 7: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 7 Feb 2007

Seven Common Files in an Application Directory

1. Makefile (section 5.2.1)2. Makefile.component (section 5.2.2)3. Top-level application configuration written in

nesC4. Top-level application module written in nesC5. sensorboardsApp.h file (not seen here, but

typical for applications using sensors and GPIO)6. appFeatures.h (optional)7. README (optional, but highly recommended)

Page 8: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 8 Feb 2007

MyApp Application: Makefile

include Makefile.componentinclude $(TOSROOT)/apps/MakeXbowlocalinclude $(MAKERULES)

Page 9: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 9 Feb 2007

MyApp – Makefile.component

This file describes the top level application component, MyApp, and the name of the sensorboard we are going to use.

The sensorboard reference tells the compiler we want to use the nesC components for accessing the sensor devices on that board. The collection of those components is also known

as a “driver”

COMPONENT=MyAppSENSORBOARD=mts310

Page 10: First Steps in TinyOS and nesC Programming

Feb 2007WSN Training: First Steps in nesC Programming 10

First Steps in TinyOS and nesC Programming

Topics Application: MyApp

Application directory contents Do and Dissect

Configuration Wiring

Module StdControl interface Timer interface

Page 11: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 11 Feb 2007

MyApp – Top Level Configuration

What might we have in The comments? Application name? The list of components? Wiring?

/** * <Some comments about the top-level application>**/ configuration <Application_Name> {}implementation { components <comma separated listed of components>; <User.Interface -> Provider.Interface>;}

Page 12: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 12 Feb 2007

MyApp – Top Level Configuration

What is Main? /** * This configuration shows how to use the Timer and LED components**/ configuration MyApp {}implementation { components Main, MyAppM, TimerC, LedsC; Main.StdControl -> TimerC.StdControl; Main.StdControl -> MyAppM.StdControl; MyAppM.Timer -> TimerC.Timer[unique("Timer")]; MyAppM.Leds -> LedsC.Leds;}

Page 13: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 13 Feb 2007

Main – the scheduler for TinyOS

A TinyOS application = configuration (wiring) of new and existing components + the component Main.

Main, the scheduler, runs the tasks created by those components.

A TinyOS top-level application must have the Main component in its configuration.

Page 14: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 14 Feb 2007

Main cont’d

Main is a component that is executed first in a TinyOS application.

The command Main.StdControl.init()is the first command executed in TinyOS followed by Main.StdControl.start().

StdControl is a common interface used to initialize, start, and stop TinyOS components.

configuration Main { uses interface StdControl;}implementation{ components RealMain, PotC, HPLInit;

StdControl = RealMain.StdControl; RealMain.hardwareInit -> HPLInit; RealMain.Pot -> PotC;}

Page 15: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 15 Feb 2007

MyApp – Top Level Configuration

Why does the component TimerC provide a unique Timer?

/** * This configuration shows how to use the Timer and LED components**/ configuration MyApp {}implementation { components Main, MyAppM, TimerC, LedsC; Main.StdControl -> TimerC.StdControl; Main.StdControl -> MyAppM.StdControl; MyAppM.Timer -> TimerC.Timer[unique("Timer")]; MyAppM.Leds -> LedsC.Leds;}

Page 16: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 16 Feb 2007

Parameterized Interfaces (1 of 2)

There may be multiple users of a component One Timer component but many Users with different

event time requirements When a Timer “fires” which component should be

signaled?

How does TinyOS handle this ? Multiple instantiations of a Component’s Interface Parameter specifies the specific instance

Page 17: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 17 Feb 2007

Parameterized Interfaces (2 of 2)

A parameterized interface allows a component to provide multiple instances of an interface

Parameterization (or indexing) is set by a compile-time value

  provides interface Timer[uint8_t id];

Total number of instances permitted may be limited by implementation

Page 18: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 18 Feb 2007

nesC Concepts – Unique Instances

To make sure your instance parameter is not used by some one else, use unique(“astring”) Generates an 8-bit identifier from the string given as an

argument. Multiple components using

timer[unique(“Timer”)]

are each guaranteed to get a signal associated with their specific timer settings.

All components must use the same “astring” In our app Timer is used for the astring

Page 19: First Steps in TinyOS and nesC Programming

Feb 2007WSN Training: First Steps in nesC Programming 19

First Steps in TinyOS and nesC ProgrammingTopics

Application Example: Do and Dissect the MyApp_Timer application

Configuration Wiring

Module StdControl interface Timer interface

Page 20: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 20 Feb 2007

MyApp – Top Level Module

The application’s module is located in the MoteWorks/apps/tutorial/lesson_1/MyAppM.nc file. The function of this code is to start a timer and toggle

the red LED on the Mote.

Page 21: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 21 Feb 2007

MyApp – Top Level Module

/** * This module shows how to use the Timer and LED components**/ module MyAppM { provides { interface StdControl; } uses { interface Timer; interface Leds; }}

The MyAppM module provides the interface StdControl.  To provide an interface means that MyAppM must implement

the that interface.  As explained above, this is necessary to get the MyApp

component initialized and started.

The first part of the code states that this is a module called MyAppM and declares the interfaces which are prefaced by the keywords provides and uses. 

1 of 3

Page 22: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 22 Feb 2007

MyApp – Top Level Module

/** * This module shows how to use the Timer and LED components**/ module MyAppM { provides { interface StdControl; } uses { interface Timer; interface Leds; }}

In many nesC applications, it is common to call a function periodically.

The realization of that function is done by means of a timer.

We also want to active one of the LEDs so we use an interface to the LED

The name for the interface for a timer is, conveniently enough Timer.

The name for the interface for an LED is Leds.

1 of 3

Page 23: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 23 Feb 2007

nesC Interface – The StdControl Interface (review)

The StdControl interface (like the component Main) must always be implemented at the top-level application. The StdControl interface provides the basic functionality for

the TinyOS application to be initialized, started and stopped.

StdControl is like a power switch to turn on and off components Also does boot time initialization

StdControl should not be used for continuous processing Use a timer instead

Page 24: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 24 Feb 2007

StdControl Interface Details

In /MoteWorks/tos/interfaces/StdControl.nc

StdControl defines three commands: init(),start(), and stop().

init() is called when a component is first initialized start() is called to execute a component stop() is called when a components is stopped init() can

be called multiple times but will never be called after either start() or stop() are called.

interface StdControl {  command result_t init();  command result_t start();  command result_t stop();}

Page 25: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 25 Feb 2007

Mote About the Timer Interface

interface Timer { command result_t start(char type, uint32_t interval); command result_t stop(); event result_t fired();

Here we see that Timer interface defines two commands

start() and stop() commands

and one event fired() event

What is “result_t”? It is the data type for the status value returned by a

command or event. This status value is either SUCCESS or FAIL.

Page 26: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 26 Feb 2007

Mote About the Timer Interface (cont’d)

interface Timer { command result_t start(char type, uint32_t interval); command result_t stop(); event result_t fired();

The start() command is used to specify the type of the timer and the interval at which the timer will expire.

The unit of the interval argument is millisecond.

The valid types of timers TIMER_ONE_SHOT

Ends after the specified interval

TIMER_REPEAT Goes on and on until it is stopped by the stop() command.

Page 27: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 27 Feb 2007

MyApp – Timer interface (cont’d)

interface Timer { command result_t start(char type, uint32_t interval); command result_t stop(); event result_t fired();

How does an application know that its timer has expired? When it receives an event.

What is an event? A signal from the implementation of an interface that

something has occurred. In this case, the fired() event is signaled when the time

interval has passed.This is an example of a bi-directional interface

An interface can both provide commands that can be called by users of the interface, and signal events of call handlers implemented by the user.

Remember: A module that uses an interface must implement the events that this interface uses.

Page 28: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 28 Feb 2007

MyApp – Top Level Moduleimplementation { /** * Initialize the components. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.init() { call Leds.init(); return SUCCESS; } /** * Start things up. This just sets the rate for the clock

* component. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.start() { // Start a repeating timer that fires every 1000ms return call Timer.start(TIMER_REPEAT, 1000); }

The MyAppM module implements the StdControl.init(), StdControl.start(), and StdControl.stop() commands, since it provides the StdControl interface.

1 of 6

Page 29: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 29 Feb 2007

MyApp – Top Level Moduleimplementation { /** * Initialize the components. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.init() { call Leds.init(); return SUCCESS; } /** * Start things up. This just sets the rate for the clock

* component. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.start() { // Start a repeating timer that fires every 1000ms return call Timer.start(TIMER_REPEAT, 1000); }

The init() command in the implemented StdControl interface simply initializes the Leds subcomponent with the call to Leds.init().

2 of 6

Page 30: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 30 Feb 2007

MyApp – Top Level Moduleimplementation { /** * Initialize the components. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.init() { call Leds.init(); return SUCCESS; } /** * Start things up. This just sets the rate for the clock

* component. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.start() { // Start a repeating timer that fires every 1000ms return call Timer.start(TIMER_REPEAT, 1000); }

The start() command invokes Timer.start() to create a repeat timer (“TIMER_REPEAT”) that expires every 1000 msec.

3 of 6

Page 31: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 31 Feb 2007

MyApp – Top Level Module/** * Halt execution of the application. * This just disables the clock component. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.stop() { return call Timer.stop(); }

/** * Toggle the red LED in response to the <code>Timer.fired</code> * event. * * @return Always returns <code>SUCCESS</code> **/ event result_t Timer.fired() { call Leds.redToggle(); return SUCCESS; }}

stop() terminates the timer.

4 of 6

Page 32: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 32 Feb 2007

MyApp – Top Level Module/** * Halt execution of the application. * This just disables the clock component. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.stop() { return call Timer.stop(); }

/** * Toggle the red LED in response to the <code>Timer.fired</code> * event. * * @return Always returns <code>SUCCESS</code> **/ event result_t Timer.fired() { call Leds.redToggle(); return SUCCESS; }}

The Timer.fired() event is implemented. This is necessary since MyAppM must implement any event from an interface it uses..

5 of 6

Page 33: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 33 Feb 2007

MyApp_Timer – Top Level Module/** * Halt execution of the application. * This just disables the clock component. * * @return Always returns <code>SUCCESS</code> **/ command result_t StdControl.stop() { return call Timer.stop(); }

/** * Toggle the red LED in response to the <code>Timer.fired</code> * event. * * @return Always returns <code>SUCCESS</code> **/ event result_t Timer.fired() { call Leds.redToggle(); return SUCCESS; }}

Each time Timer.fired() event is triggered, the Leds.redToggle() toggles the red LED.

6 of 6

Page 34: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 34 Feb 2007

MyAppM.nc – Key Lessons

The heart of most TinyOS applications is Timer.fired()

Compare to C where main() contains a while loop

A while loop in StdControl.init() would freeze the system and block all tasks

The proper way to centralize processing in TinyOS is to start a repeat timer (with REPEAT_TIMER) and implement logic in Timer.fired().

Page 35: First Steps in TinyOS and nesC Programming

Feb 2007WSN Training: First Steps in nesC Programming 35

First Steps in TinyOS and nesC Programming

Topics Application: MyApp

Application directory contents Do and Dissect

Configuration Wiring

Module StdControl Timer

Programming with Programmer’s Notepad

Page 36: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 36 Feb 2007

MyApp_Timer – Compiling and Flashing the Mote

1. Now that you have reviewed all the application files, we can proceed with the compilation and flashing of the Mote You need to be in the .nc of the app file you want to

compile and program before you can execute shell commands from Programmer’s Notepad.

2. Attach one Mote to a Programmer/Gateway Board One of MIB510, MIB520, MIB600 One of MICAz, MICA2

3. Compile your application:1. Select Tools > make mica2 (or make micaz or make

mica2dot)2. The “Output” section of the Programmers Notepad will

print the compiling results to the screen:

Page 37: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 37 Feb 2007

Page 38: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 38 Feb 2007

MyApp – Compiling and Flashing the Mote

4. Flash your Mote: Select Tools > shell In the command line type

make <platform> install,<n>

mica2, ormicaz, ormica2dot

Page 39: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 39 Feb 2007

Lab 1

Change the application so that the yellow or green LED blinks

Challenge exercise: Setup two timers so that the yellow or green LED flashes at an some multiple of the red LED See “Challenge_Apps” directory in WSN training CD for

one solution

Challenge exercises do not have “answers in the back of the book.”

Page 40: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 40 Feb 2007

Lab: Change Line 86 of BlinkM.nc

Open Programmers Notepad window and navigate to the Blink directory: /MoteWorks/apps/general/Blink• Change from call Leds.redToggle(); to call

Leds.yellowToggle();

Page 41: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 41 Feb 2007

Lab: Step 2 -- Compile

Compile an application in Programmer’s NotepadA.Method 1: Click on Tools > Shell

Type make <platform> install and enter into the User Input Parameter dialog box

B.Method 2: See next slide

Exchange <platform> with one of the following• mica2• micaz• mica2dot

Exchange <platform> with one of the following• mica2• micaz• mica2dot

Page 42: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 42 Feb 2007

2. View compiler output

1. Type in make <platform> command

then hit “Enter”

Lab: Step 2 — Compiling

Page 43: First Steps in TinyOS and nesC Programming

Feb 2007WSN Training: First Steps in nesC Programming 43

Q & A: First Steps in nesC Programming

Timer Application: MyApp Application directory contents Do and Dissect Configuration

Wiring

Module StdControl Timer Leds

Programming with Programmer’s Notepad

Page 44: First Steps in TinyOS and nesC Programming

WSN Training: First Steps in nesC Programming 44 Feb 2007

Vocabulary

ApplicationComponentModuleConfigurationInterfaceMakefileMakefile.componentnesCTinyOSProvidesUsesimplementation

CommandEventCall Return – SUCCESS, FAILMakeStdControl – init(), start(), stop()TimerMLeds interfaceLedsCTimer interface -- TIMER_REPEAT, TIMER_ONE_SHOTdocs