Obtaining Semaphore in a Interrupt?
alexandre.constantino at edisoft.pt
Wed Sep 3 15:02:36 UTC 2008
Looking at the RTEMS user manual, inside an ISR it is not possible to make blocking calls, such as rtems_semaphore_obtain.
Hence, to ensure mutual exclusion of an area accessed both by an interrupt and a task you have to disable interrupts in that region.
A semaphore cannot protect an area accessed by an ISR (because the ISR cannot block).
On Wednesday 03 September 2008, Leonard Bise wrote:
> Hi all,
> On the project I'm working on we need to protect a ressource from being
> accessed by multiple tasks.
> For this purpose we use a binary semaphore that is created in the
> following manner :
> sc = rtems_semaphore_create( rtems_build_name( 'D', 'R', 'V', 's' ), 1,
> RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY
> | RTEMS_PRIORITY,
> RTEMS_NO_PRIORITY, &semDriver );
> We use a board based on a LEON2 Processor and we use a few ISR as well.
> These ISRs must often access the same protected ressources when triggered.
> The problem arise when we are in a task that is in the middle of accessing
> the protected ressources and that it obtains the semaphore and that
> directly after an interrupt is triggered. The ISR would ask for a
> semaphore when the last one was not released yet, because it is in the
> middle of being processed. We then get a deadlock!
> Could anyone please help me on this ? I guess the best way is to not use
> semaphore in ISR but how can i protect my ressource then !
> The version used of RTEMS is 4.6.6
> Bise Léonard
More information about the users