From 82b0ae40259e7b3a31b13b9a379d82c2011fd4c4 Mon Sep 17 00:00:00 2001 From: klueska Date: Wed, 23 Dec 2009 18:08:46 +0000 Subject: [PATCH] Updated documentation on all of the applications as well as modified the TestJoin application slightly --- .../apps/BaseStation/BaseSendReceiveP.nc | 27 +++++++++ .../apps/BaseStation/BaseStationAppC.nc | 27 +++++++++ .../apps/BaseStation/BaseStationC.nc | 27 +++++++++ apps/tosthreads/apps/Blink/BlinkAppC.nc | 6 ++ apps/tosthreads/apps/Blink/BlinkC.nc | 6 ++ .../apps/Blink_DynamicThreads/BlinkAppC.nc | 8 ++- .../apps/Blink_DynamicThreads/BlinkC.nc | 8 ++- .../TestBasicsbSensorsAppC.nc | 16 ++++++ .../TestBlockStorage/TestBlockStorageAppC.nc | 12 ++++ .../TestBlockStorage/TestBlockStorageP.nc | 12 ++++ .../apps/TestCollection/TestCollectionAppC.nc | 25 +++++++- .../apps/TestCollection/TestCollectionC.nc | 25 +++++++- apps/tosthreads/apps/TestJoin/README | 24 ++++++++ apps/tosthreads/apps/TestJoin/TestJoinAppC.nc | 10 +++- apps/tosthreads/apps/TestJoin/TestJoinC.nc | 21 ++++--- .../apps/TestPrintf/TestPrintfAppC.nc | 4 ++ .../tosthreads/apps/TestPrintf/TestPrintfC.nc | 4 ++ .../apps/TestSineSensor/TestSineSensorAppC.nc | 7 +++ .../apps/TestSineSensor/TestSineSensorC.nc | 7 +++ .../capps/BaseStation/BaseStation.c | 27 ++++++++- apps/tosthreads/capps/Blink/Blink.c | 6 ++ apps/tosthreads/capps/Bounce/Bounce.c | 25 ++++++++ apps/tosthreads/capps/Null/Null.c | 6 ++ .../capps/SenseAndSend/SenseAndSend.c | 17 ++++++ .../SenseStoreAndForward.c | 28 +++++++++ apps/tosthreads/capps/TestCollection/README | 7 +-- .../capps/TestCollection/TestCollection.c | 23 ++++++++ apps/tosthreads/capps/TestJoin/README | 24 ++++++++ apps/tosthreads/capps/TestJoin/TestJoin.c | 20 +++---- .../capps/TestLogStorage/TestLogStorage.c | 24 ++++++++ apps/tosthreads/capps/TestPrintf/TestPrintf.c | 4 ++ .../capps/TestSineSensor/TestSineSensor.c | 7 +++ .../capps/ThreadStress/ThreadStress.c | 12 ++++ .../tinyld/LoadFromRAM/LoadFromRAMAppC.nc | 4 ++ .../tinyld/LoadFromRAM/LoadFromRAMP.nc | 4 ++ apps/tosthreads/tinyld/LoadFromRAM/README | 15 ++++- apps/tosthreads/tinyld/Makefile | 57 +++++++++++++++++++ apps/tosthreads/tinyld/SerialLoader/README | 15 ++++- .../tinyld/SerialLoader/SerialLoaderAppC.nc | 4 ++ .../tinyld/SerialLoader/SerialLoaderP.nc | 4 ++ .../SerialLoaderFlash/FlashVolumeManagerC.nc | 5 ++ .../SerialLoaderFlash/FlashVolumeManagerP.nc | 5 ++ .../tinyld/SerialLoaderFlash/README | 15 ++++- .../SerialLoaderFlashAppC.nc | 5 ++ 44 files changed, 594 insertions(+), 45 deletions(-) create mode 100644 apps/tosthreads/apps/TestJoin/README create mode 100644 apps/tosthreads/capps/TestJoin/README create mode 100644 apps/tosthreads/tinyld/Makefile diff --git a/apps/tosthreads/apps/BaseStation/BaseSendReceiveP.nc b/apps/tosthreads/apps/BaseStation/BaseSendReceiveP.nc index 063fa3a0..5497f40b 100644 --- a/apps/tosthreads/apps/BaseStation/BaseSendReceiveP.nc +++ b/apps/tosthreads/apps/BaseStation/BaseSendReceiveP.nc @@ -30,6 +30,33 @@ */ /** + * BaseStation is a reimplementation of the standard BaseStation application using + * the TOSThreads thread library. It transparently forwards any AM messages it + * receives from its radio interface to its serial interface and vice versa. + * + *

On the serial link, BaseStation sends and receives simple active + * messages (not particular radio packets): on the radio link, it + * sends radio active messages, whose format depends on the network + * stack being used. BaseStation will copy its compiled-in group ID to + * messages moving from the serial link to the radio, and will filter + * out incoming radio messages that do not contain that group ID.

+ * + *

BaseStation includes queues in both directions, with a guarantee + * that once a message enters a queue, it will eventually leave on the + * other interface. The queues allow the BaseStation to handle load + * spikes.

+ * + *

BaseStation acknowledges a message arriving over the serial link + * only if that message was successfully enqueued for delivery to the + * radio link.

+ * + *

The LEDS are programmed to toggle as follows:

+ * + * * @author Kevin Klues * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/apps/BaseStation/BaseStationAppC.nc b/apps/tosthreads/apps/BaseStation/BaseStationAppC.nc index a6d8832a..09ca717e 100644 --- a/apps/tosthreads/apps/BaseStation/BaseStationAppC.nc +++ b/apps/tosthreads/apps/BaseStation/BaseStationAppC.nc @@ -30,6 +30,33 @@ */ /** + * BaseStation is a reimplementation of the standard BaseStation application using + * the TOSThreads thread library. It transparently forwards any AM messages it + * receives from its radio interface to its serial interface and vice versa. + * + *

On the serial link, BaseStation sends and receives simple active + * messages (not particular radio packets): on the radio link, it + * sends radio active messages, whose format depends on the network + * stack being used. BaseStation will copy its compiled-in group ID to + * messages moving from the serial link to the radio, and will filter + * out incoming radio messages that do not contain that group ID.

+ * + *

BaseStation includes queues in both directions, with a guarantee + * that once a message enters a queue, it will eventually leave on the + * other interface. The queues allow the BaseStation to handle load + * spikes.

+ * + *

BaseStation acknowledges a message arriving over the serial link + * only if that message was successfully enqueued for delivery to the + * radio link.

+ * + *

The LEDS are programmed to toggle as follows:

+ *
    + *
  • LED0: Message bridged from serial to radio
  • + *
  • LED1: Message bridged from radio to serial
  • + *
  • LED2: Dropped message due to queue overflow in either direction
  • + *
+ * * @author Kevin Klues * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/apps/BaseStation/BaseStationC.nc b/apps/tosthreads/apps/BaseStation/BaseStationC.nc index 268978d6..987aa6bc 100644 --- a/apps/tosthreads/apps/BaseStation/BaseStationC.nc +++ b/apps/tosthreads/apps/BaseStation/BaseStationC.nc @@ -30,6 +30,33 @@ */ /** + * BaseStation is a reimplementation of the standard BaseStation application using + * the TOSThreads thread library. It transparently forwards any AM messages it + * receives from its radio interface to its serial interface and vice versa. + * + *

On the serial link, BaseStation sends and receives simple active + * messages (not particular radio packets): on the radio link, it + * sends radio active messages, whose format depends on the network + * stack being used. BaseStation will copy its compiled-in group ID to + * messages moving from the serial link to the radio, and will filter + * out incoming radio messages that do not contain that group ID.

+ * + *

BaseStation includes queues in both directions, with a guarantee + * that once a message enters a queue, it will eventually leave on the + * other interface. The queues allow the BaseStation to handle load + * spikes.

+ * + *

BaseStation acknowledges a message arriving over the serial link + * only if that message was successfully enqueued for delivery to the + * radio link.

+ * + *

The LEDS are programmed to toggle as follows:

+ *
    + *
  • LED0: Message bridged from serial to radio
  • + *
  • LED1: Message bridged from radio to serial
  • + *
  • LED2: Dropped message due to queue overflow in either direction
  • + *
+ * * @author Kevin Klues */ diff --git a/apps/tosthreads/apps/Blink/BlinkAppC.nc b/apps/tosthreads/apps/Blink/BlinkAppC.nc index d95f7192..85058312 100644 --- a/apps/tosthreads/apps/Blink/BlinkAppC.nc +++ b/apps/tosthreads/apps/Blink/BlinkAppC.nc @@ -30,6 +30,12 @@ */ /** + * Blink is a simple application used to test the basic functionality of + * TOSThreads. + * + * Upon a successful burn, you should see LED0 flashing with a period of every + * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/apps/Blink/BlinkC.nc b/apps/tosthreads/apps/Blink/BlinkC.nc index e4027006..ed6fcb7d 100644 --- a/apps/tosthreads/apps/Blink/BlinkC.nc +++ b/apps/tosthreads/apps/Blink/BlinkC.nc @@ -30,6 +30,12 @@ */ /** + * Blink is a simple application used to test the basic functionality of + * TOSThreads. + * + * Upon a successful burn, you should see LED0 flashing with a period of every + * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/apps/Blink_DynamicThreads/BlinkAppC.nc b/apps/tosthreads/apps/Blink_DynamicThreads/BlinkAppC.nc index 1add9280..7b2dc313 100644 --- a/apps/tosthreads/apps/Blink_DynamicThreads/BlinkAppC.nc +++ b/apps/tosthreads/apps/Blink_DynamicThreads/BlinkAppC.nc @@ -21,9 +21,13 @@ */ /** - * @author Chieh-Jan Mike Liang + * Blink is a simple application used to test the basic functionality of + * TOSThreads using dynamic threads rather than static threads. + * + * Upon a successful burn, you should see LED0 flashing with a period of every + * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * - * This is the dynamic thread implementation of Blink. + * @author Chieh-Jan Mike Liang */ configuration BlinkAppC {} diff --git a/apps/tosthreads/apps/Blink_DynamicThreads/BlinkC.nc b/apps/tosthreads/apps/Blink_DynamicThreads/BlinkC.nc index 291d6cbf..49b274ec 100644 --- a/apps/tosthreads/apps/Blink_DynamicThreads/BlinkC.nc +++ b/apps/tosthreads/apps/Blink_DynamicThreads/BlinkC.nc @@ -21,9 +21,13 @@ */ /** - * @author Chieh-Jan Mike Liang + * Blink is a simple application used to test the basic functionality of + * TOSThreads using dynamic threads rather than static threads. + * + * Upon a successful burn, you should see LED0 flashing with a period of every + * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. * - * This is the dynamic thread implementation of Blink. + * @author Chieh-Jan Mike Liang */ module BlinkC { diff --git a/apps/tosthreads/apps/TestBasicsbSensors/TestBasicsbSensorsAppC.nc b/apps/tosthreads/apps/TestBasicsbSensors/TestBasicsbSensorsAppC.nc index d1e3aca7..cb3b898e 100644 --- a/apps/tosthreads/apps/TestBasicsbSensors/TestBasicsbSensorsAppC.nc +++ b/apps/tosthreads/apps/TestBasicsbSensors/TestBasicsbSensorsAppC.nc @@ -30,6 +30,22 @@ */ /** + * This application is used to test the threaded version of the API for accessing + * sensors on the basicsb sensor board. + * + * This application simply takes sensor readings in an infinite loop from the + * Photo and Temperature sensors on the basicsb sensor board and forwards them + * over the serial interface. Upon successful transmission, LED0 is toggled. + * + * A successful test will result in the TestBasicsbSensors mote constantly + * flickering LED0. Additionally, messages containing the sensor readings should + * be forwarded over the serial interface as verified by running the following + * for the platform of interest: + * java net.tinyos.tools.Listen -comm serial@/dev/ttyUSBXXX: + * + * Once this java application is running, you should see output containing the + * sensor readings being streamed to your terminal. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageAppC.nc b/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageAppC.nc index b2933857..3d43d2a2 100644 --- a/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageAppC.nc +++ b/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageAppC.nc @@ -21,6 +21,18 @@ */ /** + * This application is used to test the threaded version of the API for performing + * block storage. + * + * This application first checks the size of the block storage volume, and + * erases it. Then, it randomly writes records, followed by a verification + * with read. + * + * Successful running of this application results in LED0 being ON + * throughout the duration of the erase, write, and read sequence. Finally, + * if all tests pass, LED1 is turned ON. Otherwise, all three LEDs are + * turned ON to indicate problems. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageP.nc b/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageP.nc index 316cbece..81b191b0 100644 --- a/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageP.nc +++ b/apps/tosthreads/apps/TestBlockStorage/TestBlockStorageP.nc @@ -21,6 +21,18 @@ */ /** + * This application is used to test the threaded version of the API for performing + * block storage. + * + * This application first checks the size of the block storage volume, and + * erases it. Then, it randomly writes records, followed by a verification + * with read. + * + * Successful running of this application results in LED0 being ON + * throughout the duration of the erase, write, and read sequence. Finally, + * if all tests pass, LED1 is turned ON. Otherwise, all three LEDs are + * turned ON to indicate problems. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/apps/TestCollection/TestCollectionAppC.nc b/apps/tosthreads/apps/TestCollection/TestCollectionAppC.nc index 4db9f298..f248d970 100644 --- a/apps/tosthreads/apps/TestCollection/TestCollectionAppC.nc +++ b/apps/tosthreads/apps/TestCollection/TestCollectionAppC.nc @@ -20,7 +20,30 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* +/** + * TestCollection is a reimplementation of the Multihop Oscilloscope application + * using TOSThreads. It periodically samples a universal software-based SineSensor + * and broadcasts a message every few readings. These readings can be displayed by + * the Java "Oscilloscope" application found in the the TestCollection/java + * subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java + * application. + * + * At least two motes must be used by this application, with one of them installed + * as a base station. Base station motes can be created by installing them with + * NODE_ID % 500 == 0. + * i.e. make threads install.0 + * make threads install.500 + * make threads install.1000 + * + * All other nodes can be installed with arbitrary NODE_IDs. + * make threads install.123 + * + * Successful running of this application is verified by all NON-base station motes + * periodically flashing LED1 upon sending a message, and the base station mote, + * flashing LED2 upon successful reception of a message. Additionally, correct + * operation should be verified by running the java tool described in the following + * section. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/apps/TestCollection/TestCollectionC.nc b/apps/tosthreads/apps/TestCollection/TestCollectionC.nc index 46ed34e6..51c9bdb0 100644 --- a/apps/tosthreads/apps/TestCollection/TestCollectionC.nc +++ b/apps/tosthreads/apps/TestCollection/TestCollectionC.nc @@ -20,7 +20,30 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -/* +/** + * TestCollection is a reimplementation of the Multihop Oscilloscope application + * using TOSThreads. It periodically samples a universal software-based SineSensor + * and broadcasts a message every few readings. These readings can be displayed by + * the Java "Oscilloscope" application found in the the TestCollection/java + * subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java + * application. + * + * At least two motes must be used by this application, with one of them installed + * as a base station. Base station motes can be created by installing them with + * NODE_ID % 500 == 0. + * i.e. make threads install.0 + * make threads install.500 + * make threads install.1000 + * + * All other nodes can be installed with arbitrary NODE_IDs. + * make threads install.123 + * + * Successful running of this application is verified by all NON-base station motes + * periodically flashing LED1 upon sending a message, and the base station mote, + * flashing LED2 upon successful reception of a message. Additionally, correct + * operation should be verified by running the java tool described in the following + * section. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/apps/TestJoin/README b/apps/tosthreads/apps/TestJoin/README new file mode 100644 index 00000000..a22b29cf --- /dev/null +++ b/apps/tosthreads/apps/TestJoin/README @@ -0,0 +1,24 @@ +README for TOSThreads TestJoin +Author/Contact: tinyos-help@millennium.berkeley.edu +Author: Kevin Klues + +Description: + +TestJoin is a simple application used to test the basic functionality of +the join() system call for waiting on a set of threads in a TOSThreads +based application. + +You can install TestJoin on a mote via the following command: + make threads install + +Valid platforms are currently: tmote, telosb, iris, mica2, and micaz + +Upon a successful burn, you should first see LED0 flash twice with a period of +1s and LED1 flash 4 times with a period of 1s. After these are done, +LED2 should come on and stay on. + +Tools: + None. + +Known bugs/limitations: + None. diff --git a/apps/tosthreads/apps/TestJoin/TestJoinAppC.nc b/apps/tosthreads/apps/TestJoin/TestJoinAppC.nc index 4a8e0862..4676b021 100644 --- a/apps/tosthreads/apps/TestJoin/TestJoinAppC.nc +++ b/apps/tosthreads/apps/TestJoin/TestJoinAppC.nc @@ -30,6 +30,14 @@ */ /** + * TestJoin is a simple application used to test the basic functionality of + * the join() system call for waiting on a set of threads in a TOSThreads + * based application. + * + * Upon a successful burn, you should first see LED0 flash twice with a period of + * 1s and LED1 flash 4 times with a period of 1s. After these are done, + * LED2 should come on and stay on. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ @@ -40,13 +48,11 @@ implementation { components new ThreadC(100) as NullThread; components new ThreadC(100) as TinyThread0; components new ThreadC(100) as TinyThread1; - components new ThreadC(100) as TinyThread2; MainC.Boot <- TestJoinC; TestJoinC.NullThread -> NullThread; TestJoinC.TinyThread0 -> TinyThread0; TestJoinC.TinyThread1 -> TinyThread1; - TestJoinC.TinyThread2 -> TinyThread2; TestJoinC.Leds -> LedsC; } diff --git a/apps/tosthreads/apps/TestJoin/TestJoinC.nc b/apps/tosthreads/apps/TestJoin/TestJoinC.nc index fa8c9753..13a2c2a5 100644 --- a/apps/tosthreads/apps/TestJoin/TestJoinC.nc +++ b/apps/tosthreads/apps/TestJoin/TestJoinC.nc @@ -30,6 +30,14 @@ */ /** + * TestJoin is a simple application used to test the basic functionality of + * the join() system call for waiting on a set of threads in a TOSThreads + * based application. + * + * Upon a successful burn, you should first see LED0 flash twice with a period of + * 1s and LED1 flash 4 times with a period of 1s. After these are done, + * LED2 should come on and stay on. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ @@ -39,7 +47,6 @@ module TestJoinC { interface Thread as NullThread; interface Thread as TinyThread0; interface Thread as TinyThread1; - interface Thread as TinyThread2; interface Leds; } } @@ -53,10 +60,9 @@ implementation { for(;;){ call TinyThread0.start(NULL); call TinyThread1.start(NULL); - call TinyThread2.start(NULL); - call TinyThread1.join(); call TinyThread0.join(); - call TinyThread2.join(); + call TinyThread1.join(); + call Leds.led2Toggle(); } } event void TinyThread0.run(void* arg) { @@ -73,11 +79,4 @@ implementation { call TinyThread1.sleep(1000); } } - event void TinyThread2.run(void* arg) { - int i; - for(i=0; i<6; i++){ - call Leds.led2Toggle(); - call TinyThread2.sleep(1000); - } - } } diff --git a/apps/tosthreads/apps/TestPrintf/TestPrintfAppC.nc b/apps/tosthreads/apps/TestPrintf/TestPrintfAppC.nc index e9d8d1ac..eeb6d7d7 100644 --- a/apps/tosthreads/apps/TestPrintf/TestPrintfAppC.nc +++ b/apps/tosthreads/apps/TestPrintf/TestPrintfAppC.nc @@ -30,6 +30,10 @@ */ /** + * This application tests the operation of the Printf client in TOSThreads. It + * continuously prints the value of a counter starting at 0, increasing as it + * prints. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/apps/TestPrintf/TestPrintfC.nc b/apps/tosthreads/apps/TestPrintf/TestPrintfC.nc index 904a3919..3f308a66 100644 --- a/apps/tosthreads/apps/TestPrintf/TestPrintfC.nc +++ b/apps/tosthreads/apps/TestPrintf/TestPrintfC.nc @@ -30,6 +30,10 @@ */ /** + * This application tests the operation of the Printf client in TOSThreads. It + * continuously prints the value of a counter starting at 0, increasing as it + * prints. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/apps/TestSineSensor/TestSineSensorAppC.nc b/apps/tosthreads/apps/TestSineSensor/TestSineSensorAppC.nc index d601e09e..926a6809 100644 --- a/apps/tosthreads/apps/TestSineSensor/TestSineSensorAppC.nc +++ b/apps/tosthreads/apps/TestSineSensor/TestSineSensorAppC.nc @@ -30,6 +30,13 @@ */ /** + * This application is used to test the threaded version of the API for accessing + * the software based SineSensor usable by any platform for demonstration purposes. + * + * This application simply takes sensor readings in an infinite loop from the + * SineSensor and forwards them over the serial interface. Upon successful + * transmission, LED0 is toggled. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/apps/TestSineSensor/TestSineSensorC.nc b/apps/tosthreads/apps/TestSineSensor/TestSineSensorC.nc index f3a27773..cb97ecf8 100644 --- a/apps/tosthreads/apps/TestSineSensor/TestSineSensorC.nc +++ b/apps/tosthreads/apps/TestSineSensor/TestSineSensorC.nc @@ -30,6 +30,13 @@ */ /** + * This application is used to test the threaded version of the API for accessing + * the software based SineSensor usable by any platform for demonstration purposes. + * + * This application simply takes sensor readings in an infinite loop from the + * SineSensor and forwards them over the serial interface. Upon successful + * transmission, LED0 is toggled. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/capps/BaseStation/BaseStation.c b/apps/tosthreads/capps/BaseStation/BaseStation.c index 6aa49538..5d421a3f 100644 --- a/apps/tosthreads/capps/BaseStation/BaseStation.c +++ b/apps/tosthreads/capps/BaseStation/BaseStation.c @@ -30,7 +30,32 @@ */ /** - * Base station implementation using tosthreads + * BaseStation is a reimplementation of the standard BaseStation application using + * the TOSThreads thread library. It transparently forwards any AM messages it + * receives from its radio interface to its serial interface and vice versa. + * + *

On the serial link, BaseStation sends and receives simple active + * messages (not particular radio packets): on the radio link, it + * sends radio active messages, whose format depends on the network + * stack being used. BaseStation will copy its compiled-in group ID to + * messages moving from the serial link to the radio, and will filter + * out incoming radio messages that do not contain that group ID.

+ * + *

BaseStation includes queues in both directions, with a guarantee + * that once a message enters a queue, it will eventually leave on the + * other interface. The queues allow the BaseStation to handle load + * spikes.

+ * + *

BaseStation acknowledges a message arriving over the serial link + * only if that message was successfully enqueued for delivery to the + * radio link.

+ * + *

The LEDS are programmed to toggle as follows:

+ *
    + *
  • LED0: Message bridged from serial to radio
  • + *
  • LED1: Message bridged from radio to serial
  • + *
  • LED2: Dropped message due to queue overflow in either direction
  • + *
* * @author Kevin Klues */ diff --git a/apps/tosthreads/capps/Blink/Blink.c b/apps/tosthreads/capps/Blink/Blink.c index bcbeee06..c9e733be 100644 --- a/apps/tosthreads/capps/Blink/Blink.c +++ b/apps/tosthreads/capps/Blink/Blink.c @@ -30,6 +30,12 @@ */ /** + * Blink is a simple application used to test the basic functionality of + * TOSThreads. + * + * Upon a successful burn, you should see LED0 flashing with a period of every + * 200ms, and LED1 and LED2 flashing in unison with a period of 1000ms. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/capps/Bounce/Bounce.c b/apps/tosthreads/capps/Bounce/Bounce.c index 2d2b34eb..f0484035 100644 --- a/apps/tosthreads/capps/Bounce/Bounce.c +++ b/apps/tosthreads/capps/Bounce/Bounce.c @@ -21,6 +21,31 @@ */ /** + * This application is derived from a similar application in the TinyThread + * implementation by William P. McCartney from Cleveland State University (2006) + * + * This application stresses the operation of the thread based AM commands for + * packet transmission and reception. To run this application you will need to + * burn it on one mote with NODE_ID 0, and a second mote with NODE_ID 1. + * + * Three different threads run that each contain an infinite loop that first sends + * a message and then waits to receive a message before returning to the top of the + * loop. After each message reception, one of the onboard LEDs is toggled to + * indicate that it was received. Thread 0 blinks LED0, thread 1 blinks LED1, and + * thread 2 blinks LED2. The three threads run independently, and three different + * messages are bounced back and forth between the two motes in an unsynchronized + * fashion. In contrast to the more complicated Bounce application found in the + * normal nesC threads version of this application, once a thread receives a + * message it will immediately flip on its LED instead of waiting on a Barrier and + * synchronizing the LEDs to come on only once messages have been received from all + * threads. In this way, messages are bounced back and forth between the two motes + * in an asynchronous fashion, and LEDS are toggled immediately upon message + * reception.. + * + * Successful running of this application results in each LED bouncing back and + * forth between each mote independent of one another. This will continue in an + * finite loop forever. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/capps/Null/Null.c b/apps/tosthreads/capps/Null/Null.c index 889ffabe..87bbde51 100644 --- a/apps/tosthreads/capps/Null/Null.c +++ b/apps/tosthreads/capps/Null/Null.c @@ -21,6 +21,12 @@ */ /** + * Null is an empty skeleton application for testing the basic compilation and + * runtime of a c-based tosthreads application. It is useful to test that the build + * environment is functional in its most minimal sense, i.e., you can correctly + * compile an application. It is also useful to test the minimum power consumption + * of a node when it has absolutely no interrupts or resources active. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/capps/SenseAndSend/SenseAndSend.c b/apps/tosthreads/capps/SenseAndSend/SenseAndSend.c index 242d6503..c49a761e 100644 --- a/apps/tosthreads/capps/SenseAndSend/SenseAndSend.c +++ b/apps/tosthreads/capps/SenseAndSend/SenseAndSend.c @@ -30,6 +30,23 @@ */ /** + * SenseAndSend is a threaded implementation of an application that takes various + * sensor readings in parallel (by dedicating one thread to each reading), and + * assembling them into a packet to be sent out over the radio. It is written + * specifically for use with the tmote onboard sensor package, and will not compile + * for any other platforms. + * + * Readings are taken from each of the 4 oboard sensors and sent out over the radio + * interface in an infinite loop. Upon successful transmission, LED0 is toggled, + * and the process starts over again. + * + * A successful test will result in LED0 toggling periodically at a rate of + * approximately 220ms (the time it takes to take a humidity + temperature sensor + * reading since they share the same hardware and cannot be taken in parallel). + * + * Additionally, a base station application should be run to verify the reception + * of packets sent from a SenseAndSend mote, with reasonable looking sensor data. + * * @author Kevin Klues */ diff --git a/apps/tosthreads/capps/SenseStoreAndForward/SenseStoreAndForward.c b/apps/tosthreads/capps/SenseStoreAndForward/SenseStoreAndForward.c index 5b9e5bb2..93a75a40 100644 --- a/apps/tosthreads/capps/SenseStoreAndForward/SenseStoreAndForward.c +++ b/apps/tosthreads/capps/SenseStoreAndForward/SenseStoreAndForward.c @@ -30,6 +30,34 @@ */ /** + * SenseStoreAndForward is a threaded implementation of an application that takes + * various sensor readings in parallel (by dedicating one thread to each reading), + * logs them to flash, and then sends them out over the radio at some later time. + * In the current implementation, sensor readings are taken as quickly as possible, + * and records containing a set of readings from each iteration are batched out + * over the radio every 10000ms. This application is written specifically for use + * with the tmote onboard sensor package, and will not compile for any other + * platforms. + * + * Readings are taken from each of the 4 oboard sensors and logged to flash as one + * record in an infinite loop. Records are then read out of flash and and sent out + * over the radio interface in separate infinite loop. Before the application + * starts running, the entire contents of the flash drive are erased. + * + * A successful test will result in LED0 remaining solid for approximately 6s while + * the flash is being erased. After that LED0 will toggle with each successful set + * of sensor readings logged to flash, at a rate of approximately 220ms (the time + * it takes to take a humidity + temperature sensor reading since they share the + * same hardware and cannot be taken in parallel). Also, LED1 will begin toggling + * in rapid succession once every 10000ms as records are successfully read from + * flash and sent out over the radio. Once all of the records currently recorded + * to flash since the last batch of sends have been sent out, LED2 Toggles to + * indicate completion. This process continues in an infinite loop forever. + * + * Additionally, a base station application should be run to verify the reception + * of packets sent from a SenseStoreAndForward mote, with reasonable looking sensor + * data. + * * @author Kevin Klues */ diff --git a/apps/tosthreads/capps/TestCollection/README b/apps/tosthreads/capps/TestCollection/README index a3d90ee0..bed5de60 100644 --- a/apps/tosthreads/capps/TestCollection/README +++ b/apps/tosthreads/capps/TestCollection/README @@ -65,9 +65,4 @@ Notes: set it to 57600. Known bugs/limitations: - Warnings are issued about fan out on the 'Snoop.receive' and 'Receive.receive' - events. These warnings are harmless and are the result of providing a C based - API in which all events for receiving and snooping must be handled even if not - used by a particular application. The warnings occur because the underlying - CTP or MultihopLQI stacks wire up to particular AM ids, which are also wired - into the C API for handling message reception. + None diff --git a/apps/tosthreads/capps/TestCollection/TestCollection.c b/apps/tosthreads/capps/TestCollection/TestCollection.c index aaf811db..508c093a 100644 --- a/apps/tosthreads/capps/TestCollection/TestCollection.c +++ b/apps/tosthreads/capps/TestCollection/TestCollection.c @@ -30,6 +30,29 @@ */ /** + * TestCollection is a reimplementation of the Multihop Oscilloscope application + * using TOSThreads. It periodically samples a universal software-based SineSensor + * and broadcasts a message every few readings. These readings can be displayed by + * the Java "Oscilloscope" application found in the the TestCollection/java + * subdirectory. The sampling rate starts at 4Hz, but can be changed from the Java + * application. + * + * At least two motes must be used by this application, with one of them installed + * as a base station. Base station motes can be created by installing them with + * NODE_ID % 500 == 0. + * i.e. make threads install.0 + * make threads install.500 + * make threads install.1000 + * + * All other nodes can be installed with arbitrary NODE_IDs. + * make threads install.123 + * + * Successful running of this application is verified by all NON-base station motes + * periodically flashing LED1 upon sending a message, and the base station mote, + * flashing LED2 upon successful reception of a message. Additionally, correct + * operation should be verified by running the java tool described in the following + * section. + * * @author Kevin Klues */ diff --git a/apps/tosthreads/capps/TestJoin/README b/apps/tosthreads/capps/TestJoin/README new file mode 100644 index 00000000..a22b29cf --- /dev/null +++ b/apps/tosthreads/capps/TestJoin/README @@ -0,0 +1,24 @@ +README for TOSThreads TestJoin +Author/Contact: tinyos-help@millennium.berkeley.edu +Author: Kevin Klues + +Description: + +TestJoin is a simple application used to test the basic functionality of +the join() system call for waiting on a set of threads in a TOSThreads +based application. + +You can install TestJoin on a mote via the following command: + make threads install + +Valid platforms are currently: tmote, telosb, iris, mica2, and micaz + +Upon a successful burn, you should first see LED0 flash twice with a period of +1s and LED1 flash 4 times with a period of 1s. After these are done, +LED2 should come on and stay on. + +Tools: + None. + +Known bugs/limitations: + None. diff --git a/apps/tosthreads/capps/TestJoin/TestJoin.c b/apps/tosthreads/capps/TestJoin/TestJoin.c index 0470c414..5952d397 100644 --- a/apps/tosthreads/capps/TestJoin/TestJoin.c +++ b/apps/tosthreads/capps/TestJoin/TestJoin.c @@ -30,6 +30,14 @@ */ /** + * TestJoin is a simple application used to test the basic functionality of + * the join() system call for waiting on a set of threads in a TOSThreads + * based application. + * + * Upon a successful burn, you should first see LED0 flash twice with a period of + * 1s and LED1 flash 4 times with a period of 1s. After these are done, + * LED2 should come on and stay on. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ @@ -41,12 +49,10 @@ tosthread_t init; tosthread_t blink0; tosthread_t blink1; -tosthread_t blink2; void init_thread(void* arg); void blink0_thread(void* arg); void blink1_thread(void* arg); -void blink2_thread(void* arg); void tosthread_main(void* arg) { //Use stack estimator to calculate maximum stack size @@ -58,10 +64,9 @@ void init_thread(void* arg) { for(;;) { tosthread_create(&blink0, blink0_thread, NULL, BLINK0_STACK_SIZE); tosthread_create(&blink1, blink1_thread, NULL, BLINK1_STACK_SIZE); - tosthread_create(&blink2, blink2_thread, NULL, BLINK2_STACK_SIZE); - tosthread_join(&blink2); tosthread_join(&blink0); tosthread_join(&blink1); + led2Toggle(); } } @@ -81,10 +86,3 @@ void blink1_thread(void* arg) { } } -void blink2_thread(void* arg) { - int i; - for(i=0; i<6; i++) { - led2Toggle(); - tosthread_sleep(1000); - } -} diff --git a/apps/tosthreads/capps/TestLogStorage/TestLogStorage.c b/apps/tosthreads/capps/TestLogStorage/TestLogStorage.c index b157228a..6e48a217 100644 --- a/apps/tosthreads/capps/TestLogStorage/TestLogStorage.c +++ b/apps/tosthreads/capps/TestLogStorage/TestLogStorage.c @@ -30,6 +30,30 @@ */ /** + * TestLogStorage is a threaded implementation of an application that takes a dummy + * sensor readings of a counter, logs it flash, and then sends it out over the + * serial port at some later time. In the current implementation, each sensor reading is + * taken once every 3000ms, and records containing a set of readings from each + * iteration are batched out over the radio every 10000ms. This application is + * very similar to the SenseStoreAndForward application contained in this same + * directory, except that it is written using a dummy sensor value instead of + * sensors specific to the tmote onboard suite. In this way, the LogStorage + * functionality can be tested in conjunction with the sending facility in a + * platform independent way. + * + * Readings are taken from the dummy sensor and logged to flash as one record in an + * infinite loop. Records are then read out of flash and and sent out over the + * serial interface in separate infinite loop. Before the application starts + * running, the entire contents of the flash drive are erased. + * + * A successful test will result in LED0 remaining solid for approximately 6s while + * the flash is being erased. After that LED0 will toggle with each successful + * sensor readings logged to flash, at a rate of 3000ms. Also, LED1 will begin + * toggling in rapid succession once every 10000ms as records are successfully read + * from flash and sent out over the serial port. Once all of the records currently + * recorded to flash since the last batch of sends have been sent out, LED2 Toggles + * to indicate completion. This process continues in an infinite loop forever. + * * @author Kevin Klues */ diff --git a/apps/tosthreads/capps/TestPrintf/TestPrintf.c b/apps/tosthreads/capps/TestPrintf/TestPrintf.c index 28badaf7..e06c3308 100644 --- a/apps/tosthreads/capps/TestPrintf/TestPrintf.c +++ b/apps/tosthreads/capps/TestPrintf/TestPrintf.c @@ -30,6 +30,10 @@ */ /** + * This application tests the operation of the Printf client in TOSThreads. It + * continuously prints the value of a counter starting at 0, increasing as it + * prints. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/capps/TestSineSensor/TestSineSensor.c b/apps/tosthreads/capps/TestSineSensor/TestSineSensor.c index bf2f7d61..c6483ea6 100644 --- a/apps/tosthreads/capps/TestSineSensor/TestSineSensor.c +++ b/apps/tosthreads/capps/TestSineSensor/TestSineSensor.c @@ -30,6 +30,13 @@ */ /** + * This application is used to test the threaded version of the API for accessing + * the software based SineSensor usable by any platform for demonstration purposes. + * + * This application simply takes sensor readings in an infinite loop from the + * SineSensor and forwards them over the serial interface. Upon successful + * transmission, LED0 is toggled. + * * @author Kevin Klues */ diff --git a/apps/tosthreads/capps/ThreadStress/ThreadStress.c b/apps/tosthreads/capps/ThreadStress/ThreadStress.c index 89497382..8d26bbe3 100644 --- a/apps/tosthreads/capps/ThreadStress/ThreadStress.c +++ b/apps/tosthreads/capps/ThreadStress/ThreadStress.c @@ -30,6 +30,18 @@ */ /** + * This application stresses the creation and destruction of dynamic threads by + * spawning lots and lots of threads over and over again and letting them run to + * completion. Three different thread start functions are used, each toggling one + * of LED0, LED1, and LED2 every 256 spawnings. The time at which each LED is + * toggled is offset so that the three LEDS do not come on in unison. + * + * Successful running of this application will result in all three leds flashing at + * a rate determined by how long it takes to spawn a thread on a given platform. + * All three LEDs should flash at this rate in an infinite loop forever. Given the + * dynamics on the mote the rate may vary over time, but the important thing is + * that all three LEDs continue to toggle at a reasonably visible rate. + * * @author Kevin Klues (klueska@cs.stanford.edu) */ diff --git a/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMAppC.nc b/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMAppC.nc index 96647370..804dd46a 100644 --- a/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMAppC.nc +++ b/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMAppC.nc @@ -21,6 +21,10 @@ */ /** + * LoadFromRAM is a simple program that dynamically loads two loadable + * programs hardcoded in the byte arrays; One program is Blink, and the + * other one is Basestation. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMP.nc b/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMP.nc index 34723457..7b7e96e6 100644 --- a/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMP.nc +++ b/apps/tosthreads/tinyld/LoadFromRAM/LoadFromRAMP.nc @@ -21,6 +21,10 @@ */ /** + * LoadFromRAM is a simple program that dynamically loads two loadable + * programs hardcoded in the byte arrays; One program is Blink, and the + * other one is Basestation. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/tinyld/LoadFromRAM/README b/apps/tosthreads/tinyld/LoadFromRAM/README index b0adfb58..95a32cc5 100644 --- a/apps/tosthreads/tinyld/LoadFromRAM/README +++ b/apps/tosthreads/tinyld/LoadFromRAM/README @@ -7,5 +7,16 @@ LoadFromRAM is a simple program that dynamically loads two loadable programs hardcoded in the byte arrays; One program is Blink, and the other one is Basestation. -If you would like to generate your own loadable program: - tosthreads-gen-dynamic-app ../../capps/Blink/Blink.c +You can install LoadFromRAM on a mote via the following command: + make install + +If you would like to generate your own loadable program run, for example: + cd ../../capps/Blink + make telosb dynthreads + (the output file needed is ../../capps/Blink/build/telosb/dynthreads/main.tos) + +Tools: + None. + +Known bugs/limitations: + None. diff --git a/apps/tosthreads/tinyld/Makefile b/apps/tosthreads/tinyld/Makefile new file mode 100644 index 00000000..90989c70 --- /dev/null +++ b/apps/tosthreads/tinyld/Makefile @@ -0,0 +1,57 @@ +#-*-makefile-*- +###################################################################### +# +# Makes the entire suite of TinyOS applications for a given platform. +# +# Author: Martin Turon +# Date: August 18, 2005 +# +###################################################################### +# $Id$ + +# MAKECMDGOALS is the way to get the arguments passed into a Makefile ... +TARGET=$(MAKECMDGOALS) +NESDOC_TARGET=$(filter-out nesdoc,$(TARGET)) + +# Here is a way to get the list of subdirectories in a Makefile ... +ROOT=. +SUBDIRS := $(shell find * -type d) + +# Okay, match any target, and recurse the subdirectories +%: + @for i in $(SUBDIRS); do \ + HERE=$$PWD; \ + if [ -f $$i/Makefile ]; then \ + echo Building ... $(PWD)/$$i; \ + echo make $(TARGET); \ + cd $$i; \ + $(MAKE) $(TARGET); \ + cd $$HERE; \ + fi; \ + done + +threads: + @: +cthreads: + @: +dynthreads: + @: + +BASEDIR = $(shell pwd | sed 's@\(.*\)/apps.*$$@\1@' ) +# The output directory for generated documentation +DOCDIR = $(BASEDIR)/doc/nesdoc + +nesdoc: + @echo This target rebuilds documentation for all known platforms. + @echo It DOES NOT overwrite any existing documentation, thus, it + @echo is best run after deleting all old documentation. + @echo + @echo To delete all old documentation, delete the contents of the + @echo $(DOCDIR) directory. + @echo + @echo Press Enter to continue, or ^C to abort. + @read + for platform in `ncc -print-platforms`; do \ + $(MAKE) $$platform docs.nohtml.preserve; \ + nesdoc -o $(DOCDIR) -html -target=$$platform; \ + done diff --git a/apps/tosthreads/tinyld/SerialLoader/README b/apps/tosthreads/tinyld/SerialLoader/README index ab7ee1da..7cd3c047 100644 --- a/apps/tosthreads/tinyld/SerialLoader/README +++ b/apps/tosthreads/tinyld/SerialLoader/README @@ -11,14 +11,23 @@ Here are the steps: 1.) Load SerialLoader: make telosb install bsl, -2.) Create the loadable code, Blink.tos: - tosthreads-gen-dynamic-app ../../capps/Blink/Blink.c +2.) Create the loadable code, main.tos: + cd ../../capps/Blink + make telosb dynthreads + (the output file needed is ../../capps/Blink/build/telosb/dynthreads/main.tos) 3.) Clear the byte array in the mote RAM buffer: ./serialloader.py 0 4.) Upload the binary: - ./serialloader.py 1 Blink.tos + ./serialloader.py 1 main.tos 5.) Run the binary: ./serialloader.py 7 + +Tools: + None. + +Known bugs/limitations: + None. + diff --git a/apps/tosthreads/tinyld/SerialLoader/SerialLoaderAppC.nc b/apps/tosthreads/tinyld/SerialLoader/SerialLoaderAppC.nc index c2103e21..d9e49465 100755 --- a/apps/tosthreads/tinyld/SerialLoader/SerialLoaderAppC.nc +++ b/apps/tosthreads/tinyld/SerialLoader/SerialLoaderAppC.nc @@ -21,6 +21,10 @@ */ /** + * SerialLoader receives loadable programs from the serial port and stores + * it in a byte array. Then, when it receives the command to load the code, + * it makes the call to the dynamic loader. + * * @author Chieh-Jan Mike Liang * @author Jeongyeup Paek */ diff --git a/apps/tosthreads/tinyld/SerialLoader/SerialLoaderP.nc b/apps/tosthreads/tinyld/SerialLoader/SerialLoaderP.nc index 15b17c48..b66e2ef0 100755 --- a/apps/tosthreads/tinyld/SerialLoader/SerialLoaderP.nc +++ b/apps/tosthreads/tinyld/SerialLoader/SerialLoaderP.nc @@ -21,6 +21,10 @@ */ /** + * SerialLoader receives loadable programs from the serial port and stores + * it in a byte array. Then, when it receives the command to load the code, + * it makes the call to the dynamic loader. + * * @author Chieh-Jan Mike Liang * @author Jeongyeup Paek **/ diff --git a/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerC.nc b/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerC.nc index 88b8f007..bb9440f8 100755 --- a/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerC.nc +++ b/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerC.nc @@ -21,6 +21,11 @@ */ /** + * SerialLoaderFlash is similar to SerialLoader in that it receives + * loadable programs from the serial port. However, SerialLoaderFlash + * stores them on the external flash. Then, when it receives the command to + * load the code, it makes the call to the dynamic loader. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerP.nc b/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerP.nc index a9984204..b28855da 100755 --- a/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerP.nc +++ b/apps/tosthreads/tinyld/SerialLoaderFlash/FlashVolumeManagerP.nc @@ -21,6 +21,11 @@ */ /** + * SerialLoaderFlash is similar to SerialLoader in that it receives + * loadable programs from the serial port. However, SerialLoaderFlash + * stores them on the external flash. Then, when it receives the command to + * load the code, it makes the call to the dynamic loader. + * * @author Chieh-Jan Mike Liang */ diff --git a/apps/tosthreads/tinyld/SerialLoaderFlash/README b/apps/tosthreads/tinyld/SerialLoaderFlash/README index 3a891a00..cbeaf477 100755 --- a/apps/tosthreads/tinyld/SerialLoaderFlash/README +++ b/apps/tosthreads/tinyld/SerialLoaderFlash/README @@ -12,14 +12,23 @@ Here are the steps: 1.) Load SerialLoader: make telosb install bsl, -2.) Create the loadable code, Blink.tos: - tosthreads-gen-dynamic-app ../../capps/Blink/Blink.c +2.) Create the loadable code, main.tos: + cd ../../capps/Blink + make telosb dynthreads + (the output file needed is ../../capps/Blink/build/telosb/dynthreads/main.tos) 3.) Erase the external flash: ./serialloader.py 0 4.) Upload the binary: - ./serialloader.py 1 Blink.tos + ./serialloader.py 1 main.tos 5.) Run the binary: ./serialloader.py 7 + +Tools: + None. + +Known bugs/limitations: + None. + diff --git a/apps/tosthreads/tinyld/SerialLoaderFlash/SerialLoaderFlashAppC.nc b/apps/tosthreads/tinyld/SerialLoaderFlash/SerialLoaderFlashAppC.nc index eef04aff..e650d1f0 100755 --- a/apps/tosthreads/tinyld/SerialLoaderFlash/SerialLoaderFlashAppC.nc +++ b/apps/tosthreads/tinyld/SerialLoaderFlash/SerialLoaderFlashAppC.nc @@ -30,6 +30,11 @@ */ /** + * SerialLoaderFlash is similar to SerialLoader in that it receives + * loadable programs from the serial port. However, SerialLoaderFlash + * stores them on the external flash. Then, when it receives the command to + * load the code, it makes the call to the dynamic loader. + * * @author Kevin Klues (klueska@cs.stanford.edu) * @author Chieh-Jan Mike Liang */ -- 2.39.2