[Tinyos-help] sequences of sync and async commands, tasks

Michael Schippling schip at santafe.edu
Thu Sep 6 12:06:31 PDT 2007


Yes, you have to use globals to pass arguments to tasks, so do something
like this and set the values in your async function before posting the task:

	uint16_t  *buf;
	uint16_t buflen;

	task void SendReadingsTask1() { ... }

You can't guarantee order of task execution, but you can sequence them
by posting a new task from the end of a previous one.

MS

John Griessen wrote:
> I'm making a read-A2D-then-broadcast-send-data app.
> 
> The first thing to do in a sequence is async:
> Msp430Adc12MultiChannel.dataReady(uint16_t *buf, uint16_t buflen) is the
> next I need to do a sync function:
> call AMSend.getPayload(&pkt)
> and use buf and buflen to do some reads and writes,
> then another sync function:
> call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(MoistureSensorsMsg))
> 
> The compiler issues warnings about sync from async event, but finishes.
> The TinyOS Programming guide says to use a task...  but a task doesn't 
> seem to allow passing parameters...  how would I use the buf and buflen 
> variables?
> 
> Would you first copy buf and buflen to global variables?
> Is there a way to sequence small tasks to run in order?
> Do they automatically run in order, so results of one are available to 
> the next if put in global variables?
> 
> Here's an attempt I made to use tasks that is broken -- buf is unknown 
> inside the function, parameters don't get passed to a task:
> =======================================================
>   task void SendReadingsTask1(uint16_t  *buf, uint16_t buflen)
>     {
>     MoistureSensorsMsg* rmspkt = (MoistureSensorsMsg*) (call 
> AMSend.getPayload(&pkt));
>       //cast result of .getPayload to pointer of nx_struct 
> MoistureSensorsMsg*
>     rmspkt->nodeid = TOS_NODEID;
>     rmspkt->timestamp = timestamp;
>      if ( buflen == 12 )   // 12 Adc values in a vector, len == 12
>        {
>        rmspkt->adc00 = buf[0];
>        rmspkt->adc01 = buf[1];
>        rmspkt->adc02 = buf[2];
>        rmspkt->adc03 = buf[3];
>        rmspkt->adc04 = buf[4];
>        rmspkt->adc05 = buf[5];
>        rmspkt->adc10 = buf[6];
>        rmspkt->adc11 = buf[7];
>        rmspkt->adc12 = buf[8];
>        rmspkt->adc13 = buf[9];
>        rmspkt->adc14 = buf[10];
>        rmspkt->adc15 = buf[11];
>        //rmspkt struct is now filled with new data.
>        if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, 
> sizeof(MoistureSensorsMsg)) == SUCCESS) {
>          call Leds.led2On();  //debug aid
>          busy = TRUE;  //the data is queued to go out.
>          }
>        }
>      else
> .
> .
> .
> ======================================================
> What is the right way to handle this?
> 
> Thanks,
> 
> John Griessen

-- 
Platform: WinXP/Cygwin
TinyOS version: 1.x, Boomerang
Programmer: MIB510
Device(s): Mica2, MicaZ, Tmote
Sensor board: homebrew



More information about the Tinyos-help mailing list