rtems_semaphore_obtain

Chris Xenophontos cxenophontos at hammers.com
Mon Mar 19 16:31:16 UTC 2007


Correction, 

example is incorrect, myIsrSemId is passed as an rtems_id, not as a pointer,


thanks Eric,
cx


-----Original Message-----
From: Eric Norum [mailto:norume at aps.anl.gov] 
Sent: Monday, March 19, 2007 11:47 AM
To: Chris Xenophontos
Cc: rtems-users at rtems.org; 'Tom Phillips'
Subject: Re: rtems_semaphore_obtain

If that's really an accurate description of the code I'm amazed that  
it works at all.
rtems_semaphore_obtain and rtems_semaphore_release take an rtems_id  
as their first argument.  They do not take a pointer to an rtems_id  
as you have shown.

On Mar 19, 2007, at 9:39 AM, Chris Xenophontos wrote:

> Hello all,
>
> We have a situation, running RTEMS 4.6.0, on a Coldfire 5208.
> One of the threads (tasks) in our application pends with a one-second
> timeout on a semaphore released by an ISR.
>
> The interrupt source that triggers the ISR (for this test case)  
> runs every 3
> seconds (~3.011).  This re-creates the problem more frequently.
>
> Typically, the task will run, timeout once per second, unless the  
> ISR is
> triggered, in which case it will recognize it and process  
> accordingly.  The
> task processes critical values read from hardware that are latched  
> by the
> ISR.  99.99% of the time, it works as expected.
>
> As the ISR trigger "walks" close to the time of task timeout, we  
> see the
> back-to-back executions, as expected.
>
> However, every 10 hours or so, the task will not respond to the  
> semaphore
> released from the ISR, even though debugging clearly shows the ISR  
> responded
> to the HW interrupt and latched the hardware values.
>
> The effect is a dropped interrupt - the rtems_semaphore_obtain call  
> does not
> return with an RTEMS_SUCCESSFUL status -- it returns a TIMEOUT.  No  
> other
> RTEMS error status are returned either (we check for these well).
>
> The task, ISR, and semaphore_create function that we're using are  
> listed
> below.  Any help appreciated!!
>
> Thanks
> Chris Xenophontos
>
> ///////////// mytask//////////////////
> mytask()
> {
>     while( 1 )
>     {
>     rtems_status = rtems_semaphore_obtain( &myIsrSemId,
>                                             RTEMS_WAIT,
>                                             100 );  // 100 ticks =  
> 1 second
>
>     if(( rtems_status != RTEMS_SUCCESSFUL ) &&
>        ( rtems_ststaus != RTEMS_TIMEOUT   ))
>     {
>        // post error status ( we NEVER see an error here )
>     }
>
>     if( rtems_status == RTEMS_SUCCESSFUL )
>     {
>         // do specific processing based on semaphore released by ISR
>         ( not always seen, even though the ISR ran)
>     }
>     else
>     {
>         // specific processing based on timeout waiting for semaphore
>     }
>     }
> }
> //////////////// end mytask///////////
>
> the ISR is as follows
> ///////////////////myIsr////////////////
> myIsr()
> {
>     ( code to ack the Colfire interrupt )...
>
>     code to read 3 hardware registers....
>
>     rtems_semaphore_release( &myIsrSemId );
> }
> ///////////////myIsr///////////////////
>
> the semaphore is created as follows, and is always created  
> succesfully:
>
> status = rtems_semaphore_create( "MISR",  0,
> ( RTEMS_FIFO | RTEMS_NO_INHERIT_PRIORITY |  
> RTEMS_SIMPLE_BINARY_SEMAPHORE |
> RTEMS_NO_PRIORITY_CEILING | RTEMS_LOCAL ),
> RTEMS_NO_PRIORITY, &myIsrSemId )
>
>
> mytask is created with the following attributes:
> RTEMS_PREEMPT | RTEMS_NO_ASR | RTEMS_NO_TIMESLICE |
> RTEMS_INTERRUPT_LEVEL(0),
> RTEMS_FLOATING_POINT | RTEMS_LOCAL,
>
> thanks,cx
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users

-- 

Eric Norum <norume at aps.anl.gov>
Advanced Photon Source
Argonne National Laboratory
(630) 252-4793



More information about the users mailing list