ulTaskNotifyTake from ISR

thoru wrote on Tuesday, March 17, 2015:


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.


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?


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 );