A função vTaskDelayUntil() é usada no FreeRTOS para criar tarefas síncronas que precisam ser executadas em intervalos regulares e precisos. Esta função permite que uma tarefa seja suspensa até que um período específico tenha decorrido desde a última vez que a tarefa foi executada. É especialmente útil para tarefas que precisam ser executadas periodicamente, como as que monitoram sensores ou controlam atuadores.
vTaskDelayUntil( <pxPreviousWakeTime>, <xTimeIncrement> );
pxPreviousWakeTime: Um ponteiro para uma variável do tipo TickType_t que armazena o último instante em que a tarefa foi executada. Esta variável deve ser inicializada com o valor retornado por xTaskGetTickCount() antes da primeira chamada para vTaskDelayUntil(). Nas chamadas subsequentes, o FreeRTOS atualiza automaticamente essa variável.xTimeIncrement: O intervalo de tempo em ticks do sistema que a tarefa deve esperar. Este valor especifica o período de repetição da tarefa.vTaskDelayUntil(), você deve inicializar a variável xLastWakeTime com o valor atual do tick count do sistema, obtido através de xTaskGetTickCount().xTimeIncrement ticks a partir do momento em que xLastWakeTime foi inicializada.xLastWakeTime e xTimeIncrement. A tarefa é suspensa até que este instante seja atingido, garantindo que a periodicidade da tarefa seja mantida independentemente do tempo de execução da tarefa.Vamos revisar o exemplo de uma tarefa que faz um LED piscar a 1 Hz usando vTaskDelayUntil():
xvoid Task_LED(void *pvParameters) { // Inicializar o último tempo de despertar com o tick atual TickType_t xLastWakeTime = xTaskGetTickCount(); // Definir o intervalo de tempo (500 ms para 1 Hz) const TickType_t xFrequency = pdMS_TO_TICKS(500); while (true) { // Alternar o estado do LED digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Aguardar até o próximo ciclo vTaskDelayUntil(&xLastWakeTime, xFrequency); }}Inicialização:
TickType_t xLastWakeTime = xTaskGetTickCount();
xLastWakeTime é inicializado com o tick count atual do sistema.Primeira Execução:
vTaskDelayUntil(&xLastWakeTime, xFrequency);
xFrequency ticks (500 ms) tenham passado desde a inicialização de xLastWakeTime.Chamadas Subsequentess:
vTaskDelayUntil(&xLastWakeTime, xFrequency);
vTaskDelayUntil() calcula o próximo tempo de execução desejado como xLastWakeTime + xFrequency.xLastWakeTime é atualizado automaticamente com o tempo de despertar atual para a próxima iteração.vTaskDelayUntil() ajuda a criar um comportamento determinístico nas tarefas periódicas. A função garante que as tarefas sejam executadas em intervalos precisos, mantendo a periodicidade mesmo se a tarefa anterior demorar mais do que o esperado.vTaskDelay()vTaskDelay(): Suspende a tarefa por um número especificado de ticks do sistema a partir do momento em que a função é chamada. Isso pode introduzir variação no período se a tarefa anterior demorar mais do que o esperado.vTaskDelayUntil(): Suspende a tarefa até um tempo absoluto, garantindo que a periodicidade seja mantida independentemente do tempo de execução da tarefa anterior.vTaskDelayUntil() é uma função poderosa para criar tarefas periódicas síncronas no FreeRTOS, garantindo que as tarefas sejam executadas em intervalos precisos. Isso é crucial em sistemas de tempo real onde a precisão e a previsibilidade são essenciais.