Obtaining Semaphore in a Interrupt?

Alexandre Constantino 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).

Best regards,
Alexandre Constantino

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_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
> Regards,
> Bise Léonard

More information about the users mailing list