mit block meine ich so funktionen wie delay, waitforsem usw.
Dein MainTask wird zwar vom Scheduler beim Tick unterbrochen, aber er
ist immer Ready. Du musst die Schleife mit den nops durch n Delay
ersetzen.
Grundsätzlich sollte jede Task irgend wann mal eine Funktion wie Delay
usw. ausführen. Wenn du die die FreeRTOS Doku ansiehst wird das Task
dann geblockt, und der SCheduler kann ein niedrig priores task
ausführen. im zweifel dann das IdleTask.
Solche Delay Schleifen sind mit nem Scheduler im System sowieso
überflüssig und sogar nachteilig wie du gerade merkst.
Du willst ja sachen parallel machen, dann muss jede Task der anderen
Task auch rechen zeit zugestehen.
Als beispiel für deine UDP pakete wäre z.b eine Konstruktion sinnvoll,
wie Packete im Interupt in einen Buffer schaufeln, und ne semaphore
setzen. ein Workerthread wartet auf die semaphore, und verarbeitet die
UDP packete.
wenn er fertig ist wartet er wieder auf das signal vom Interupt. (DMA
Halftransfer oder solche späße geht da auch.)