<?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>pvPortMalloc - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/pvportmalloc/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Sun, 28 Dec 2025 15:05:47 +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>pvPortMalloc - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Portabilidade do FreeRTOS e Gerenciamento de Heap: Entendendo heap_1 a heap_5 em Sistemas Embarcados</title>
		<link>https://mcu.tec.br/rtos/portabilidade-do-freertos-e-gerenciamento-de-heap-entendendo-heap_1-a-heap_5-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=portabilidade-do-freertos-e-gerenciamento-de-heap-entendendo-heap_1-a-heap_5-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 26 Dec 2025 16:07:12 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[alocação dinâmica em RTOS]]></category>
		<category><![CDATA[configTOTAL_HEAP_SIZE]]></category>
		<category><![CDATA[fragmentação de heap]]></category>
		<category><![CDATA[freertos]]></category>
		<category><![CDATA[gerenciamento de memória em sistemas embarcados]]></category>
		<category><![CDATA[heap FreeRTOS]]></category>
		<category><![CDATA[heap multi-região FreeRTOS]]></category>
		<category><![CDATA[heap_1 FreeRTOS]]></category>
		<category><![CDATA[heap_2 FreeRTOS]]></category>
		<category><![CDATA[heap_3 FreeRTOS]]></category>
		<category><![CDATA[heap_4 FreeRTOS]]></category>
		<category><![CDATA[heap_5 FreeRTOS]]></category>
		<category><![CDATA[portabilidade FreeRTOS]]></category>
		<category><![CDATA[pvPortMalloc]]></category>
		<category><![CDATA[STM32 FreeRTOS]]></category>
		<category><![CDATA[vPortFree]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1014</guid>

					<description><![CDATA[<p>Este artigo apresenta uma análise técnica e didática sobre a portabilidade do FreeRTOS com foco no seu sistema de gerenciamento de heap. São explicados em profundidade os algoritmos heap_1, heap_2, heap_3, heap_4 e heap_5, abordando suas estruturas internas, funcionamento, implicações em tempo real, fragmentação de memória e critérios de escolha em projetos embarcados. O conteúdo detalha como calcular corretamente o tamanho do heap em aplicações reais, discute o impacto da alocação dinâmica na previsibilidade temporal e relaciona o uso do heap com padrões de projeto como alocação estática e object pools. Ideal para desenvolvedores que trabalham com microcontroladores como STM32, ESP32 e RP2040 e desejam construir sistemas FreeRTOS robustos, portáveis e confiáveis.</p>
<p>The post <a href="https://mcu.tec.br/rtos/portabilidade-do-freertos-e-gerenciamento-de-heap-entendendo-heap_1-a-heap_5-em-sistemas-embarcados/">Portabilidade do FreeRTOS e Gerenciamento de Heap: Entendendo heap_1 a heap_5 em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-aioseo-table-of-contents"><ul><li><a class="aioseo-toc-item" href="#aioseo-portabilidade-no-freertos-e-por-que-o-heap-e-parte-do-contrato-do-kernel-2">Portabilidade no FreeRTOS e por que o “heap” é parte do contrato do kernel</a><ul><li><a class="aioseo-toc-item" href="#aioseo-onde-isso-aparece-na-pratica-no-seu-projeto-7">Onde isso aparece na prática no seu projeto</a></li><li><a class="aioseo-toc-item" href="#aioseo-uma-visao-rapida-do-que-cada-heap-promete-12">Uma visão rápida do que cada heap “promete”</a></li><li><a class="aioseo-toc-item" href="#aioseo-formulas-praticas-para-estimar-configtotal_heap_size-19">Fórmulas práticas para estimar configTOTAL_HEAP_SIZE</a></li><li><a class="aioseo-toc-item" href="#aioseo-exemplo-minimo-didatico-de-contabilidade-do-heap-31">Exemplo mínimo (didático) de “contabilidade” do heap</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-heap_1-heap_2-e-heap_3-algoritmos-simples-trade-offs-claros-52">heap_1, heap_2 e heap_3: algoritmos simples, trade-offs claros</a><ul><li><a class="aioseo-toc-item" href="#aioseo-2-1-heap_1-alocacao-linear-deterministica-e-sem-retorno-55">2.1 heap_1 — alocação linear, determinística e sem retorno</a><ul><li><a class="aioseo-toc-item" href="#aioseo-estrutura-interna-59">Estrutura interna</a></li><li><a class="aioseo-toc-item" href="#aioseo-algoritmo-de-alocacao-pvportmalloc-67">Algoritmo de alocação (pvPortMalloc)</a></li><li><a class="aioseo-toc-item" href="#aioseo-o-que-nao-existe-no-heap_1-76">O que não existe no heap_1</a></li><li><a class="aioseo-toc-item" href="#aioseo-propriedades-de-tempo-real-82">Propriedades de tempo real</a></li><li><a class="aioseo-toc-item" href="#aioseo-quando-usar-88">Quando usar</a></li><li><a class="aioseo-toc-item" href="#aioseo-quando-evitar-93">Quando evitar</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-2-2-heap_2-lista-de-blocos-livres-mas-sem-coalescencia-98">2.2 heap_2 — lista de blocos livres, mas sem coalescência</a><ul><li><a class="aioseo-toc-item" href="#aioseo-estrutura-interna-101">Estrutura interna</a></li><li><a class="aioseo-toc-item" href="#aioseo-alocacao-pvportmalloc-106">Alocação (pvPortMalloc)</a></li><li><a class="aioseo-toc-item" href="#aioseo-liberacao-vportfree-116">Liberação (vPortFree)</a></li><li><a class="aioseo-toc-item" href="#aioseo-propriedades-de-tempo-real-123">Propriedades de tempo real</a></li><li><a class="aioseo-toc-item" href="#aioseo-quando-usar-128">Quando usar</a></li><li><a class="aioseo-toc-item" href="#aioseo-quando-evitar-muito-importante-133">Quando evitar (muito importante)</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-2-3-heap_3-wrapper-direto-para-malloc-e-free-140">2.3 heap_3 — wrapper direto para malloc() e free()</a><ul><li><a class="aioseo-toc-item" href="#aioseo-estrutura-interna-145">Estrutura interna</a></li><li><a class="aioseo-toc-item" href="#aioseo-implicacoes-importantes-149">Implicações importantes</a></li><li><a class="aioseo-toc-item" href="#aioseo-quando-usar-156">Quando usar</a></li><li><a class="aioseo-toc-item" href="#aioseo-quando-evitar-162">Quando evitar</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-comparativo-direto-heap_1-a-heap_3-168">Comparativo direto (heap_1 a heap_3)</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-heap_4-lista-livre-com-coalescencia-e-envelhecimento-controlado-172">heap_4: lista livre com coalescência e envelhecimento controlado</a><ul><li><a class="aioseo-toc-item" href="#aioseo-3-1-estrutura-interna-do-heap_4-178">3.1 Estrutura interna do heap_4</a></li><li><a class="aioseo-toc-item" href="#aioseo-3-2-alocacao-pvportmalloc-no-heap_4-192">3.2 Alocação (pvPortMalloc) no heap_4</a><ul><li><a class="aioseo-toc-item" href="#aioseo-complexidade-temporal-208">Complexidade temporal</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-3-3-liberacao-vportfree-com-coalescencia-214">3.3 Liberação (vPortFree) com coalescência</a></li><li><a class="aioseo-toc-item" href="#aioseo-3-4-por-que-a-coalescencia-muda-tudo-229">3.4 Por que a coalescência muda tudo?</a></li><li><a class="aioseo-toc-item" href="#aioseo-3-5-overhead-e-alinhamento-no-heap_4-241">3.5 Overhead e alinhamento no heap_4</a></li><li><a class="aioseo-toc-item" href="#aioseo-3-6-monitoramento-do-heap_4-255">3.6 Monitoramento do heap_4</a></li><li><a class="aioseo-toc-item" href="#aioseo-3-7-quando-escolher-heap_4-263">3.7 Quando escolher heap_4</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-heap_5-multiplas-regioes-de-memoria-sob-um-unico-alocador-273">heap_5: múltiplas regiões de memória sob um único alocador</a><ul><li><a class="aioseo-toc-item" href="#aioseo-4-1-motivacao-real-para-o-heap_5-279">4.1 Motivação real para o heap_5</a></li><li><a class="aioseo-toc-item" href="#aioseo-4-2-estrutura-interna-do-heap_5-296">4.2 Estrutura interna do heap_5</a></li><li><a class="aioseo-toc-item" href="#aioseo-4-3-inicializacao-do-heap_5-vportdefineheapregions-303">4.3 Inicialização do heap_5 (vPortDefineHeapRegions)</a></li><li><a class="aioseo-toc-item" href="#aioseo-4-4-alocacao-e-liberacao-no-heap_5-314">4.4 Alocação e liberação no heap_5</a></li><li><a class="aioseo-toc-item" href="#aioseo-4-5-propriedades-temporais-e-fragmentacao-327">4.5 Propriedades temporais e fragmentação</a></li><li><a class="aioseo-toc-item" href="#aioseo-4-6-estrategias-praticas-de-uso-do-heap_5-336">4.6 Estratégias práticas de uso do heap_5</a><ul><li><a class="aioseo-toc-item" href="#aioseo-estrategia-1-heap-rapido-heap-grande-338">Estratégia 1 — Heap “rápido” + heap “grande”</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-4-7-quando-escolher-heap_5-353">4.7 Quando escolher heap_5</a></li><li><a class="aioseo-toc-item" href="#aioseo-comparativo-final-heap_1-a-heap_5-362">Comparativo final (heap_1 a heap_5)</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-fechamento-portabilidade-heap-e-boas-praticas-de-engenharia-em-freertos-366">Fechamento: portabilidade, heap e boas práticas de engenharia em FreeRTOS</a><ul><li><a class="aioseo-toc-item" href="#aioseo-5-1-portabilidade-do-freertos-por-que-o-heap-e-parte-do-port-369">5.1 Portabilidade do FreeRTOS: por que o heap é parte do port</a></li><li><a class="aioseo-toc-item" href="#aioseo-5-2-heap-e-padroes-de-projeto-em-sistemas-embarcados-387">5.2 Heap e padrões de projeto em sistemas embarcados</a><ul><li><a class="aioseo-toc-item" href="#aioseo-object-pool-pool-de-objetos-389">Object Pool (pool de objetos)</a></li><li><a class="aioseo-toc-item" href="#aioseo-static-allocation-alocacao-estatica-399">Static Allocation (alocação estática)</a></li><li><a class="aioseo-toc-item" href="#aioseo-message-buffers-e-stream-buffers-406">Message Buffers e Stream Buffers</a></li></ul></li><li><a class="aioseo-toc-item" href="#aioseo-5-3-erros-comuns-no-uso-do-heap-do-freertos-412">5.3 Erros comuns no uso do heap do FreeRTOS</a></li><li><a class="aioseo-toc-item" href="#aioseo-5-4-checklist-pratico-para-escolher-o-heap-421">5.4 Checklist prático para escolher o heap</a></li><li><a class="aioseo-toc-item" href="#aioseo-5-5-como-fechar-o-dimensionamento-do-heap-metodo-engenheirado-432">5.5 Como fechar o dimensionamento do heap (método engenheirado)</a></li><li><a class="aioseo-toc-item" href="#aioseo-5-6-conclusao-tecnica-444">5.6 Conclusão técnica</a></li></ul></li></ul></div>


<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading" id="aioseo-portabilidade-no-freertos-e-por-que-o-heap-e-parte-do-contrato-do-kernel-2">Portabilidade no FreeRTOS e por que o “heap” é parte do contrato do kernel</h2>



<p class="wp-block-paragraph">Quando a gente fala que o FreeRTOS é “portável”, isso não é marketing: é uma decisão de arquitetura. O kernel (scheduler, listas de tarefas, filas, timers, notificações etc.) é quase todo “C puro” e tenta depender do mínimo possível do hardware. O que muda de microcontrolador para microcontrolador (ou de compilador para compilador) fica isolado numa <strong>camada de portabilidade</strong> (os <em>ports</em>). Essa camada é a responsável por dizer ao kernel como: trocar contexto, configurar o tick, entrar/sair de regiões críticas, lidar com alinhamento de memória, e — importante aqui — <strong>como o heap do kernel será gerenciado</strong>.</p>



<p class="wp-block-paragraph">A parte “heap” do FreeRTOS é, na prática, um conjunto de <em>backends</em> alternativos para as funções <strong><code>pvPortMalloc()</code></strong> e <strong><code>vPortFree()</code></strong>. Ou seja: o kernel e as bibliotecas do FreeRTOS (e até o seu app, se você quiser) pedem memória sempre via <code>pvPortMalloc()</code> e devolvem via <code>vPortFree()</code>. Quem decide o algoritmo real por trás disso é o arquivo que você escolhe em <code>portable/MemMang/</code>: <strong><code>heap_1.c</code></strong>, <strong><code>heap_2.c</code></strong>, <strong><code>heap_3.c</code></strong>, <strong><code>heap_4.c</code></strong> ou <strong><code>heap_5.c</code></strong>.</p>



<p class="wp-block-paragraph">Isso existe porque, em sistemas embarcados e de tempo real, <strong>alocação dinâmica tem duas dores clássicas</strong>: (1) tempo não determinístico para alocar/desalocar e (2) fragmentação. O problema da fragmentação, em particular, tende a piorar com o tempo até causar falha mesmo havendo memória total livre, porque pode não existir um bloco contíguo grande o suficiente.</p>



<p class="wp-block-paragraph">A sacada do FreeRTOS é: “você escolhe o <em>trade-off</em>”. Quer algo ultra simples e previsível (mas limitado)? heap_1. Quer reaproveitar <code>malloc/free</code> da libc? heap_3. Quer minimizar fragmentação com coalescência e ter estatísticas? heap_4. Quer juntar múltiplas regiões físicas (por exemplo SRAM + CCM + SDRAM)? heap_5.</p>



<h3 class="wp-block-heading" id="aioseo-onde-isso-aparece-na-pratica-no-seu-projeto-7">Onde isso aparece na prática no seu projeto</h3>



<ol class="wp-block-list">
<li><strong><code>FreeRTOSConfig.h</code></strong> define o tamanho do heap (ex.: <code>configTOTAL_HEAP_SIZE</code>) e opções de monitoramento (ex.: <code>configUSE_MALLOC_FAILED_HOOK</code>).</li>



<li><strong><code>portable/MemMang/heap_x.c</code></strong> implementa o algoritmo. Você compila <strong>apenas um</strong> deles.</li>



<li><strong>O port</strong> (Cortex-M, RISC-V, etc.) define detalhes como alinhamento (<code>portBYTE_ALIGNMENT</code>) e macros de região crítica, que influenciam diretamente a segurança do heap em ambiente preemptivo.</li>
</ol>



<h3 class="wp-block-heading" id="aioseo-uma-visao-rapida-do-que-cada-heap-promete-12">Uma visão rápida do que cada heap “promete”</h3>



<ul class="wp-block-list">
<li><strong>heap_1:</strong> só aloca, <strong>não libera</strong>. Determinístico e perfeito para “alocar tudo no boot”.</li>



<li><strong>heap_2:</strong> aloca e libera, mas <strong>não faz coalescência</strong> de blocos adjacentes ⇒ fragmentação pode crescer.</li>



<li><strong>heap_3:</strong> wrapper para <code>malloc()</code>/<code>free()</code> da libc ⇒ facilidade máxima, controle mínimo (e determinismo depende da libc).</li>



<li><strong>heap_4:</strong> lista encadeada + <strong>coalescência</strong> (junta blocos livres adjacentes) ⇒ melhor contra fragmentação.</li>



<li><strong>heap_5:</strong> mesma ideia do heap_4, mas com <strong>múltiplas regiões</strong> (útil em MCUs com memórias separadas).</li>
</ul>



<h3 class="wp-block-heading" id="aioseo-formulas-praticas-para-estimar-configtotal_heap_size-19">Fórmulas práticas para estimar <code>configTOTAL_HEAP_SIZE</code></h3>



<p class="wp-block-paragraph">A forma correta (engenharia) é somar o <strong>pior caso</strong> de tudo que pode ser alocado do heap do FreeRTOS, adicionando overhead e folga:</p>



<p class="wp-block-paragraph"><strong>(1) Heaps consumidos por tarefas (stack + TCB)</strong><br>Se <code>S_i</code> é o <em>stack depth</em> da tarefa <code>i</code> em <em>words</em> (como normalmente é definido no FreeRTOS), e <code>W</code> é o tamanho da word (4 bytes em Cortex-M 32-bit), então:</p>



<p class="wp-block-paragraph">\[<br>M_{stack}=\sum_{i=1}^{N}(S_i \cdot W)<br>\]



<p class="wp-block-paragraph">Além disso existe o <strong>TCB</strong> (Task Control Block) de cada tarefa, que consome memória de heap quando a tarefa é criada dinamicamente (<code>xTaskCreate</code>). Como o tamanho do TCB depende de configuração/porta, você trata como:</p>



<p class="wp-block-paragraph">\[<br>M_{tcb} \approx N \cdot (TCB_{bytes})<br>\]



<p class="wp-block-paragraph"><strong>(2) Filas, semáforos, mutexes, timers, event groups, stream buffers</strong><br>Cada objeto desses tem: bloco de controle + (às vezes) buffer de dados. Exemplo para uma fila:</p>



<p class="wp-block-paragraph">\[<br>M_{queue} \approx QCB_{bytes} + (len \cdot itemSize)<br>\]



<p class="wp-block-paragraph"><strong>(3) Overhead do alocador + alinhamento + fragmentação esperada</strong><br>Em <code>heap_4</code>/<code>heap_5</code> existe overhead por bloco e alinhamento. Uma regra prática conservadora:</p>



<p class="wp-block-paragraph">\[<br>configTOTAL_HEAP_SIZE \ge M_{stack}+M_{tcb}+M_{objs} + M_{overhead} + M_{folga}<br>\]



<p class="wp-block-paragraph">onde <code>M_folga</code> costuma ser <strong>10% a 30%</strong> no protótipo (e reduz depois de medir).</p>



<p class="wp-block-paragraph">O ponto crítico: <strong>se você usa <code>heap_2</code></strong>, a folga precisa ser maior porque ele não cola blocos livres adjacentes; com o tempo, a fragmentação pode vencer você. Já <code>heap_4/5</code> tendem a envelhecer melhor porque fazem coalescência (mesma motivação dos padrões “fragmentation-free”, como pools e blocos fixos).</p>



<h3 class="wp-block-heading" id="aioseo-exemplo-minimo-didatico-de-contabilidade-do-heap-31">Exemplo mínimo (didático) de “contabilidade” do heap</h3>



<p class="wp-block-paragraph">Suponha (Cortex-M, word=4 bytes):</p>



<ul class="wp-block-list">
<li>6 tarefas com stacks: 512, 512, 384, 384, 256, 256 words</li>



<li>3 filas:
<ul class="wp-block-list">
<li>Q1: len=20 item=16 bytes</li>



<li>Q2: len=10 item=64 bytes</li>



<li>Q3: len=50 item=4 bytes</li>
</ul>
</li>



<li>1 event group, 2 mutexes, 4 timers</li>
</ul>



<p class="wp-block-paragraph">Você estimaria:</p>



<ul class="wp-block-list">
<li>\(M_{stack} = (512+512+384+384+256+256)\cdot 4 = 2304\cdot 4 = 9216\) bytes</li>



<li>Objetos: somar buffers das filas (sem ainda contar overhead):
<ul class="wp-block-list">
<li>Q1: 20·16=320</li>



<li>Q2: 10·64=640</li>



<li>Q3: 50·4=200<br>Total buffers = 1160 bytes</li>
</ul>
</li>



<li>Soma parcial ≈ 10376 bytes, e então acrescenta TCBs + overhead do heap + folga. Um <code>configTOTAL_HEAP_SIZE</code> de 16 KB pode funcionar, mas você só “fecha” isso de verdade quando começar a medir com <code>xPortGetFreeHeapSize()</code> e (se habilitar) <code>xPortGetMinimumEverFreeHeapSize()</code>.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="aioseo-heap_1-heap_2-e-heap_3-algoritmos-simples-trade-offs-claros-52">heap_1, heap_2 e heap_3: algoritmos simples, trade-offs claros</h2>



<p class="wp-block-paragraph">Nesta seção vamos <strong>abrir o código conceitualmente</strong>, quase linha a linha, para entender como funcionam os heaps mais simples do FreeRTOS. A ideia é que você consiga olhar o <code>heap_x.c</code> e reconhecer exatamente o que está acontecendo — e, mais importante, <strong>quando usar e quando evitar cada um</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-2-1-heap_1-alocacao-linear-deterministica-e-sem-retorno-55">2.1 heap_1 — alocação linear, determinística e sem retorno</h3>



<p class="wp-block-paragraph">O <strong>heap_1</strong> é o alocador mais simples possível. Ele existe para um cenário muito específico:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>“Eu aloco tudo no boot e nunca mais libero nada.”</em></p>
</blockquote>



<h4 class="wp-block-heading" id="aioseo-estrutura-interna-59">Estrutura interna</h4>



<p class="wp-block-paragraph">Internamente, o heap_1 mantém apenas:</p>



<ul class="wp-block-list">
<li>Um <strong>array estático de bytes</strong> (o heap em si)</li>



<li>Um <strong>ponteiro de topo</strong> que avança a cada alocação</li>
</ul>



<p class="wp-block-paragraph">Algo conceitualmente assim:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static uint8_t ucHeap&#91; configTOTAL_HEAP_SIZE &#93;;
static size_t xNextFreeByte = 0;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ucHeap</span><span style="color: #D8DEE9FF">&#91; </span><span style="color: #D8DEE9">configTOTAL_HEAP_SIZE</span><span style="color: #D8DEE9FF"> &#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xNextFreeByte</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Não existe lista encadeada, não existe metadado por bloco, não existe informação de “livre” ou “ocupado”. Existe apenas um ponteiro que anda para frente.</p>



<h4 class="wp-block-heading" id="aioseo-algoritmo-de-alocacao-pvportmalloc-67">Algoritmo de alocação (<code>pvPortMalloc</code>)</h4>



<p class="wp-block-paragraph">O algoritmo pode ser descrito assim:</p>



<ol class="wp-block-list">
<li>Ajusta o tamanho pedido para respeitar alinhamento (<code>portBYTE_ALIGNMENT</code>)</li>



<li>Verifica se ainda cabe no heap:<br>\[<br>xNextFreeByte + xWantedSize \le configTOTAL_HEAP_SIZE<br>\]</li>



<li>Retorna o endereço atual</li>



<li>Incrementa <code>xNextFreeByte</code></li>
</ol>



<p class="wp-block-paragraph">Pseudo-código:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void *pvPortMalloc(size_t xSize)
{
    size_t alignedSize = align(xSize);

    if ((xNextFreeByte + alignedSize) > configTOTAL_HEAP_SIZE)
        return NULL;

    void *pvReturn = &amp;ucHeap&#91;xNextFreeByte&#93;;
    xNextFreeByte += alignedSize;

    return pvReturn;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #88C0D0">pvPortMalloc</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xSize</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">alignedSize</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">align</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">xSize</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> ((</span><span style="color: #D8DEE9">xNextFreeByte</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">alignedSize</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configTOTAL_HEAP_SIZE</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvReturn</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">ucHeap</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">xNextFreeByte</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">xNextFreeByte</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">alignedSize</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pvReturn</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="aioseo-o-que-nao-existe-no-heap_1-76">O que <strong>não</strong> existe no heap_1</h4>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code>vPortFree()</code> não faz nada (ou nem existe)</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não há fragmentação (porque não há liberação)</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não há reutilização de memória</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Não há envelhecimento do heap</li>
</ul>



<h4 class="wp-block-heading" id="aioseo-propriedades-de-tempo-real-82">Propriedades de tempo real</h4>



<ul class="wp-block-list">
<li><strong>Tempo de alocação:</strong> O(1), constante</li>



<li><strong>Tempo de liberação:</strong> inexistente</li>



<li><strong>Determinismo:</strong> absoluto</li>
</ul>



<p class="wp-block-paragraph">Por isso o heap_1 é extremamente comum em <strong>sistemas safety-critical</strong> ou <strong>certificáveis</strong>, onde toda a alocação é feita na inicialização e o sistema entra em regime permanente.</p>



<h4 class="wp-block-heading" id="aioseo-quando-usar-88">Quando usar</h4>



<ul class="wp-block-list">
<li>Sistemas que criam todas as tarefas, filas e semáforos no boot</li>



<li>Aplicações com topologia fixa</li>



<li>Sistemas que <strong>não podem aceitar fragmentação sob nenhuma hipótese</strong></li>
</ul>



<h4 class="wp-block-heading" id="aioseo-quando-evitar-93">Quando evitar</h4>



<ul class="wp-block-list">
<li>Qualquer sistema que cria/destroi tarefas dinamicamente</li>



<li>Protocolos, stacks ou middleware que alocam e liberam buffers em runtime</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-2-2-heap_2-lista-de-blocos-livres-mas-sem-coalescencia-98">2.2 heap_2 — lista de blocos livres, mas sem coalescência</h3>



<p class="wp-block-paragraph">O <strong>heap_2</strong> já permite <code>free()</code>, mas faz isso de forma <strong>limitada</strong>. Ele é baseado em uma <strong>lista encadeada de blocos livres</strong>, porém <strong>não junta blocos adjacentes</strong> quando eles são liberados.</p>



<p class="wp-block-paragraph">Isso é um detalhe crítico.</p>



<h4 class="wp-block-heading" id="aioseo-estrutura-interna-101">Estrutura interna</h4>



<p class="wp-block-paragraph">Cada bloco livre tem um pequeno cabeçalho (metadado):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>typedef struct BlockLink {
    struct BlockLink *pxNextFreeBlock;
    size_t xBlockSize;
} BlockLink_t;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pxNextFreeBlock</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xBlockSize</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O heap é visto como uma lista ordenada de blocos livres, do menor endereço para o maior.</p>



<p class="wp-block-paragraph">Existe um bloco sentinela no início da lista.</p>



<h4 class="wp-block-heading" id="aioseo-alocacao-pvportmalloc-106">Alocação (<code>pvPortMalloc</code>)</h4>



<p class="wp-block-paragraph">O algoritmo segue a lógica <strong>first-fit</strong>:</p>



<ol class="wp-block-list">
<li>Ajusta tamanho para alinhamento</li>



<li>Percorre a lista de blocos livres</li>



<li>Encontra o primeiro bloco grande o suficiente</li>



<li>Remove (ou divide) o bloco</li>



<li>Retorna o endereço ao usuário</li>
</ol>



<p class="wp-block-paragraph">Pseudo-código conceitual:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>for (block = freeList; block != NULL; block = block->next) {
    if (block->size >= wantedSize) {
        if (block->size > wantedSize + headerSize) {
            splitBlock(block);
        }
        removeFromFreeList(block);
        return userPointer(block);
    }
}
return NULL;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">freeList</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">next</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wantedSize</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wantedSize</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">headerSize</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">splitBlock</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">removeFromFreeList</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">userPointer</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="aioseo-liberacao-vportfree-116">Liberação (<code>vPortFree</code>)</h4>



<p class="wp-block-paragraph">Aqui está o ponto fraco do heap_2:</p>



<ul class="wp-block-list">
<li>O bloco liberado é <strong>inserido de volta na lista</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Não há verificação se o bloco é adjacente a outro bloco livre</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Não há fusão (coalescência)</strong></li>
</ul>



<p class="wp-block-paragraph">Resultado: com o tempo, o heap pode virar um “colar de miçangas” — muitos blocos pequenos livres, mas nenhum grande o suficiente para atender uma alocação maior.</p>



<h4 class="wp-block-heading" id="aioseo-propriedades-de-tempo-real-123">Propriedades de tempo real</h4>



<ul class="wp-block-list">
<li><strong>Alocação:</strong> O(n), depende do tamanho da lista</li>



<li><strong>Liberação:</strong> O(1)</li>



<li><strong>Fragmentação:</strong> cresce com o tempo</li>
</ul>



<h4 class="wp-block-heading" id="aioseo-quando-usar-128">Quando usar</h4>



<ul class="wp-block-list">
<li>Sistemas simples</li>



<li>Poucas alocações/liberações</li>



<li>Onde o tamanho das alocações é relativamente uniforme</li>
</ul>



<h4 class="wp-block-heading" id="aioseo-quando-evitar-muito-importante-133">Quando evitar (muito importante)</h4>



<ul class="wp-block-list">
<li>Sistemas que rodam por longos períodos</li>



<li>Sistemas de comunicação (buffers variáveis)</li>



<li>Sistemas onde falhar por fragmentação é inaceitável</li>
</ul>



<p class="wp-block-paragraph">Na prática, o heap_2 hoje é mais <strong>didático</strong> do que recomendado para projetos novos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-2-3-heap_3-wrapper-direto-para-malloc-e-free-140">2.3 heap_3 — wrapper direto para <code>malloc()</code> e <code>free()</code></h3>



<p class="wp-block-paragraph">O <strong>heap_3</strong> é quase uma provocação arquitetural:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“Quer usar a libc? Então use — mas saiba o preço.”</p>
</blockquote>



<p class="wp-block-paragraph">Ele simplesmente <strong>encapsula</strong> o <code>malloc()</code> e <code>free()</code> da biblioteca C.</p>



<h4 class="wp-block-heading" id="aioseo-estrutura-interna-145">Estrutura interna</h4>



<p class="wp-block-paragraph">Não existe heap do FreeRTOS de verdade aqui. O código é algo como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void *pvPortMalloc(size_t xSize)
{
    vTaskSuspendAll();
    void *p = malloc(xSize);
    xTaskResumeAll();
    return p;
}

void vPortFree(void *pv)
{
    vTaskSuspendAll();
    free(pv);
    xTaskResumeAll();
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #88C0D0">pvPortMalloc</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xSize</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskSuspendAll</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">malloc</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">xSize</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskResumeAll</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">p</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vPortFree</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pv</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskSuspendAll</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">free</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">pv</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskResumeAll</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O FreeRTOS apenas <strong>protege a chamada</strong> contra concorrência, suspendendo o scheduler.</p>



<h4 class="wp-block-heading" id="aioseo-implicacoes-importantes-149">Implicações importantes</h4>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> O algoritmo real depende da libc (newlib, picolibc, etc.)</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> O tempo de execução é <strong>não determinístico</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Fragmentação depende da libc</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estatísticas do heap do FreeRTOS deixam de fazer sentido</li>
</ul>



<p class="wp-block-paragraph">Em microcontroladores, a libc geralmente não foi projetada com <strong>hard real-time</strong> em mente.</p>



<h4 class="wp-block-heading" id="aioseo-quando-usar-156">Quando usar</h4>



<ul class="wp-block-list">
<li>Portabilidade rápida</li>



<li>Prototipação</li>



<li>Sistemas sem requisitos temporais rígidos</li>



<li>Quando você <strong>confia plenamente</strong> na libc</li>
</ul>



<h4 class="wp-block-heading" id="aioseo-quando-evitar-162">Quando evitar</h4>



<ul class="wp-block-list">
<li>Sistemas de tempo real estrito</li>



<li>Sistemas safety-critical</li>



<li>Ambientes com pouca RAM e longa vida útil</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-comparativo-direto-heap_1-a-heap_3-168">Comparativo direto (heap_1 a heap_3)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Heap</th><th>Free</th><th>Fragmentação</th><th>Determinismo</th><th>Complexidade</th></tr></thead><tbody><tr><td>heap_1</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Excelente</td><td>Muito baixa</td></tr><tr><td>heap_2</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Média</td><td>Baixa</td></tr><tr><td>heap_3</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Depende da libc</td><td>Ruim</td><td>Depende da libc</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="aioseo-heap_4-lista-livre-com-coalescencia-e-envelhecimento-controlado-172">heap_4: lista livre com coalescência e envelhecimento controlado</h2>



<p class="wp-block-paragraph">O <strong>heap_4</strong> é, na prática, o <strong>alocador “padrão de fato” do FreeRTOS</strong> para aplicações reais. Ele resolve exatamente o maior problema do heap_2: <strong>fragmentação progressiva</strong>. A diferença conceitual central é simples, mas poderosa:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>blocos livres adjacentes são fundidos (coalescidos)</strong> quando uma liberação ocorre.</p>
</blockquote>



<p class="wp-block-paragraph">Isso muda completamente o comportamento do heap ao longo do tempo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-1-estrutura-interna-do-heap_4-178">3.1 Estrutura interna do heap_4</h3>



<p class="wp-block-paragraph">O heap_4 também é baseado em uma <strong>lista encadeada de blocos livres</strong>, mas com regras mais rígidas:</p>



<ul class="wp-block-list">
<li>A lista é <strong>ordenada por endereço</strong></li>



<li>Cada bloco contém:
<ul class="wp-block-list">
<li>tamanho total do bloco</li>



<li>ponteiro para o próximo bloco livre</li>
</ul>
</li>



<li>Existe um bloco sentinela no início</li>
</ul>



<p class="wp-block-paragraph">Estrutura conceitual:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>typedef struct BlockLink {
    struct BlockLink *pxNextFreeBlock;
    size_t xBlockSize;
} BlockLink_t;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pxNextFreeBlock</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xBlockSize</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O heap inteiro é um único bloco livre no início da execução.</p>



<p class="wp-block-paragraph">Além disso, o heap_4 usa um <strong>bit no MSB do tamanho</strong> (<code>xBlockSize</code>) para marcar se o bloco está alocado ou livre — evitando estruturas extras.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-2-alocacao-pvportmalloc-no-heap_4-192">3.2 Alocação (<code>pvPortMalloc</code>) no heap_4</h3>



<p class="wp-block-paragraph">O processo de alocação segue a lógica <strong>first-fit</strong>, com divisão de blocos:</p>



<ol class="wp-block-list">
<li>Ajusta o tamanho solicitado para alinhamento</li>



<li>Soma o overhead do cabeçalho</li>



<li>Percorre a lista livre até achar um bloco grande o suficiente</li>



<li>Se o bloco for muito maior que o pedido:
<ul class="wp-block-list">
<li>Divide em dois:
<ul class="wp-block-list">
<li>parte alocada</li>



<li>parte livre residual</li>
</ul>
</li>
</ul>
</li>



<li>Remove o bloco alocado da lista</li>



<li>Retorna o endereço ao usuário</li>
</ol>



<p class="wp-block-paragraph">Pseudo-código simplificado:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>wanted = align(size) + headerSize;

for (block = freeList; block != NULL; block = block->next) {
    if (block->size >= wanted) {
        if (block->size - wanted > MIN_BLOCK_SIZE) {
            split(block, wanted);
        }
        remove(block);
        markAllocated(block);
        return userPtr(block);
    }
}
return NULL;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">wanted</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">align</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">headerSize</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">freeList</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">next</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wanted</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wanted</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">MIN_BLOCK_SIZE</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">split</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">wanted</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">remove</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">markAllocated</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">userPtr</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading" id="aioseo-complexidade-temporal-208">Complexidade temporal</h4>



<ul class="wp-block-list">
<li><strong>Alocação:</strong> O(n), onde n é o número de blocos livres</li>



<li><strong>Determinismo:</strong> razoável, mas não absoluto</li>
</ul>



<p class="wp-block-paragraph">Em sistemas bem projetados, o número de blocos livres tende a permanecer pequeno.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-3-liberacao-vportfree-com-coalescencia-214">3.3 Liberação (<code>vPortFree</code>) com coalescência</h3>



<p class="wp-block-paragraph">Aqui está o coração do heap_4.</p>



<p class="wp-block-paragraph">Quando um bloco é liberado:</p>



<ol class="wp-block-list">
<li>O bloco é marcado como livre</li>



<li>Ele é inserido na lista <strong>na posição correta por endereço</strong></li>



<li>O algoritmo verifica:
<ul class="wp-block-list">
<li>Se o bloco anterior é adjacente → <strong>fundir</strong></li>



<li>Se o bloco seguinte é adjacente → <strong>fundir</strong></li>
</ul>
</li>



<li>O resultado pode ser um único bloco grande</li>
</ol>



<p class="wp-block-paragraph">Pseudo-código conceitual:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>insertSorted(freeList, block);

if (prevBlock is adjacent to block) {
    merge(prevBlock, block);
    block = prevBlock;
}

if (block is adjacent to nextBlock) {
    merge(block, nextBlock);
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">insertSorted</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">freeList</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">prevBlock</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">adjacent</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">merge</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">prevBlock</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">prevBlock</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">block</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">is</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">adjacent</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">to</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nextBlock</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">merge</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">block</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nextBlock</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essa fusão garante que o heap <strong>tente sempre manter o maior bloco contíguo possível</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-4-por-que-a-coalescencia-muda-tudo-229">3.4 Por que a coalescência muda tudo?</h3>



<p class="wp-block-paragraph">Sem coalescência (heap_2), a fragmentação cresce monotonicamente.<br>Com coalescência (heap_4):</p>



<ul class="wp-block-list">
<li>Fragmentação <strong>oscila</strong>, mas tende a se autocorrigir</li>



<li>Alocações grandes continuam possíveis mesmo após muitas liberações</li>



<li>O heap envelhece de forma estável</li>
</ul>



<p class="wp-block-paragraph">Esse comportamento é crucial em:</p>



<ul class="wp-block-list">
<li>Stacks de comunicação</li>



<li>Protocolos de rede (lwIP, MQTT, HTTP)</li>



<li>Sistemas que criam buffers temporários</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-5-overhead-e-alinhamento-no-heap_4-241">3.5 Overhead e alinhamento no heap_4</h3>



<p class="wp-block-paragraph">Cada bloco possui:</p>



<ul class="wp-block-list">
<li>Cabeçalho (<code>BlockLink_t</code>)</li>



<li>Alinhamento para <code>portBYTE_ALIGNMENT</code></li>
</ul>



<p class="wp-block-paragraph">Se:</p>



<ul class="wp-block-list">
<li><code>A</code> = alinhamento (ex.: 8 bytes)</li>



<li><code>H</code> = tamanho do cabeçalho</li>



<li><code>S</code> = tamanho solicitado</li>
</ul>



<p class="wp-block-paragraph">Então o tamanho real consumido no heap é:</p>



<p class="wp-block-paragraph">\[<br>S_{real} = \lceil \frac{S + H}{A} \rceil \cdot A<br>\]



<p class="wp-block-paragraph">Essa fórmula é essencial para <strong>dimensionar corretamente o heap</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-6-monitoramento-do-heap_4-255">3.6 Monitoramento do heap_4</h3>



<p class="wp-block-paragraph">O heap_4 permite métricas valiosas:</p>



<ul class="wp-block-list">
<li><code>xPortGetFreeHeapSize()</code> — memória livre atual</li>



<li><code>xPortGetMinimumEverFreeHeapSize()</code> — pior caso histórico</li>



<li><code>vApplicationMallocFailedHook()</code> — diagnóstico de falha</li>
</ul>



<p class="wp-block-paragraph">Essas métricas são fundamentais para <strong>fechar o projeto</strong> e reduzir o heap com segurança.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-3-7-quando-escolher-heap_4-263">3.7 Quando escolher heap_4</h3>



<ul class="wp-block-list">
<li>Sistemas embarcados reais</li>



<li>Comunicação dinâmica</li>



<li>Longa vida útil</li>



<li>RAM limitada</li>



<li>Necessidade de previsibilidade razoável sem abrir mão de flexibilidade</li>
</ul>



<p class="wp-block-paragraph">Na prática: <strong>se você não tem um motivo muito forte para não usar, use heap_4</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="aioseo-heap_5-multiplas-regioes-de-memoria-sob-um-unico-alocador-273">heap_5: múltiplas regiões de memória sob um único alocador</h2>



<p class="wp-block-paragraph">O <strong>heap_5</strong> é, conceitualmente, uma <strong>extensão direta do heap_4</strong>. Ele mantém exatamente o mesmo algoritmo de alocação, liberação e <strong>coalescência</strong>, mas adiciona uma capacidade crucial para microcontroladores modernos:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>usar várias regiões físicas de memória como se fossem um único heap lógico</strong>.</p>
</blockquote>



<p class="wp-block-paragraph">Isso é extremamente relevante em MCUs como <strong>STM32F4/F7/H7</strong>, que podem ter SRAM principal, CCM (Core Coupled Memory), SRAM DTCM/ITCM, e até <strong>SDRAM externa</strong>, todas com características diferentes de latência, largura de barramento e acesso por DMA.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-1-motivacao-real-para-o-heap_5-279">4.1 Motivação real para o heap_5</h3>



<p class="wp-block-paragraph">Em muitos microcontroladores:</p>



<ul class="wp-block-list">
<li>Nem toda memória é:
<ul class="wp-block-list">
<li>acessível por DMA</li>



<li>cacheável</li>



<li>rápida</li>
</ul>
</li>



<li>Algumas regiões são ideais para:
<ul class="wp-block-list">
<li>stacks de tarefas críticas</li>



<li>buffers temporários</li>
</ul>
</li>



<li>Outras são melhores para:
<ul class="wp-block-list">
<li>grandes buffers (lwIP, vídeo, áudio, arquivos)</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">O problema: <strong>heap_4 só trabalha com uma região contígua</strong>.<br>O heap_5 resolve isso permitindo <strong>várias regiões independentes</strong>, tratadas como um conjunto de heaps que cooperam.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-2-estrutura-interna-do-heap_5-296">4.2 Estrutura interna do heap_5</h3>



<p class="wp-block-paragraph">O heap_5 reutiliza a mesma estrutura <code>BlockLink_t</code> do heap_4:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>typedef struct BlockLink {
    struct BlockLink *pxNextFreeBlock;
    size_t xBlockSize;
} BlockLink_t;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pxNextFreeBlock</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xBlockSize</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">BlockLink_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">A diferença está na <strong>inicialização</strong>. Em vez de um único bloco livre inicial, o heap_5 recebe um <strong>array de regiões</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>typedef struct HeapRegion {
    uint8_t *pucStartAddress;
    size_t xSizeInBytes;
} HeapRegion_t;
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HeapRegion</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pucStartAddress</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xSizeInBytes</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HeapRegion_t</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Cada região é alinhada, ajustada e inserida na <strong>mesma lista global de blocos livres</strong>, respeitando a ordenação por endereço.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-3-inicializacao-do-heap_5-vportdefineheapregions-303">4.3 Inicialização do heap_5 (<code>vPortDefineHeapRegions</code>)</h3>



<p class="wp-block-paragraph">Ao usar heap_5, você <strong>não define</strong> <code>configTOTAL_HEAP_SIZE</code>.</p>



<p class="wp-block-paragraph">Em vez disso, você define explicitamente as regiões:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>static uint8_t ucHeap1&#91; 20 * 1024 &#93;;  // SRAM
static uint8_t ucHeap2&#91; 64 * 1024 &#93;;  // SDRAM

const HeapRegion_t xHeapRegions[] =
{
    { ucHeap1, sizeof(ucHeap1) },
    { ucHeap2, sizeof(ucHeap2) },
    { NULL, 0 } // terminador obrigatório
};

vPortDefineHeapRegions(xHeapRegions);
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ucHeap1</span><span style="color: #D8DEE9FF">&#91; </span><span style="color: #B48EAD">20</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1024</span><span style="color: #D8DEE9FF"> &#93;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// SRAM</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ucHeap2</span><span style="color: #D8DEE9FF">&#91; </span><span style="color: #B48EAD">64</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1024</span><span style="color: #D8DEE9FF"> &#93;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// SDRAM</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HeapRegion_t</span><span style="color: #D8DEE9FF"> xHeapRegions[] </span><span style="color: #81A1C1">=</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ucHeap1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">ucHeap1</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ucHeap2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">ucHeap2</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// terminador obrigatório</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">vPortDefineHeapRegions</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">xHeapRegions</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O FreeRTOS então:</p>



<ol class="wp-block-list">
<li>Alinha cada região</li>



<li>Cria um bloco livre inicial para cada uma</li>



<li>Insere todos na lista global de blocos livres</li>



<li>A partir daí, o algoritmo é <strong>idêntico ao heap_4</strong></li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-4-alocacao-e-liberacao-no-heap_5-314">4.4 Alocação e liberação no heap_5</h3>



<p class="wp-block-paragraph">O algoritmo de <code>pvPortMalloc()</code>:</p>



<ul class="wp-block-list">
<li>Percorre a lista global de blocos livres</li>



<li>Pode retornar memória de <strong>qualquer região</strong></li>



<li>Usa <strong>first-fit</strong>, como no heap_4</li>
</ul>



<p class="wp-block-paragraph">A liberação (<code>vPortFree()</code>):</p>



<ul class="wp-block-list">
<li>Insere o bloco na lista ordenada</li>



<li>Só faz coalescência <strong>dentro da mesma região física</strong></li>



<li>Nunca tenta fundir blocos que pertencem a regiões distintas</li>
</ul>



<p class="wp-block-paragraph">Isso garante segurança e coerência.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-5-propriedades-temporais-e-fragmentacao-327">4.5 Propriedades temporais e fragmentação</h3>



<p class="wp-block-paragraph">As propriedades são praticamente as mesmas do heap_4:</p>



<ul class="wp-block-list">
<li><strong>Fragmentação:</strong> controlada por coalescência</li>



<li><strong>Alocação:</strong> O(n)</li>



<li><strong>Liberação:</strong> O(n) (por causa da inserção ordenada)</li>



<li><strong>Determinismo:</strong> bom para sistemas embarcados, mas não hard real-time absoluto</li>
</ul>



<p class="wp-block-paragraph">O cuidado adicional é <strong>onde</strong> cada tipo de dado pode cair.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-6-estrategias-praticas-de-uso-do-heap_5-336">4.6 Estratégias práticas de uso do heap_5</h3>



<p class="wp-block-paragraph">Aqui entra engenharia de sistema.</p>



<h4 class="wp-block-heading" id="aioseo-estrategia-1-heap-rapido-heap-grande-338">Estratégia 1 — Heap “rápido” + heap “grande”</h4>



<ul class="wp-block-list">
<li>Região 1 (SRAM rápida):
<ul class="wp-block-list">
<li>stacks de tarefas</li>



<li>objetos pequenos e frequentes</li>
</ul>
</li>



<li>Região 2 (SDRAM):
<ul class="wp-block-list">
<li>buffers grandes</li>



<li>payloads de rede</li>



<li>filas grandes</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Você pode influenciar isso criando <strong>wrappers específicos</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void *pvPortMallocFast(size_t size);
void *pvPortMallocLarge(size_t size);
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #88C0D0">pvPortMallocFast</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #88C0D0">pvPortMallocLarge</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">size</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Ou ainda, alocando manualmente certos buffers fora do heap do FreeRTOS.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-4-7-quando-escolher-heap_5-353">4.7 Quando escolher heap_5</h3>



<ul class="wp-block-list">
<li>MCUs com múltiplas regiões de RAM</li>



<li>Uso de SDRAM externa</li>



<li>Sistemas de comunicação complexos</li>



<li>Aplicações multimídia</li>



<li>Quando <code>configTOTAL_HEAP_SIZE</code> é conceitualmente insuficiente</li>
</ul>



<p class="wp-block-paragraph">Em projetos STM32H7 com Ethernet + lwIP, o heap_5 costuma ser <strong>a única escolha viável</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-comparativo-final-heap_1-a-heap_5-362">Comparativo final (heap_1 a heap_5)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Heap</th><th>Free</th><th>Coalescência</th><th>Múltiplas Regiões</th><th>Uso típico</th></tr></thead><tbody><tr><td>1</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Boot fixo</td></tr><tr><td>2</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Didático</td></tr><tr><td>3</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Depende da libc</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Protótipo</td></tr><tr><td>4</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Produção</td></tr><tr><td>5</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td><td>Sistemas complexos</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="aioseo-fechamento-portabilidade-heap-e-boas-praticas-de-engenharia-em-freertos-366">Fechamento: portabilidade, heap e boas práticas de engenharia em FreeRTOS</h2>



<p class="wp-block-paragraph">Nesta seção final, vamos <strong>amarrar tudo</strong>: portabilidade do FreeRTOS, escolhas de heap, impacto em tempo real e <strong>boas práticas de projeto</strong>. Aqui o foco não é mais “como o código funciona”, mas <strong>como um engenheiro decide</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-5-1-portabilidade-do-freertos-por-que-o-heap-e-parte-do-port-369">5.1 Portabilidade do FreeRTOS: por que o heap é parte do <em>port</em></h3>



<p class="wp-block-paragraph">A portabilidade do FreeRTOS não é apenas “rodar em vários MCUs”. Ela envolve <strong>preservar propriedades temporais</strong> ao migrar entre arquiteturas. Por isso:</p>



<ul class="wp-block-list">
<li>O kernel <strong>não assume</strong> um modelo de memória específico</li>



<li>O heap <strong>não é fixo</strong>: é uma política, não uma obrigação</li>



<li>A camada de <em>port</em> define:
<ul class="wp-block-list">
<li>alinhamento (<code>portBYTE_ALIGNMENT</code>)</li>



<li>região crítica</li>



<li>atomicidade de acesso</li>



<li>impacto direto no heap</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Quando você muda de:</p>



<ul class="wp-block-list">
<li>Cortex-M0 → Cortex-M7</li>



<li>Sem FPU → com FPU</li>



<li>SRAM única → SRAM + SDRAM</li>
</ul>



<p class="wp-block-paragraph">…o <strong>algoritmo de heap escolhido passa a ser uma decisão arquitetural</strong>, não apenas de conveniência.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-5-2-heap-e-padroes-de-projeto-em-sistemas-embarcados-387">5.2 Heap e padrões de projeto em sistemas embarcados</h3>



<p class="wp-block-paragraph">Na prática, projetos robustos <strong>não dependem exclusivamente do heap genérico</strong>. Eles combinam o heap do FreeRTOS com padrões clássicos.</p>



<h4 class="wp-block-heading" id="aioseo-object-pool-pool-de-objetos-389">Object Pool (pool de objetos)</h4>



<ul class="wp-block-list">
<li>Pré-aloca N estruturas fixas</li>



<li>Não fragmenta</li>



<li>Tempo determinístico</li>
</ul>



<p class="wp-block-paragraph">Ideal para:</p>



<ul class="wp-block-list">
<li>buffers de comunicação</li>



<li>estruturas de protocolo</li>



<li>mensagens recorrentes</li>
</ul>



<h4 class="wp-block-heading" id="aioseo-static-allocation-alocacao-estatica-399">Static Allocation (alocação estática)</h4>



<p class="wp-block-paragraph">Com:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>xTaskCreateStatic(...)
xQueueCreateStatic(...)
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">xTaskCreateStatic</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #88C0D0">xQueueCreateStatic</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<ul class="wp-block-list">
<li>Elimina uso do heap</li>



<li>Ideal para safety e certificação</li>



<li>Menos flexível</li>
</ul>



<h4 class="wp-block-heading" id="aioseo-message-buffers-e-stream-buffers-406">Message Buffers e Stream Buffers</h4>



<ul class="wp-block-list">
<li>Alocam memória <strong>uma única vez</strong></li>



<li>Depois operam sem fragmentar</li>



<li>Excelente combinação com heap_4</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-5-3-erros-comuns-no-uso-do-heap-do-freertos-412">5.3 Erros comuns no uso do heap do FreeRTOS</h3>



<p class="wp-block-paragraph">Aqui entra experiência prática:</p>



<ol class="wp-block-list">
<li><strong>Superdimensionar o heap “no escuro”</strong><br>→ mascara problemas de arquitetura</li>



<li><strong>Usar heap_2 em sistemas long-lived</strong><br>→ falhas tardias e difíceis de depurar</li>



<li><strong>Misturar malloc/free da libc com pvPortMalloc</strong><br>→ corrupção silenciosa</li>



<li><strong>Ignorar <code>xPortGetMinimumEverFreeHeapSize()</code></strong><br>→ perder o melhor indicador de margem real</li>



<li><strong>Criar tarefas dinamicamente em runtime sem controle</strong><br>→ fragmentação + jitter temporal</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-5-4-checklist-pratico-para-escolher-o-heap-421">5.4 Checklist prático para escolher o heap</h3>



<p class="wp-block-paragraph">Use isto como regra de bolso:</p>



<ul class="wp-block-list">
<li>Sistema com topologia fixa?<br>→ <strong>heap_1</strong> ou alocação estática</li>



<li>Sistema simples, vida curta, sem requisitos rígidos?<br>→ <strong>heap_3</strong> (com cautela)</li>



<li>Sistema real, produção, comunicação, longa vida?<br>→ <strong>heap_4</strong></li>



<li>MCU com múltiplas RAMs / SDRAM externa?<br>→ <strong>heap_5</strong></li>
</ul>



<p class="wp-block-paragraph">E sempre pergunte:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“O que acontece com meu heap após 10 horas? 10 dias? 1 ano?”</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-5-5-como-fechar-o-dimensionamento-do-heap-metodo-engenheirado-432">5.5 Como fechar o dimensionamento do heap (método engenheirado)</h3>



<ol class="wp-block-list">
<li>Comece com <strong>estimativa conservadora</strong></li>



<li>Instrumente:
<ul class="wp-block-list">
<li><code>xPortGetFreeHeapSize()</code></li>



<li><code>xPortGetMinimumEverFreeHeapSize()</code></li>
</ul>
</li>



<li>Rode o sistema no <strong>pior cenário</strong></li>



<li>Observe a <strong>mínima histórica</strong></li>



<li>Reduza o heap até restar uma folga segura (10–20%)</li>
</ol>



<p class="wp-block-paragraph">Esse método é repetível, mensurável e defensável tecnicamente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="aioseo-5-6-conclusao-tecnica-444">5.6 Conclusão técnica</h3>



<p class="wp-block-paragraph">O sistema de heap do FreeRTOS <strong>não é um detalhe de implementação</strong> — é parte central da portabilidade, da previsibilidade temporal e da confiabilidade do sistema.</p>



<ul class="wp-block-list">
<li>heap_1 ensina disciplina</li>



<li>heap_2 ensina fragmentação</li>



<li>heap_3 ensina por que libc nem sempre é sua amiga</li>



<li>heap_4 resolve 90% dos projetos reais</li>



<li>heap_5 habilita arquiteturas modernas e complexas</li>
</ul>



<p class="wp-block-paragraph">Um projeto FreeRTOS maduro não escolhe o heap “porque funcionou”, mas porque <strong>faz sentido arquiteturalmente</strong>.</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/rtos/portabilidade-do-freertos-e-gerenciamento-de-heap-entendendo-heap_1-a-heap_5-em-sistemas-embarcados/">Portabilidade do FreeRTOS e Gerenciamento de Heap: Entendendo heap_1 a heap_5 em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1014</post-id>	</item>
	</channel>
</rss>
