Clarification on the usage of Semaphores vs task notifcations vs queues
A Task Notification is specific to a task. Each task has one, and any other task (or interrupt handler) can 'post' to it to notify that task that some event has occurred.
You don't need to configure a Task Notification - every task has one as soon as it starts up.
A Semaphore is created independently of any one particular task - it doesn't 'belong' to the task which created it. Any task can wait on any semaphore, and any task (or interrupt handler) can give to any semaphore. Multiple tasks can all wait on the same semaphore.
A Queue is sort-of like a pipe. Tasks or interrupt handlers can push things in one end and other tasks or interrupt handlers (or even the same task) can pull these things out the other end. Depending on how the queue is configured, it can often hold many things inside it at once (unlike a Task Notification which can only hold a single 32-bit value).
Many tasks can push into the same queue, and many tasks can also pull from it, but once an item gets pulled from the queue it's gone and other tasks can't get it (although FreeRTOS does offer a function to 'peek' into the queue without pulling stuff out).
Some OSes (FreeRTOS being one of them) allow you to 'jump the queue' by pushing things straight to the front of the queue (instead of to the back where they would normally go).