Maybe a terminology issue. Blocking can mean it just doesn’t return until the event occurs (ADC conversion result, or whatever). In the RTOS world the meaning of Blocking is extended to mean you don’t use any CPU time while you are waiting. Not using any CPU time means other tasks (threads of execution) can run while you are waiting. Ideally then the system will be event driven so no CPU time is wasted polling and instead all CPU cycles spent have the opportunity to do something useful (which may just be to save power if there is no work to be done). Event driven implies the event (ADC conversion end interrupt for example) “unblocks” the thread that is waiting for the event by somehow signaling it to remove it from the Blocked state.