POSIX semaphores across ISR/non-ISR contexts

John Harwell jharwell at swri.org
Thu Jun 26 16:01:34 UTC 2014


Hello,

I am using the GR712RC, and due to the way the UARTs have been routed 
out on our board, we do not have access to UART0/the RTEMS console 
driver. I have therefore created my own printk() function that simply 
writes data out to another UART. Access to the debug UART is protected 
by a binary semaphore as follows:

     if (_ISR_Nest_level == 0) {
                 sem_wait(&dbg_access_sem);
     }
     uart_write(dbg_uart,(uint8_t*)proc_buf,strlen(proc_buf));
     if (_ISR_Nest_level == 0) {
             sem_post(&dbg_access_sem);
     }

     The if statements around the semaphore functions are necessary 
because if an RTEMS task is within the uart_write() call), and an 
interrupt occurs, and the ISR happens to have a debug print statement,
, then the first uart_write() call is interrupted, and the ISR debug 
statement is seen. However, after the ISR handler returns, the original 
RTEMS task is effectively dead (no more debug statements are seen, and 
no more work is done)

The guards ensure that you do not attempt semaphore related actions 
while in an ISR context. With them, my code works as expected, but I 
would like to understand why they are necessary.

How are POSIX semaphores handled when they are shared across ISR/non-ISR 
contexts, or are they not meant to be shared in that way? Why did the 
debug statement in the ISR print, even though the original RTEMS task 
had already locked the semaphore? Why is the RTEMS task unresponsive 
after the ISR returns?

All other RTEMS tasks that I have running remain active and their debug 
statements show up without issue after the ISR returns.

I am using RTEMS 4.10.

Thanks,

John Harwell
Engineer, Southwest Research Institute



More information about the users mailing list