ESP32

ESP32: delay, vTaskDelay, vTaskDelayUntil, millis

ESP32 | Do bit Ao Byte | MicroPython no ESP32 | Processamento paralelo com ESP32 | Selecionar uma CPU | mutex no freertos | tasks no esp32 | FreeRTOS com ESP32 | timer com ESP32 | partições no ESP32

Considerando o feedback, acredito que os artigos relacionados à utilização dos recursos do FreeRTOS no ESP32 estão despertando bem o interesse da galera por novidades. Mas também, que não se interessaria em tirar proveito de tão bons recursos desse sistema operacional de tempo real rodando nessa maravilha com WiFi e bluetooth?

No ESP32 as coisas funcionam de uma maneira incrivelmente diferente, como você deve ter notado nos artigos anteriores. Nesse artigo quero citar 4 tipos de delays que você pode usar no ESP32, sendo um deles a implementação do Arduino e a outra, o que é comum utilizar no Arduino, mas não deveria ser utilizado no ESP32.

vTaskDelay(ticks_to_delay)

Quando queremos fazer um delay no FreeRTOS, utilizamos essa função. Ela recebe como parâmetro o número de ticks do processador a esperar, mas quando estamos programando, é mais óbvio definir o tempo de delay. Para isso, utilizamos a função pdMS_TO_TICKS, passam em milissegundos o tempo desejado de delay.

pdMS_TO_TICKS(time_in_ms)

Para passar o tempo invés dos ticks para as funções de delay, utilizamos essa função. Podemos chamá-la diretamente como parâmetro das funções vTaskDelayvTaskDelayUntil.


vTaskDelayUntil(initial_time, ticks_increment)

Eu já ví algumas necessidades de ter uma execução em “exatamente” X tempo. No Arduino é impossível conseguir essa exatidão por qualquer meio próprio, apenas por interrupção externa, porque não existe paralelismo no Arduino. Dependendo da criticidade, você pode inclusive dar mais prioridade a essa task sobre as demais. No código mais adiante você vê os exemplos.

millis

Se você estiver em um loop no Arduino e não quiser travar uma porção de código em um loop, uma opção é utilizar a função millis() a cada ciclo do loop. Porém, não haverá precisão entre os intervalos, uma vez que as instruções seguidas da função millis() podem levar tempos diferentes, ainda mais se dependerem de fatores externos, como uma comunicação remota por qualquer barramento ou protocolo. É ótima para ser utilizada no Arduino de qualquer modo, pois não trava a MCU em um loop infinito. Porém para ESP32 pode-se chamar de gambiarra se não implementar direito. Prendi a tarefa em um loop com a função millis() e o resultado não é nada bonito:

vTaskDelayUntil

Delay(ms)

No Arduino o delay disperdiça montes de ciclos, mas não processa nada. Já no ESP32, a função delay implementada na API para utilizar com a IDE do Arduino utiliza-se da vTaskDelay do FreeRTOS, suspendendo a tarefa invés de colocá-la a consumir ciclos.

vTaskDelayUntil vTaskDelay

Qual utilizar?

A única opção não recomendada é um loop baseado na função millis(). Deixe-a para quando estiver programando um Arduino. As demais são totalmente viáveis; isto é, se desejar utilizar delay(), você estará utilizando a vTaskDelay. Se estiver utilizando a vTaskDelay, estará evidenciando em seu código a utilização dos recursos do FreeRTOS e se desejar precisão absoluta, utilize a vTaskDelayUntil.

Baseado no mesmo código de exemplo dos artigos anteriores, demonstro abaixo a utilização de cada uma das funções citadas, inclusive com a prioridade maior para vTaskDelayUntil().

Se não leu os artigos anteriores e não sabe sobe as prioridades, recomendo que leia esse artigo. Nele você também verá como designar a tarefa a um núcleo qualquer do ESP32 (que é dual core, mas isso você já deve saber). Se não sabe ainda como especificar em qual núcleo executar uma tarefa, recomendo esse outro artigo. Se precisar manipular uma variável global por diferentes tasks, recomendo esse artigo sobre mutex.  Precisando passar parâmetros na task? Leia esse artigo. Se não tem ainda o suporte ao ESP32 na IDE do Arduino, sugiro esse outro artigo.

Onde comprar o ESP32?

Não tem o ESP32 ainda? Oh, que pena, não vai poder brincar agora. Mas não é tarde demais, compre um ESP32 na CurtoCircuito e acompanhe os tutoriais aqui, tem muita diversão ainda pela frente!

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!