Binary Semaphores are created either full or empty depending on which function you use to create them. The vSemaphoreCreateBinary leaves the semaphore set on creation, so it is expected that the first take will work. This behavior works right if the semaphore is being used as a resource protection mechanism. If you use xSemaphore create binary, then the Semaphore is created empty, which is what you want for a syncronization semaphore like you are using.
The first usage may be better using a mutex to handle the priority inversion issue, the second can sometimes use the direct to task notification system if it will always be a particular task being notificed.