norume at aps.anl.gov
Mon Mar 19 15:47:01 UTC 2007
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
> released from the ISR, even though debugging clearly shows the ISR
> 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
> RTEMS error status are returned either (we check for these well).
> The task, ISR, and semaphore_create function that we're using are
> below. Any help appreciated!!
> Chris Xenophontos
> ///////////// mytask//////////////////
> while( 1 )
> rtems_status = rtems_semaphore_obtain( &myIsrSemId,
> 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)
> // specific processing based on timeout waiting for semaphore
> //////////////// end mytask///////////
> the ISR is as follows
> ( code to ack the Colfire interrupt )...
> code to read 3 hardware registers....
> rtems_semaphore_release( &myIsrSemId );
> the semaphore is created as follows, and is always created
> 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_FLOATING_POINT | RTEMS_LOCAL,
> rtems-users mailing list
> rtems-users at rtems.com
Eric Norum <norume at aps.anl.gov>
Advanced Photon Source
Argonne National Laboratory
More information about the users