Jan

I was posting a task since I didn't know whether it was safe to call release 
from within granted. After your reply, I changed the code to call release 
directly at 3 places, once in dataReady() and once each if either configure or 
getData fails. However I still see the same lockup after some time with 
Resource returning EBUSY. 

Also, in my real application I would like to use multiple ADC clients, but for 
the purpose of debugging, I used just one client and still observed this 
problem.

I also tried sampling at 50Hz and observed the problem. 

I've included the new code below:

event Timer.fired(){                      // this fires every 6ms
    result = call Resource.request();    // returns SUCCESS upto some 
non-deterministic time, during which Resource is granted and I can read ADC 
correctly, after which always returns EBUSY, no more Resource.granted events 
are signalled
}
 
task void processData(){
    .. send samples to UART
}
 
event Resource.granted(){
    if (MultiChannel.configure(&config, &memCtl, 1, buffer, BUFFER_SIZE, 0) == 
SUCCESS) 
        if (call MultiChannel.getData() != SUCCESS)
            call Resource.release();
    else 
        call Resource.release();
}
 
event MultiChannel.dataReady(bufptr){
    call Resource.release();
    ...make local copy;
    post processData();
}

Thank you
Sandip

----- Original Message ----
From: Jan Hauer <[EMAIL PROTECTED]>
To: Sandip Bapat <[EMAIL PROTECTED]>
Cc: [email protected]
Sent: Thursday, March 27, 2008 2:35:49 PM
Subject: Re: [Tinyos-help] Resource.reserve returns EBUSY forever after some 
time

You post a task to release the resource but at the same time have a
periodic timer that requests it, so there is a race condition (your
task can release it just after you requested it and you'll not get a
granted). The idea of the Resource interface is that while you want to
access the resource you must own it (must have been granted it). After
you are finished accessing the resource you can release it. The right
place for calling release is often in dataReady() when you're done or
in granted() when something with the configuration fails. In your case
if your component is the only client to the ADC then you can call
Resource.request() in Boot.booted(), continue in granted() and never
worry about the Resource interface again (ie. no need to call
release()).

Jan


      
____________________________________________________________________________________
Be a better friend, newshound, and 
know-it-all with Yahoo! Mobile.  Try it now.  
http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to