Recently, I have been experiencing frequent lockups with the IRIS nodes.
I discovered that the lockup occurred in Atm128SpiP.nc, looping
infinitely on    while ( !( SPSR & 0x80 ) );

 

This bug, manifests if a task calls Resource.immediateRequest(), and an
interrupt occurs after the task calls ResourceArbiter.immediateRequest[
id ]() , but before  calling startSpi(). At this moment, the task
already has the handle for the resource and hence the ISR can also
access the resource.

If the interrupt tries to use the SPI, since it has locked the resource
it will go ahead and use the SPI, causing a lockup

I recommend encapsulating the call to immediateRequest and start SPI in
a critical section. I have commented my observations below 

 

async command error_t Resource.immediateRequest[ uint8_t id ]() 

 {

   atomic 

   {

               error_t result = call ResourceArbiter.immediateRequest[
id ]();

                   //what if i get an interrupt here and the interrupt
wants to use the SPI

                   //the resource is already allocated so it will return
TRUE. But the spi might be turned off

                   //this will cause the SPI driver to lockup waiting at
while( !( SPSR & 0x80 ) ) ;

                   if ( result == SUCCESS ) 

                   {

                                startSpi();

                   }

                   return result;

   }

}

 

Please advice 

 

Thanks,

Lewis

 

_______________________________________________
Tinyos-help mailing list
Tinyos-help@millennium.berkeley.edu
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to