Interrupt level and Task Level Notification in Microcontroller
Imagine you have a main loop. Your code is happily running through this main loop, over and over. One of the functions is to read a pin. If that pin goes high, then something has completed, and notify the user. This is a "task level" event, and only occurs when the main loop code calls that function, and the condition is true.

An interrupt happens immediately, regardless of where the main loop code was. So say you add an interrupt for incoming serial data. The main loop code is happily running, then a serial byte comes in. BAM! The position in the main loop is saved, and execution immediately jumps to the interrupt routine. This is an "interrupt level" event. Copy the received byte to RAM, then return. The main loop's position is restored, and it goes back to processing "user-level" tasks.

Main loop "task level" functions are relatively slow, and significant time can pass before the pin state is noticed, so they are used for general-purpose functions or those that are time-insensitive. Interrupts are used mainly for time-critical events which must be handled quickly, like serial data.