Sobre o FreeRTOS

O que é o FreeRTOS?

FreeRTOS é um sistema operacional de tempo real (RTOS - Real-Time Operating System) de código aberto, amplamente utilizado em sistemas embarcados. Ele é projetado para ser pequeno, eficiente e fácil de portar para várias arquiteturas de hardware.

Idéia Central

A ideia central do FreeRTOS é fornecer um núcleo de sistema operacional leve e eficiente que permita a criação de aplicações de tempo real, onde as tarefas precisam ser executadas dentro de prazos rígidos e previsíveis. Ele facilita a gestão de múltiplas tarefas concorrentes, a sincronização e a comunicação entre essas tarefas.

O objetivo central do FreeRTOS é oferecer um ambiente de execução robusto e determinístico para aplicações de tempo real, garantindo que as tarefas críticas sejam executadas conforme necessário, com tempos de resposta previsíveis. Ele visa atender a requisitos de sistemas embarcados que demandam alta confiabilidade e desempenho.

O kernel do FreeRTOS é desenhado para ser mínimo e modular, permitindo que ele seja executado em microcontroladores com recursos limitados (em termos de memória e poder de processamento). Isso o torna ideal para uma ampla gama de aplicações embarcadas, desde dispositivos simples até sistemas complexos.

Características Principais

Em resumo, o FreeRTOS é uma ferramenta essencial para desenvolvedores de sistemas embarcados que necessitam de um sistema operacional de tempo real eficiente e confiável para gerenciar múltiplas tarefas e garantir que as operações críticas sejam realizadas dentro de prazos específicos.

Determinismo no FreeRTOS para Aplicações de Tempo Real

O determinismo é uma característica crucial em sistemas de tempo real, onde é essencial que as operações ocorram em tempos previsíveis e consistentes. No contexto do FreeRTOS, ser determinístico significa que o comportamento do sistema (especialmente no que diz respeito à temporização e execução de tarefas) é previsível e pode ser garantido dentro de limites específicos. Aqui está uma explicação mais detalhada sobre como o FreeRTOS atinge esse determinismo:

Escalonamento de Tarefas

FreeRTOS utiliza um escalonador preemptivo baseado em prioridades para gerenciar a execução das tarefas. No escalonador preemptivo, a tarefa com a maior prioridade pronta para executar sempre será escolhida para rodar, interrompendo uma tarefa de menor prioridade se necessário. Isso assegura que tarefas críticas sejam atendidas imediatamente quando necessário.

Tempo de Troca de Contexto

A troca de contexto (o processo de salvar o estado de uma tarefa e carregar o estado de outra) no FreeRTOS é projetada para ser rápida e eficiente. O tempo de troca de contexto é consistente, o que contribui para o comportamento determinístico, já que o tempo para alternar entre tarefas é conhecido e limitado.

Sincronização e Comunicação

FreeRTOS fornece diversos mecanismos de sincronização e comunicação entre tarefas, como semáforos, mutexes, filas e timers. Estes mecanismos são implementados de forma eficiente para garantir que as operações de bloqueio e desbloqueio, bem como a troca de mensagens, ocorram em tempos previsíveis.

Temporizadores de Software

FreeRTOS oferece temporizadores de software que permitem que tarefas sejam executadas em momentos específicos no futuro ou periodicamente. Os temporizadores são gerenciados pelo kernel de uma maneira que garante que os tempos de execução especificados sejam respeitados, contribuindo para a previsibilidade do sistema.

Gerenciamento de Memória

FreeRTOS oferece várias estratégias de gerenciamento de memória, incluindo alocadores de memória determinísticos. Esses alocadores garantem que operações de alocação e liberação de memória ocorram em tempos fixos, evitando surpresas de latência associadas a fragmentação de memória ou algoritmos complexos de gerenciamento de memória.

Práticas de Design

Para garantir o determinismo, é importante que os desenvolvedores sigam práticas de design que evitem comportamentos indeterminísticos. Por exemplo, evitar tarefas que consomem muito tempo ou que têm latências imprevisíveis, dividir tarefas longas em sub-tarefas menores e garantir que as operações de bloqueio sejam curtas e previsíveis.

Priorização

A prioridade das tarefas é um aspecto crucial. As tarefas mais críticas recebem as prioridades mais altas, e o escalonador do FreeRTOS assegura que essas tarefas sejam executadas preferencialmente. Esse esquema de prioridade ajuda a manter a previsibilidade e a atender aos prazos rigorosos das tarefas de tempo real.

Interrupções

O FreeRTOS lida com interrupções de forma que os tempos de resposta a eventos externos sejam minimizados e previsíveis. As rotinas de tratamento de interrupções (ISRs - Interrupt Service Routines) devem ser curtas e rápidas, geralmente apenas sinalizando tarefas para serem executadas pelo escalonador do FreeRTOS.

Exemplo de Determinismo

Suponha que uma tarefa crítica em um sistema embarcado de controle de motor precisa ser executada a cada 10 ms. No FreeRTOS, você pode configurar essa tarefa com uma alta prioridade e usar um temporizador de software para garantir que ela seja despertada a cada 10 ms. O escalonador do FreeRTOS garantirá que, uma vez que a tarefa esteja pronta para executar (devido ao temporizador), ela interromperá quaisquer tarefas de menor prioridade e será executada imediatamente. Esse comportamento previsível é o que torna o FreeRTOS determinístico para aplicações de tempo real.

Exemplo de Multitarefa com tasks síncronas

Suponha um programa exemplo para ESP32 na qual uma task síncrona faça piscar um Led na frequência de 1 Hz e outra task síncrona simplesmente alterna o nível lógico de uma saída digital da GPIO da placa na frequência de 2 KHz (acabando por gerar uma onda Quadrada oscilando em 1 KHz). Uma terceira task deve monitorar se o usuário pressionou um botão de pressão, alternando o nível lógico de uma variável booleano que serviria para controlar se a task associada com a onda quadrada deve continuar sendo executada ou se deve ser paralizada.

Você pode implementar essas tarefas no ESP32 usando o FreeRTOS. Este exemplo poderia conter 3 tarefas:

  1. Task_LED: Faz o LED piscar com uma frequência de 1 Hz.
  2. Task_SquareWave: Gera uma onda quadrada de 1 kHz alternando o nível lógico de uma saída digital a 2 kHz.
  3. Task_Button: Monitora um botão de pressão e controla a execução da tarefa associada à onda quadrada.

Configuração do Hardware

Vamos supor que:

Código de Exemplo

Explicação do Código

  1. Configuração dos Pinos:

    • LED_PIN, SQUARE_WAVE_PIN e BUTTON_PIN são definidos para os pinos usados no LED, na saída digital e no botão, respectivamente.
  2. Inicialização do FreeRTOS:

    • xTaskCreate é usado para criar três tarefas: Task_LED, Task_SquareWave e Task_Button.
  3. Tarefa de Piscar o LED (Task_LED):

    • Esta tarefa alterna o estado do LED a cada 500 ms, resultando em uma frequência de 1 Hz.
  4. Tarefa de Geração da Onda Quadrada (Task_SquareWave):

    • Esta tarefa alterna o estado da saída digital a cada 0.5 ms, gerando uma frequência de 1 kHz.
    • A execução desta tarefa é controlada pela variável global squareWaveEnabled.
  5. Tarefa de Monitoramento do Botão (Task_Button):

    • Esta tarefa monitora o estado do botão e alterna a variável squareWaveEnabled quando o botão é pressionado.
    • Utiliza um pequeno atraso para debouncing do botão (50 ms).

Notas Finais

Este código pode ser facilmente carregado no ESP32 usando o Arduino IDE ou outro ambiente de desenvolvimento compatível.


Outras Opções