Expected idle time seems incorrect in the idle task for sleep processing

Another thought - to supplement Jeff’s. would be to start with the simplest possible task. So simple that you even get rid of the timer. You could have a single, simple task with task code that looks something like…

void extremelySimpleDelayTaskCode(  void * pvParameters  )
{
// Busy loop for X seconds
vTaskDelay(pdMS_TO_TICKS(15*1000));
}

Given this task is completely self contained (doesn’t rely on a queue or timer) you can use this to verify the time to tick calculation is correct.

Then you can build up from this and try integrating the timer you want.