xSempahoreTake Returns pdTRUE without Give?

phenomx wrote on Thursday, March 22, 2012:

Hi guys,

I just recently started using FreeRTOS with the MSP430, and I don’t understand why my implementation of a binary semaphore is not behaving as expected. From my understand, I first create the binary semaphore which is initially blocked until a xSemaphoreGive is done.

In the code below, I want to loop until reset_count becomes 4 within the timer interrupt vector. Only then I want to break from the while loop. the xSemaphoreTake() returns pdTRUE a give has not been given. Why is this happening? Is my understanding of semaphores wrong?

while( !reset_flag )
                    /* Checking if there any SemGive of the user semaphore */
                    if ( pdTRUE == xSemaphoreTake(xUserSemaphore, 0xFFFF))


// Timer A1 TAxCCR0 Interrupt
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR( void )
{ /* CCR0 will fire this interrupt */
	/* set flag for which timer interrupt is being used */
        signed portBASE_TYPE xHigherPriorityTaskWoken;
        if( ++reset_count == 4 )
            xHigherPriorityTaskWoken = pdFALSE;
            reset_flag = 1;


rtel wrote on Thursday, March 22, 2012:

Binary semaphores are created with the semaphore available.  Therefore the first take will succeed no matter what.  Add a call to xSemaphoreTake(xUserSemaphore, 0) immediately after the semaphore is created.  That way the semaphore will not be available until the ISR has given it, which is I think what you want.


phenomx wrote on Thursday, March 22, 2012:

Thank you for the clarification,

That was just what I needed!