Guia Completo: Configuração do FreeRTOS no Cortex-M4

Este tutorial tem como objetivo apresentar os passos e conceitos fundamentais para configurar e utilizar o FreeRTOS em microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais.. A ideia é fornecer uma visão geral para que engenheiros, estudantes e entusiastas possam compreender como tirar máximo proveito de um sistema operacional de tempo real (RTOS) em aplicações de firmware embarcado.

Introdução ao RTOS em sistemas embarcados🔗

Quando trabalhamos com microcontroladores Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais., há momentos em que precisamos lidar simultaneamente com várias tarefas: leitura de sensores, comunicação serial, controle de periféricos, processamento de sinaisVisão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais., entre outros. Um RTOS (Real-Time Operating System) entra em cena para gerenciar, de forma organizada e eficiente, cada uma dessas atividades.

Benefícios principais de utilizar um RTOS:

O que é o FreeRTOS?🔗

O FreeRTOS é um RTOS de código aberto muito popular e amplamente utilizado em aplicações embarcadas, por ser leve, configurável e bem documentado. Ele oferece:

Para o Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais., o FreeRTOS é especialmente atrativo pois:

Preparando o ambiente🔗

Antes de configurar e iniciar o desenvolvimento com o FreeRTOS no Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais., é importante ter o ambiente de desenvolvimento devidamente configurado. Geralmente, utilizamos:

1. Compilador:

2. Bibliotecas de suporte:

3. Ferramentas de configuração (opcional, mas recomendável):

Com tudo configurado, podemos introduzir o FreeRTOS ao projeto, incluindo os arquivos do kernel e ajustando as defines para o microcontrolador alvo.

Configurando o FreeRTOS para Cortex-M4🔗

A principal etapa de integração do FreeRTOS envolve ajustar o arquivo de configuração do RTOS (usualmente chamado de FreeRTOSConfig.h). Nele, definimos parâmetros que afetam diretamente o funcionamento do kernel:

ParâmetroDescrição
configCPU_CLOCK_HZFrequência do clock do processador (em Hz).
configTICK_RATE_HZFrequência de tick do sistema (geralmente 1000 Hz).
configMAX_PRIORITIESNúmero máximo de prioridades de tarefas.
configMINIMAL_STACK_SIZETamanho mínimo de stack para uma tarefa.
configTOTAL_HEAP_SIZETamanho total de heap para o RTOS alocar internamente.

Além desses parâmetros, podemos habilitar ou desabilitar recursos do kernel (como uso de mutex, semáforos, co-rotinas, entre outros). Para um projeto básico, normalmente ativamos as Queues, Semáforos e Mutex.

Ajuste de interrupções e prioridades

O ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. tem um esquema de prioridades que precisa ser compatível com a forma como o FreeRTOS manipula interrupções. No arquivo FreeRTOSConfig.h, normalmente indicamos:

#define configPRIO_BITS         __NVIC_PRIO_BITS
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5

Esses valores podem variar de acordo com o fabricante do microcontrolador e a quantidade de níveis de prioridade suportada. É fundamental garantir que as prioridades de interrupçãoGerenciamento de interrupções e exceções na arquitetura ARMGerenciamento de interrupções e exceções na arquitetura ARMDescubra como o Cortex-M4 gerencia interrupções e exceções com eficiência, explorando técnicas de empilhamento automático e NVIC para sistemas embarcados. sejam compatíveis com o uso de chamadas ao RTOS em ISRs (Rotinas de InterrupçãoGerenciamento de interrupções e exceções na arquitetura ARMGerenciamento de interrupções e exceções na arquitetura ARMDescubra como o Cortex-M4 gerencia interrupções e exceções com eficiência, explorando técnicas de empilhamento automático e NVIC para sistemas embarcados.).

Criando tarefas (Tasks)🔗

No FreeRTOS, cada atividade que desejamos executar em “paralelo” ou de forma independente roda em uma tarefa distinta. Para criar uma tarefa, utilizamos a função:

BaseType_t xTaskCreate(
    TaskFunction_t pvTaskCode,
    const char * const pcName,
    configSTACK_DEPTH_TYPE usStackDepth,
    void *pvParameters,
    UBaseType_t uxPriority,
    TaskHandle_t *pxCreatedTask
);

Exemplo de uma função de tarefa

void vTaskLED(void *pvParameters)
{
    for(;;)
    {
        // Pisca LED
        ToggleLED();
        // Bloqueia a tarefa por 500ms
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

No FreeRTOS, o loop infinito for(;;) dentro de cada tarefa é de responsabilidade do programador, pois, ao contrário de ambientes com main() tradicional, cada tarefa precisa ter seu próprio ciclo de execução. O vTaskDelay() faz com que a tarefa se suspenda por um determinado período, liberando o processador para outras tarefas.

Inicialização do sistema (Scheduler)🔗

Após criar todas as tarefas desejadas (por exemplo, tarefa de LED, tarefa de leitura de sensor, etc.), iniciamos o agendador (scheduler) chamando:

vTaskStartScheduler();

A partir deste ponto, o FreeRTOS assume o controle do core do microcontrolador, alternando entre as tarefas de acordo com a prioridade e estado de cada uma (pronta, bloqueada, suspensa).

Caso o sistema chegue ao final da função vTaskStartScheduler() (o que não deveria acontecer em condições normais), significa que ocorreu algum problema relacionado à configuração de memória ou de interrupçõesGerenciamento de interrupções e exceções na arquitetura ARMGerenciamento de interrupções e exceções na arquitetura ARMDescubra como o Cortex-M4 gerencia interrupções e exceções com eficiência, explorando técnicas de empilhamento automático e NVIC para sistemas embarcados..

Recursos de sincronização e comunicação🔗

Um dos grandes benefícios do FreeRTOS é a comunicação e sincronização entre tarefas. Podemos utilizar:

  • Queues (Filas): para enviar dados de uma tarefa para outra de forma FIFO.
  • Semáforos: para gerenciar acesso concorrente a um recurso (e.g., barramento I²C).
  • Mutex: para garantir exclusão mútua em seções críticas (e.g., gravação num arquivo ou em memória compartilhada).

Exemplo de uso de fila

Imaginemos uma tarefa produtora que lê um valor de temperatura e coloca numa fila, e outra tarefa consumidora que exibe esse valor numa interface serial:

QueueHandle_t xQueueTemperatura;
void vTaskProdutora(void *pvParameters)
{
    float temperatura = 0.0f;
    for(;;)
    {
        temperatura = LerTemperaturaSensor();
        xQueueSend(xQueueTemperatura, &temperatura, portMAX_DELAY);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
void vTaskConsumidora(void *pvParameters)
{
    float temperaturaRecebida;
    for(;;)
    {
        if(xQueueReceive(xQueueTemperatura, &temperaturaRecebida, portMAX_DELAY) == pdTRUE)
        {
            EnviarParaSerial(temperaturaRecebida);
        }
    }
}

Com a fila, evitamos problemas de corrida (race conditions) e facilitamos a passagem de mensagens entre tarefas.

Dicas de otimização e boas práticas🔗

1. Defina prioridades com critério: dê prioridades mais altas às tarefas realmente críticas.

2. Monitore o uso de memória: fique atento ao uso de stack em cada tarefa e ao heap total definido em FreeRTOSConfig.h.

3. Evite bloqueios desnecessários: use vTaskDelay ou outras primitivas de forma consciente para não monopolizar a CPU.

4. Faça um dimensionamento correto do TICK RATE: valores muito altos aumentam o overhead do sistema, enquanto valores muito baixos podem prejudicar a precisão de tarefas temporizadas.

5. Verifique a compatibilidade com FPUDiferenças entre dispositivos com e sem FPU (Floating Point Unit)Diferenças entre dispositivos com e sem FPU (Floating Point Unit)Descubra como a presença ou ausência da FPU em microcontroladores ARM Cortex-M4 afeta desempenho, consumo e desenvolvimento de firmware.: se o seu Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. tiver FPU e você for realizar cálculos em ponto flutuante dentro de tarefas, habilite o suporte adequado no FreeRTOSConfig.h.

Conclusão🔗

Com o FreeRTOS, sistemas embarcados baseados em ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais. ganham enorme flexibilidade e organização, permitindo que desenvolvedores estruturados criem aplicações complexas e confiáveisMelhores práticas de proteção contra falhas e uso de watchdog timersMelhores práticas de proteção contra falhas e uso de watchdog timersSaiba como implementar watchdog timers em ARM Cortex-M4 para garantir reinicializações seguras, confiabilidade e robustez em sistemas críticos.. Através de tarefas bem definidas, sincronização via filas e semáforos, e um correto ajuste de prioridades e parâmetros de configuração, é possível ter um sistema multitarefa real, simplificando o desenvolvimento e manutenção de projetos.

O caminho para a implementação de um RTOS pode parecer desafiador à primeira vista, mas, uma vez compreendido o conceito de tarefas e a forma como o agendador (scheduler) manipula o fluxo de execução, o desenvolvimento embedded se torna mais organizado e escalável.

Referências adicionais

Próximos passos:

Com isso, finalizamos este tutorial sobre RTOS em Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Visão geral dos microcontroladores ARM Cortex-M4Descubra os microcontroladores ARM Cortex-M4, que oferecem eficiência, controle em tempo real e recursos avançados para aplicações industriais, médicas e mais.: configurando e utilizando o FreeRTOS. Esperamos que ele ofereça uma base sólida para você iniciar seus projetos com um sistema operacional de tempo real. Boas práticas, organização do código e atenção aos detalhes de configuração são fundamentais para o sucesso da aplicação!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados