take & give semaphore

wella wrote on Thursday, December 11, 2008:

Hello,

is there a simple way, how to achieve this functionality?

void interrupt_handler_timer_A(void)
{
  xSemaphoreGiveFromISROnlyIfSemaphoreWasTakenBefore(xSemaphore);
}

void TaskA(…)
{
   startTimerA();
   stopTimerA();
  xSemaphoreTake(xSemaphore);
  exit(1); // we should never get here

}

I mean that the interrupt handler can give semaphore only if was taken before. In other cases it skips it.

Thank you for help

Martin

rtel wrote on Friday, December 12, 2008:

You could do something like this:

if( xQueueIsQueueEmptyFromISR( (xQueueHandle) xSemaphore )
{
____xSemaphoreGiveFromISR( xSemaphore );
}

be careful of race conditions though.

I don’t understand the comment “// we should never get here” in your sample task code.  It looks like you would get there as soon as the semaphore was available.

Regards.

wella wrote on Friday, December 12, 2008:

Hi Richard,

thank you for answer. The comment "// we should never get here" means, that by function stopTimerA() disables generating Timer interrupt.

Amazing function xQueueIsQueueEmptyFromISR. Exactly what I need. I didn’t find it in documentation :frowning: … I would be glad if something like MicroC/OS-II was written about FRT.

BR
Martin