I am getting a strange behaviour out of my FreeRTOS on Xmega32D4 (AVR-GCC). Whenever there is a while loop without any vTaskDelay() and it takes a couple miliseconds to complete (for example receiving data from usart which could take as much as 30ms) I seem to get kicked out of the function earlier. For example I am supposed to receive 30B from the buffer but I only get 28B. If I add vTaskDelay(1) into the loop, everything goes fine. Same goes for a lot of other examples and not just an USART data recovery. As far as I know I am not using any watchdog timer.
What could be the cause of this?
It sounds like a logic error, or a timing error in the interaction with
the hardware. Without seeing how you are determining that the loop
should exit after 28 bytes, when you actually want 30 bytes, it will be
impossible to even guess what might be the cause. Post the code that is
determining that the loop should be exited, but even after seeing the
code it might be that we can't answer the question without also studying
the hardware manual (which we are not going to do).