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
Special use of vTaskDelayUntil()
Special use of vTaskDelayUntil()
You must re-init xLastWakeTime after you unblock from the queue.