If I recall correctly, I must not put code in vApplicationIdleHook() which might block, because there is no lower priority task to execute.
I did not realize until now that means I probably should not use xSemaphoreTake() with a time greater than 0. Can I use 0? Or maybe in the implementation, it is ok to use a higher block time. Docs say the reason IdleTask should not block is because there must always be a task ready to run. What if xSemaphoreTake only blocks while a higher priority is using the same resource?