Первый выделенный блок не освобождается. Наверное перекрестную проверку нужно изменить с
Код
xptr = tptr->prev;
if( ( xptr->next != tptr )||( mem_ptr < heap->start ) )
{ xTaskResumeScheduler();
return;
}
на
Код
xptr = tptr->prev;
if ( ((xptr != tptr) && ( xptr->next != tptr )) || ( mem_ptr < (void*)heap->start ) )
{
xTaskResumeScheduler();
return;
}