Thread safe isn't the same as interrupt safe.
If you want to call a function (that uses shared data) from an interrupt, you have do disable the interrupt whenever you are modifying the shared data.
What you seem to have been doing is putting the current thread to sleep from within an interrupt handler. This is illegal for all OS I know about.
I don't know anything about uC/OS, but calling stdio functions from interrupt routing is almost certainly illegal.
There might be something like a kernel printf() that is interrupt safe - for writes to the console.