Special use of vTaskDelayUntil()

mathias3 wrote on Monday, November 30, 2009:

Hi,

Normally vTaskDelayUntil() is used where you want to execute your task periodically with a fixed frequency. I want to run my task with a frequency of 50Hz as long as two global values are different. Then the task is blocking on a queue waiting for a command.

My problem: When executing my code like shown below I sometimes get a strange behaviour. The inner while loop which shall be executed with 50Hz repeats much too fast without any delay.

My question: When using vTaskDelayUntil() in this context the single initialization prior to the first while loop does not seem to be sufficient. Must I call xTaskGetTickCount() every time I enter the inner while loop?

Snippet:

    static portTASK_FUNCTION(vSampleTask, pvParameters) {
    portBASE_TYPE xRes;
    xTasksvTypeCommand xCmdIn;
    portTickType xLastWakeTime;
   
    // Initialize with current tick count
    xLastWakeTime = xTaskGetTickCount();
   
    // Task loop
    while (1) {
    while (global_a != global_b) {
    // Do some periodic action
    // …
    vTaskDelayUntil(&xLastWakeTime, 20 / portTICK_RATE_MS);
    }
    // Block until any command has been written to the task command queue
    xRes = xQueueReceive(xCommandQueue, &xCmdIn, portMAX_DELAY);
    if (xRes == pdPASS) {
    // Process command
    // …
    }
    }
    }

Thank you for your comments! Regards

davedoors wrote on Monday, November 30, 2009:

You must re-init xLastWakeTime after you unblock from the queue.