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.