<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>UART FreeRTOS - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/uart-freertos/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Tue, 06 Jan 2026 22:19:23 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>UART FreeRTOS - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>FreeRTOS: Stream Buffers, comparação com Queues e critérios de escolha</title>
		<link>https://mcu.tec.br/rtos/freertos-stream-buffers-comparacao-com-queues-e-criterios-de-escolha/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freertos-stream-buffers-comparacao-com-queues-e-criterios-de-escolha</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 13 Feb 2026 16:10:46 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[buffers circulares]]></category>
		<category><![CDATA[comunicação entre tarefas]]></category>
		<category><![CDATA[desempenho em tempo real]]></category>
		<category><![CDATA[freertos]]></category>
		<category><![CDATA[ISR FreeRTOS]]></category>
		<category><![CDATA[producer consumer]]></category>
		<category><![CDATA[queue FreeRTOS]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[stream buffer]]></category>
		<category><![CDATA[UART FreeRTOS]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1050</guid>

					<description><![CDATA[<p>Neste artigo técnico e didático, exploramos em profundidade o uso de Stream Buffers no FreeRTOS, explicando seu funcionamento interno, comparando-os detalhadamente com Queues e apresentando critérios claros para escolher o mecanismo correto em sistemas embarcados. O conteúdo aborda desempenho, latência, uso de memória, topologia produtor–consumidor, boas práticas, armadilhas comuns e exemplos de código em C voltados a aplicações reais como UART, sensores e pipelines de dados em tempo real.</p>
<p>The post <a href="https://mcu.tec.br/rtos/freertos-stream-buffers-comparacao-com-queues-e-criterios-de-escolha/">FreeRTOS: Stream Buffers, comparação com Queues e critérios de escolha</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-x3mpg wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-x3mpg "><div class="eb-toc-container eb-toc-x3mpg  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:3,&quot;content&quot;:&quot;Introdu\u00e7\u00e3o: comunica\u00e7\u00e3o entre tarefas no FreeRTOS&quot;,&quot;text&quot;:&quot;Introdu\u00e7\u00e3o: comunica\u00e7\u00e3o entre tarefas no FreeRTOS&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;O que s\u00e3o Stream Buffers no FreeRTOS e como eles funcionam internamente&quot;,&quot;text&quot;:&quot;O que s\u00e3o Stream Buffers no FreeRTOS e como eles funcionam internamente&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo b\u00e1sico: cria\u00e7\u00e3o de um Stream Buffer&quot;,&quot;text&quot;:&quot;Exemplo b\u00e1sico: cria\u00e7\u00e3o de um Stream Buffer&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo de escrita em uma tarefa produtora&quot;,&quot;text&quot;:&quot;Exemplo de escrita em uma tarefa produtora&quot;,&quot;link&quot;:&quot;exemplo-de-escrita-em-uma-tarefa-produtora&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo de leitura em uma tarefa consumidora&quot;,&quot;text&quot;:&quot;Exemplo de leitura em uma tarefa consumidora&quot;,&quot;link&quot;:&quot;exemplo-de-leitura-em-uma-tarefa-consumidora&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Queues no FreeRTOS: modelo de dados, garantias e custos ocultos&quot;,&quot;text&quot;:&quot;Queues no FreeRTOS: modelo de dados, garantias e custos ocultos&quot;,&quot;link&quot;:&quot;queues-no-freertos-modelo-de-dados-garantias-e-custos-ocultos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo b\u00e1sico: cria\u00e7\u00e3o de uma Queue&quot;,&quot;text&quot;:&quot;Exemplo b\u00e1sico: cria\u00e7\u00e3o de uma Queue&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Envio de dados para a Queue&quot;,&quot;text&quot;:&quot;Envio de dados para a Queue&quot;,&quot;link&quot;:&quot;envio-de-dados-para-a-queue&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Recep\u00e7\u00e3o de dados da Queue&quot;,&quot;text&quot;:&quot;Recep\u00e7\u00e3o de dados da Queue&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Custos ocultos das Queues&quot;,&quot;text&quot;:&quot;Custos ocultos das Queues&quot;,&quot;link&quot;:&quot;custos-ocultos-das-queues&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Stream Buffers vs Queues: compara\u00e7\u00e3o t\u00e9cnica detalhada e crit\u00e9rios de escolha&quot;,&quot;text&quot;:&quot;Stream Buffers vs Queues: compara\u00e7\u00e3o t\u00e9cnica detalhada e crit\u00e9rios de escolha&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o estrutural&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o estrutural&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Crit\u00e9rio 1: natureza do dado&quot;,&quot;text&quot;:&quot;Crit\u00e9rio 1: natureza do dado&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Crit\u00e9rio 2: desempenho e lat\u00eancia&quot;,&quot;text&quot;:&quot;Crit\u00e9rio 2: desempenho e lat\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Crit\u00e9rio 3: topologia produtor\u2013consumidor&quot;,&quot;text&quot;:&quot;Crit\u00e9rio 3: topologia produtor\u2013consumidor&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo comparativo: UART RX&quot;,&quot;text&quot;:&quot;Exemplo comparativo: UART RX&quot;,&quot;link&quot;:&quot;exemplo-comparativo-uart-rx&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Padr\u00f5es de uso, boas pr\u00e1ticas e armadilhas comuns com Stream Buffers&quot;,&quot;text&quot;:&quot;Padr\u00f5es de uso, boas pr\u00e1ticas e armadilhas comuns com Stream Buffers&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boa pr\u00e1tica 1: dimensionamento correto do buffer&quot;,&quot;text&quot;:&quot;Boa pr\u00e1tica 1: dimensionamento correto do buffer&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boa pr\u00e1tica 2: uso consciente do trigger level&quot;,&quot;text&quot;:&quot;Boa pr\u00e1tica 2: uso consciente do trigger level&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boa pr\u00e1tica 3: sempre respeitar o modelo 1\u21921&quot;,&quot;text&quot;:&quot;Boa pr\u00e1tica 3: sempre respeitar o modelo 1\u21921&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Armadilha 1: tratar Stream Buffer como Message Queue&quot;,&quot;text&quot;:&quot;Armadilha 1: tratar Stream Buffer como Message Queue&quot;,&quot;link&quot;:&quot;armadilha-1-tratar-stream-buffer-como-message-queue&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Armadilha 2: ignorar retornos das fun\u00e7\u00f5es&quot;,&quot;text&quot;:&quot;Armadilha 2: ignorar retornos das fun\u00e7\u00f5es&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Armadilha 3: usar delays em vez de bloqueio&quot;,&quot;text&quot;:&quot;Armadilha 3: usar delays em vez de bloqueio&quot;,&quot;link&quot;:&quot;armadilha-3-usar-delays-em-vez-de-bloqueio&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conclus\u00e3o t\u00e9cnica e diretrizes finais de projeto&quot;,&quot;text&quot;:&quot;Conclus\u00e3o t\u00e9cnica e diretrizes finais de projeto&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Introdu\u00e7\u00e3o: comunica\u00e7\u00e3o entre tarefas no FreeRTOS&quot;,&quot;value&quot;:&quot;introdu\u00e7\u00e3o-comunica\u00e7\u00e3o-entre-tarefas-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que s\u00e3o Stream Buffers no FreeRTOS e como eles funcionam internamente&quot;,&quot;value&quot;:&quot;o-que-s\u00e3o-stream-buffers-no-freertos-e-como-eles-funcionam-internamente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo b\u00e1sico: cria\u00e7\u00e3o de um Stream Buffer&quot;,&quot;value&quot;:&quot;exemplo-b\u00e1sico-cria\u00e7\u00e3o-de-um-stream-buffer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo de escrita em uma tarefa produtora&quot;,&quot;value&quot;:&quot;exemplo-de-escrita-em-uma-tarefa-produtora&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo de leitura em uma tarefa consumidora&quot;,&quot;value&quot;:&quot;exemplo-de-leitura-em-uma-tarefa-consumidora&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Queues no FreeRTOS: modelo de dados, garantias e custos ocultos&quot;,&quot;value&quot;:&quot;queues-no-freertos-modelo-de-dados-garantias-e-custos-ocultos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo b\u00e1sico: cria\u00e7\u00e3o de uma Queue&quot;,&quot;value&quot;:&quot;exemplo-b\u00e1sico-cria\u00e7\u00e3o-de-uma-queue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Envio de dados para a Queue&quot;,&quot;value&quot;:&quot;envio-de-dados-para-a-queue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Recep\u00e7\u00e3o de dados da Queue&quot;,&quot;value&quot;:&quot;recep\u00e7\u00e3o-de-dados-da-queue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Custos ocultos das Queues&quot;,&quot;value&quot;:&quot;custos-ocultos-das-queues&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Stream Buffers vs Queues: compara\u00e7\u00e3o t\u00e9cnica detalhada e crit\u00e9rios de escolha&quot;,&quot;value&quot;:&quot;stream-buffers-vs-queues-compara\u00e7\u00e3o-t\u00e9cnica-detalhada-e-crit\u00e9rios-de-escolha&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o estrutural&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-estrutural&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Crit\u00e9rio 1: natureza do dado&quot;,&quot;value&quot;:&quot;crit\u00e9rio-1-natureza-do-dado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Crit\u00e9rio 2: desempenho e lat\u00eancia&quot;,&quot;value&quot;:&quot;crit\u00e9rio-2-desempenho-e-lat\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Crit\u00e9rio 3: topologia produtor\u2013consumidor&quot;,&quot;value&quot;:&quot;crit\u00e9rio-3-topologia-produtorconsumidor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo comparativo: UART RX&quot;,&quot;value&quot;:&quot;exemplo-comparativo-uart-rx&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00f5es de uso, boas pr\u00e1ticas e armadilhas comuns com Stream Buffers&quot;,&quot;value&quot;:&quot;padr\u00f5es-de-uso-boas-pr\u00e1ticas-e-armadilhas-comuns-com-stream-buffers&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boa pr\u00e1tica 1: dimensionamento correto do buffer&quot;,&quot;value&quot;:&quot;boa-pr\u00e1tica-1-dimensionamento-correto-do-buffer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boa pr\u00e1tica 2: uso consciente do trigger level&quot;,&quot;value&quot;:&quot;boa-pr\u00e1tica-2-uso-consciente-do-trigger-level&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boa pr\u00e1tica 3: sempre respeitar o modelo 1\u21921&quot;,&quot;value&quot;:&quot;boa-pr\u00e1tica-3-sempre-respeitar-o-modelo-1\u21921&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Armadilha 1: tratar Stream Buffer como Message Queue&quot;,&quot;value&quot;:&quot;armadilha-1-tratar-stream-buffer-como-message-queue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Armadilha 2: ignorar retornos das fun\u00e7\u00f5es&quot;,&quot;value&quot;:&quot;armadilha-2-ignorar-retornos-das-fun\u00e7\u00f5es&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Armadilha 3: usar delays em vez de bloqueio&quot;,&quot;value&quot;:&quot;armadilha-3-usar-delays-em-vez-de-bloqueio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o t\u00e9cnica e diretrizes finais de projeto&quot;,&quot;value&quot;:&quot;conclus\u00e3o-t\u00e9cnica-e-diretrizes-finais-de-projeto&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Introdução: comunicação entre tarefas no FreeRTOS</a><li><a href="#eb-table-content-1">O que são Stream Buffers no FreeRTOS e como eles funcionam internamente</a><ul class="eb-toc__list"><li><a href="#eb-table-content-2">Exemplo básico: criação de um Stream Buffer</a><li><a href="#exemplo-de-escrita-em-uma-tarefa-produtora">Exemplo de escrita em uma tarefa produtora</a><li><a href="#exemplo-de-leitura-em-uma-tarefa-consumidora">Exemplo de leitura em uma tarefa consumidora</a></li></ul><li><a href="#queues-no-freertos-modelo-de-dados-garantias-e-custos-ocultos">Queues no FreeRTOS: modelo de dados, garantias e custos ocultos</a><ul class="eb-toc__list"><li><a href="#eb-table-content-6">Exemplo básico: criação de uma Queue</a><li><a href="#envio-de-dados-para-a-queue">Envio de dados para a Queue</a><li><a href="#eb-table-content-8">Recepção de dados da Queue</a><li><a href="#custos-ocultos-das-queues">Custos ocultos das Queues</a></li></ul><li><a href="#eb-table-content-10">Stream Buffers vs Queues: comparação técnica detalhada e critérios de escolha</a><ul class="eb-toc__list"><li><a href="#eb-table-content-11">Comparação estrutural</a><li><a href="#eb-table-content-12">Critério 1: natureza do dado</a><li><a href="#eb-table-content-13">Critério 2: desempenho e latência</a><li><a href="#eb-table-content-14">Critério 3: topologia produtor–consumidor</a><li><a href="#exemplo-comparativo-uart-rx">Exemplo comparativo: UART RX</a></li></ul><li><a href="#eb-table-content-16">Padrões de uso, boas práticas e armadilhas comuns com Stream Buffers</a><ul class="eb-toc__list"><li><a href="#eb-table-content-17">Boa prática 1: dimensionamento correto do buffer</a><li><a href="#eb-table-content-18">Boa prática 2: uso consciente do trigger level</a><li><a href="#eb-table-content-19">Boa prática 3: sempre respeitar o modelo 1→1</a><li><a href="#armadilha-1-tratar-stream-buffer-como-message-queue">Armadilha 1: tratar Stream Buffer como Message Queue</a><li><a href="#eb-table-content-21">Armadilha 2: ignorar retornos das funções</a><li><a href="#armadilha-3-usar-delays-em-vez-de-bloqueio">Armadilha 3: usar delays em vez de bloqueio</a></li></ul><li><a href="#eb-table-content-23">Conclusão técnica e diretrizes finais de projeto</a></ul></div></div></div></div></div>


<h3 class="wp-block-heading"><strong>Introdução: comunicação entre tarefas no FreeRTOS</strong></h3>



<p class="wp-block-paragraph">Em sistemas embarcados baseados em <em>Real-Time Operating Systems</em> (RTOS), a comunicação entre tarefas (<em>tasks</em>) e entre interrupções (<em>ISRs – Interrupt Service Routines</em>) é um dos pilares da arquitetura de software. No FreeRTOS, essa comunicação pode ocorrer por diversos mecanismos: <em>queues</em>, <em>semaphores</em>, <em>event groups</em>, <em>task notifications</em> e, mais recentemente, <em>stream buffers</em> e <em>message buffers</em>. 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.</p>



<p class="wp-block-paragraph">Historicamente, as <em>queues</em> 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 <strong>fluxos contínuos de dados</strong> — como áudio, streams de sensores, bytes vindos de UART, SPI, USB ou stacks de rede —, tornou-se evidente que o modelo tradicional de <em>queue</em> não era o mais eficiente para esse tipo de cenário.</p>



<p class="wp-block-paragraph">É nesse contexto que surgem os <strong>Stream Buffers</strong>, introduzidos para lidar com <strong>dados orientados a fluxo</strong>, onde o mais importante não é a fronteira entre mensagens, mas sim a sequência contínua de bytes. Diferentemente das <em>queues</em>, que operam com itens discretos e de tamanho fixo, os <em>stream buffers</em> operam como um <strong>buffer circular de bytes</strong>, permitindo escrita e leitura parcial, com controle fino sobre bloqueio, timeout e sincronização entre tarefas e ISRs.</p>



<p class="wp-block-paragraph">Nesta série de artigos sobre FreeRTOS, esta seção tem como objetivo introduzir formalmente o conceito de <em>stream buffers</em>, 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 <em>queues</em>. Ao longo das próximas seções, veremos <strong>como funcionam internamente</strong>, <strong>quando usá-los</strong>, <strong>quando evitá-los</strong> e <strong>como escrever código eficiente e seguro</strong> usando esse recurso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/rtos/freertos-stream-buffers-comparacao-com-queues-e-criterios-de-escolha/">FreeRTOS: Stream Buffers, comparação com Queues e critérios de escolha</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1050</post-id>	</item>
	</channel>
</rss>
