Table of Contents
- Introdução: comunicação entre tarefas no FreeRTOS
- O que são Stream Buffers no FreeRTOS e como eles funcionam internamente
- Queues no FreeRTOS: modelo de dados, garantias e custos ocultos
- Stream Buffers vs Queues: comparação técnica detalhada e critérios de escolha
- Padrões de uso, boas práticas e armadilhas comuns com Stream Buffers
- Conclusão técnica e diretrizes finais de projeto
Introdução: comunicação entre tarefas no FreeRTOS
Em sistemas embarcados baseados em Real-Time Operating Systems (RTOS), a comunicação entre tarefas (tasks) e entre interrupções (ISRs – Interrupt Service Routines) é um dos pilares da arquitetura de software. No FreeRTOS, essa comunicação pode ocorrer por diversos mecanismos: queues, semaphores, event groups, task notifications e, mais recentemente, stream buffers e message buffers. Cada um desses mecanismos foi projetado para atender a padrões específicos de troca de dados, com impactos diretos em desempenho, uso de memória, latência e complexidade do código.
Historicamente, as queues foram o principal mecanismo para troca de dados entre tarefas no FreeRTOS. Elas oferecem uma semântica clara, segura e genérica, permitindo o envio de estruturas de dados completas entre produtores e consumidores. No entanto, conforme sistemas embarcados passaram a lidar com fluxos contínuos de dados — como áudio, streams de sensores, bytes vindos de UART, SPI, USB ou stacks de rede —, tornou-se evidente que o modelo tradicional de queue não era o mais eficiente para esse tipo de cenário.
É nesse contexto que surgem os Stream Buffers, introduzidos para lidar com dados orientados a fluxo, onde o mais importante não é a fronteira entre mensagens, mas sim a sequência contínua de bytes. Diferentemente das queues, que operam com itens discretos e de tamanho fixo, os stream buffers operam como um buffer circular de bytes, permitindo escrita e leitura parcial, com controle fino sobre bloqueio, timeout e sincronização entre tarefas e ISRs.
Nesta série de artigos sobre FreeRTOS, esta seção tem como objetivo introduzir formalmente o conceito de stream buffers, posicioná-los corretamente dentro do ecossistema de mecanismos de comunicação do sistema operacional e preparar o terreno para uma comparação técnica aprofundada com queues. Ao longo das próximas seções, veremos como funcionam internamente, quando usá-los, quando evitá-los e como escrever código eficiente e seguro usando esse recurso.