Função vTaskDelayUntil()

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.

Sintaxe:

vTaskDelayUntil( <pxPreviousWakeTime>, <xTimeIncrement> );

Parâmetros da Função

  1. 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.
  2. 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.

Como Funciona

Exemplo de Uso

Vamos revisar o exemplo de uma tarefa que faz um LED piscar a 1 Hz usando vTaskDelayUntil():

Detalhamento do Funcionamento

  1. Inicialização:

    • TickType_t xLastWakeTime = xTaskGetTickCount();

      • xLastWakeTime é inicializado com o tick count atual do sistema.
  2. Primeira Execução:

    • vTaskDelayUntil(&xLastWakeTime, xFrequency);

      • Na primeira chamada, a tarefa será suspensa até que xFrequency ticks (500 ms) tenham passado desde a inicialização de xLastWakeTime.
  3. Chamadas Subsequentess:

    • vTaskDelayUntil(&xLastWakeTime, xFrequency);

      • Em cada chamada subsequente, vTaskDelayUntil() calcula o próximo tempo de execução desejado como xLastWakeTime + xFrequency.
      • Se o próximo tempo de execução for menor ou igual ao tick count atual, a função retorna imediatamente.
      • Se não, a tarefa é suspensa até que o tick count atinja o próximo tempo de execução.
      • xLastWakeTime é atualizado automaticamente com o tempo de despertar atual para a próxima iteração.

Efeito no Escalonador de Tarefas

Comparação com vTaskDelay()

Conclusão

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.

Outras Opções: