FreeRTOS é uma das peças mais importantes por trás do ESP32. Mesmo quando você escreve um código simples na Arduino IDE, existe um sistema de tarefas por baixo ajudando o microcontrolador a organizar Wi-Fi, Bluetooth, temporização e execução do programa.
🎓 ArcadeMakerBR Academy
ESP32 Essentials • Aula 12
Nível: 🟡 Intermediário inicial
Tempo de leitura: 20 a 30 minutos
Projeto sugerido: duas tarefas rodando em paralelo no ESP32
O que você vai aprender
- O que é FreeRTOS.
- Por que o ESP32 usa multitarefa.
- O que são tasks.
- Diferença entre
delay()evTaskDelay(). - Como criar tarefas no ESP32.
- Como usar os dois núcleos do ESP32.
- O que são prioridades, filas e comunicação entre tarefas.
- Erros comuns ao começar com FreeRTOS.
Índice
- Por que FreeRTOS importa?
- O que é FreeRTOS?
- O que são tasks?
- E o loop do Arduino?
- Dual core no ESP32
- Código: duas tarefas
- Fixando tarefa em um núcleo
- Filas e comunicação
- Boas práticas
- FAQ
Por que FreeRTOS importa?
Quando começamos com Arduino, normalmente pensamos em um programa como uma sequência simples: executa o setup(), depois repete o loop() para sempre.
Isso funciona muito bem para projetos pequenos. Mas quando o projeto cresce, começam os problemas: ler sensor, atualizar display, manter Wi-Fi conectado, responder botão, enviar MQTT, controlar motor e ainda evitar travamentos.
Se tudo estiver preso em um único fluxo, qualquer parte lenta pode atrapalhar o resto.
FreeRTOS ajuda exatamente nisso. Ele permite dividir o programa em tarefas independentes, cada uma com uma responsabilidade.
Dica do Maker: FreeRTOS não é obrigatório para todos os projetos, mas quando você entende tasks, fica muito mais fácil organizar projetos grandes com ESP32.
O que é FreeRTOS?
FreeRTOS é um sistema operacional de tempo real para microcontroladores. Ele é leve, muito usado em sistemas embarcados e permite trabalhar com multitarefa.
No ESP32, o FreeRTOS já faz parte da base do sistema. Isso significa que muitos recursos internos, como Wi-Fi e Bluetooth, também dependem de tarefas por baixo.
Mesmo usando Arduino IDE, você pode criar suas próprias tarefas FreeRTOS para organizar melhor o projeto.
FreeRTOS é como Windows ou Linux?
Não exatamente. Ele não é um sistema operacional completo com interface gráfica, ficheiros, janelas e utilizadores. Ele é muito mais leve e pensado para microcontroladores.
A função dele é gerir tarefas, prioridades, tempo, filas, semáforos e sincronização.
O que são tasks?
Uma task é uma função que roda como uma tarefa independente dentro do sistema.
Em vez de colocar tudo no loop(), você pode separar responsabilidades:
- Task para ler sensores.
- Task para atualizar display.
- Task para comunicação MQTT.
- Task para botões.
- Task para controle de motores.
E o loop do Arduino?
No ambiente Arduino, você continua tendo setup() e loop(). Mas no ESP32, por baixo, o próprio loop() é executado dentro de uma tarefa.
Isso significa que você pode continuar programando de forma tradicional, mas também pode criar tarefas adicionais quando o projeto precisar.
Para projetos pequenos, use loop(). Para projetos maiores, tasks podem deixar o código mais organizado.
Dual core no ESP32
O ESP32 clássico possui dois núcleos de processamento. Isso é uma das grandes vantagens da placa.
Em muitos casos, o sistema já usa um núcleo para tarefas internas e outro para o código do utilizador. Mas você também pode criar tasks e, em alguns casos, fixar uma task em um núcleo específico.
| Conceito | Explicação simples |
|---|---|
| Core 0 | Normalmente usado por várias tarefas internas do sistema, como Wi-Fi. |
| Core 1 | Muitas vezes usado para o loop Arduino e tarefas do utilizador. |
| Task pinned | Tarefa fixada para executar em um núcleo específico. |
Atenção: não fixe tarefas em núcleos sem necessidade. Para iniciantes, primeiro aprenda a criar tasks simples.
Código exemplo: duas tarefas no ESP32
O exemplo abaixo cria duas tarefas. Uma pisca um LED e outra imprime uma mensagem no Serial Monitor.
// Exemplo básico de FreeRTOS no ESP32
// ArcadeMakerBR Academy
#define LED_PIN 2
void tarefaLED(void * parameter) {
for (;;) {
digitalWrite(LED_PIN, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(LED_PIN, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void tarefaSerial(void * parameter) {
for (;;) {
Serial.println("Tarefa Serial em execução");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
xTaskCreate(tarefaLED, "Tarefa LED", 1000, NULL, 1, NULL);
xTaskCreate(tarefaSerial, "Tarefa Serial", 2000, NULL, 1, NULL);
}
void loop() {
// O loop pode ficar vazio.
}
Explicando o código
xTaskCreate()cria uma nova tarefa.- O primeiro parâmetro é a função da tarefa.
- O segundo é o nome da tarefa.
- O terceiro é o tamanho da stack.
- O quinto é a prioridade.
vTaskDelay()pausa a tarefa sem bloquear todo o sistema.
Por que usar vTaskDelay em vez de delay?
No FreeRTOS, vTaskDelay() informa ao scheduler que aquela tarefa pode ficar parada por um tempo. Enquanto isso, outras tarefas podem executar.
vTaskDelay(1000 / portTICK_PERIOD_MS);
Esse código pausa a tarefa por aproximadamente 1 segundo.
Fixando tarefa em um núcleo
O ESP32 permite criar uma tarefa fixada em um core específico usando xTaskCreatePinnedToCore().
// Exemplo: tarefa fixada no Core 1
void tarefaCore1(void * parameter) {
for (;;) {
Serial.print("Rodando no core: ");
Serial.println(xPortGetCoreID());
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
xTaskCreatePinnedToCore(
tarefaCore1,
"Tarefa Core 1",
2000,
NULL,
1,
NULL,
1
);
}
void loop() {
}
Filas: comunicação entre tarefas
Em projetos reais, uma tarefa pode precisar enviar dados para outra. Por exemplo, uma task lê sensores e outra task envia os dados por MQTT.
Uma forma organizada de fazer isso é usando filas, chamadas de queues. Uma tarefa coloca dados na fila, outra tarefa retira e processa.
Prioridades
Cada task pode ter uma prioridade. Tarefas mais importantes podem receber prioridade maior.
Mas cuidado: prioridade alta demais em uma tarefa mal escrita pode prejudicar o funcionamento do sistema.
Para iniciantes, comece com prioridades simples, como 1 ou 2, e aumente apenas quando realmente necessário.
Boas práticas com FreeRTOS no ESP32
- Não crie tasks sem necessidade.
- Evite loops infinitos sem
vTaskDelay(). - Use nomes claros para as tarefas.
- Separe responsabilidades: sensor, comunicação, display, controle.
- Não abuse de prioridades altas.
- Use queues para comunicar tarefas.
- Tenha cuidado com variáveis globais compartilhadas.
- Teste cada task separadamente antes de juntar tudo.
Erros comuns com FreeRTOS
1. Criar tarefa sem delay
Uma task com loop infinito sem pausa pode consumir CPU demais e prejudicar o sistema.
2. Stack pequena demais
Se a stack da tarefa for insuficiente, podem ocorrer travamentos ou resets inesperados.
3. Usar variáveis compartilhadas sem cuidado
Quando duas tarefas mexem na mesma variável, podem ocorrer comportamentos estranhos. Em casos avançados, use mutex ou filas.
4. Criar tasks demais
Mais tasks nem sempre significa melhor projeto. Organização é importante, mas excesso complica o debug.
5. Fixar tudo em um core sem motivo
Deixe o scheduler trabalhar, a menos que você tenha uma razão clara para fixar tarefas.
Projeto Maker: sensor + LED + comunicação
Um bom projeto para treinar FreeRTOS é dividir um sistema em três tarefas:
- Task Sensor: lê um sensor a cada segundo.
- Task LED: mostra estado do sistema piscando um LED.
- Task Comunicação: envia dados via MQTT ou Serial.
Esse tipo de arquitetura é muito usado em projetos IoT reais, porque deixa cada parte do sistema mais clara e fácil de manter.
FAQ sobre FreeRTOS no ESP32
Preciso aprender FreeRTOS para usar ESP32?
Não no início. Você pode criar muitos projetos apenas com Arduino tradicional. Mas para projetos maiores, FreeRTOS ajuda bastante.
O loop do Arduino ainda funciona?
Sim. O loop() continua funcionando normalmente. Ele roda dentro de uma tarefa no ambiente ESP32 Arduino.
FreeRTOS usa os dois cores do ESP32?
O ESP32 pode usar os dois núcleos, e o FreeRTOS ajuda a gerir tarefas entre eles. Também é possível fixar uma tarefa em um core específico.
Posso usar delay dentro de task?
Em exemplos simples pode funcionar, mas em FreeRTOS é melhor usar vTaskDelay().
Task é igual thread?
É uma ideia parecida. Para quem vem de programação desktop, uma task pode ser entendida como uma tarefa concorrente, mas em ambiente embarcado há limitações de memória e tempo real.
Resumo final
FreeRTOS é uma ferramenta poderosa para organizar projetos com ESP32. Ele permite dividir o código em tarefas, trabalhar com multitarefa, usar melhor o dual core e criar sistemas mais robustos.
Para começar, não complique. Crie duas tasks simples: uma para piscar LED e outra para imprimir mensagens. Depois avance para sensores, filas, comunicação e prioridades.
📚 Continue aprendendo
- Tudo sobre ESP32
- Tudo sobre Wi-Fi no ESP32
- Tudo sobre MQTT
- Tudo sobre Deep Sleep no ESP32
- Tudo sobre ESP32-CAM
Kit de publicação
Título SEO: Tudo sobre FreeRTOS no ESP32 – Guia Completo para Iniciantes
Slug: tudo-sobre-freertos-esp32
Meta Description: Aprenda tudo sobre FreeRTOS no ESP32: tasks, multitarefa, delays, filas, prioridades, dual core, xTaskCreatePinnedToCore e exemplos práticos.
Tags: ESP32, FreeRTOS, ESP32 FreeRTOS, Arduino, Arduino IDE, Tasks, Multitarefa, Dual Core, Filas, Queues, Semáforos, xTaskCreate, xTaskCreatePinnedToCore, IoT, Maker, Microcontroladores, Programação Embarcada
Categoria: ESP32 Academy
ALT da capa: Tudo sobre FreeRTOS no ESP32 - Guia Completo ArcadeMakerBR Academy
