Сделал такую штуку для наблюдения за состоянием задач. Можно
заглядывать в TaskState и StackRemainder: volatile TaskStatus_t TaskState[8];
volatile uint16_t TaskStackRemainder[8];
void MonitorTask(void *Parameters) {
(void) Parameters;
TickType_t xLastWakeTime = xTaskGetTickCount();
for (;;) {
UBaseType_t NOT = uxTaskGetNumberOfTasks();
uxTaskGetSystemState(TaskState, 8, NULL); //Gather an information about a tasks
for (UBaseType_t TaskNum = 0; TaskNum < NOT; TaskNum++) { //Scan all tasks for stack spare space
uint16_t TaskStackFree = (uint16_t) uxTaskGetStackHighWaterMark(TaskState[TaskNum].xHandle);
TaskStackRemainder[TaskNum] = TaskStackFree;
if (TaskStackFree < 16) {
for (;;) { //ToDo: Dead loop. Not for a release.
asm volatile ("NOP");
//Alarma! Stack is too small!
}
}
}
vTaskDelayUntil(&xLastWakeTime, 1); //Repeat regularly
}
}
И вижу, что стэки в порядке. Всего 6 задач, включая Айдл и Таймер. У всех стек с запасом, проверка переполнения не срабатывает. Светодиоды по задачам мигают как должно.

Но задача, ожидающая данных из буфера, в состоянии Suspended. По идее, должна быть Blocked?
