ulTaskNotifyTake from ISR

thoru wrote on Tuesday, March 17, 2015:

Hi,

Is it possible to use ulTaskNotifyTake() with a zero wait time from an ISR? I want to use it as a binary semaphore to get hold of a storage buffer.

Regards,

Remco Poelstra

rtel wrote on Tuesday, March 17, 2015:

It might [unofficially] be possible, but looking at the code I would say it would depend on which port you are using…which are you using?

Regards.

heinbali01 wrote on Wednesday, March 18, 2015:

Hi Remco,

I don’t know if it is safe to call ulTaskNotifyTake() from an interrupt, but: normally the xxxTake would be called from within a task, and xxxGive from within an interrupt or a task.

Now you get an interrupt and you want to see if “a resource” is available?

Isn’t a simple volatile flag enough for this?

    #define FLAG_BUSY   1
    volatile uint32_t flags;

    void isr( void )
    {
        /* Here 'flags' is only read, not written. */
        if( ( flags & FLAG_BUSY ) == 0 )
        {
            /* Buffer is available */
        }
    }

    void update_buffer ()
    {
        flags |= FLAG_BUSY;
        /* Buffer may be accessed */
        flags &= ~( FLAG_BUSY );
    }

Regards.