<?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>Zephyr threads - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/zephyr-threads/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 17 Dec 2025 13:37:38 +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>Zephyr threads - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Primeiros Passos com Projetos e Threads no Zephyr OS</title>
		<link>https://mcu.tec.br/rtos/primeiros-passos-com-projetos-e-threads-no-zephyr-os/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=primeiros-passos-com-projetos-e-threads-no-zephyr-os</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Mon, 29 Dec 2025 12:47:08 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[RTOS Zephyr]]></category>
		<category><![CDATA[sistemas embarcados com Zephyr]]></category>
		<category><![CDATA[Zephyr arquitetura]]></category>
		<category><![CDATA[Zephyr escalonamento]]></category>
		<category><![CDATA[Zephyr OS]]></category>
		<category><![CDATA[Zephyr para microcontroladores]]></category>
		<category><![CDATA[Zephyr primeiros passos]]></category>
		<category><![CDATA[Zephyr stack]]></category>
		<category><![CDATA[Zephyr threads]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1042</guid>

					<description><![CDATA[<p>Aprenda os primeiros passos com o Zephyr OS após a instalação. Este artigo apresenta como criar o primeiro projeto, entender o modelo de threads, gerenciar pilha, definir prioridades e aplicar boas práticas arquiteturais para sistemas embarcados profissionais usando Zephyr.</p>
<p>The post <a href="https://mcu.tec.br/rtos/primeiros-passos-com-projetos-e-threads-no-zephyr-os/">Primeiros Passos com Projetos e Threads no Zephyr OS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Visão Geral e Criação do Primeiro Projeto no Zephyr</h2>



<p class="wp-block-paragraph">Após a instalação correta do Zephyr OS e da ferramenta <code>west</code>, o próximo passo natural é compreender <strong>como estruturar um projeto real</strong> e <strong>como o Zephyr organiza sua execução concorrente por meio de threads</strong>. Diferente de abordagens bare-metal tradicionais, o Zephyr já nasce como um <strong>sistema operacional de tempo real (RTOS)</strong> completo, com escalonador, gerenciamento de pilha, prioridades e sincronização integrados ao núcleo.</p>



<p class="wp-block-paragraph">Um projeto Zephyr não é apenas um conjunto de arquivos C. Ele é definido por três pilares fundamentais:</p>



<ol class="wp-block-list">
<li><strong>Código-fonte da aplicação</strong></li>



<li><strong>Configuração do kernel e subsistemas (Kconfig)</strong></li>



<li><strong>Descrição do hardware alvo (Device Tree)</strong></li>
</ol>



<p class="wp-block-paragraph">Mesmo um projeto simples precisa respeitar essa arquitetura, pois é ela que permite ao Zephyr ser altamente portátil entre arquiteturas como ARM Cortex-M, RISC-V e x86.</p>



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



<h3 class="wp-block-heading">Estrutura mínima de um projeto Zephyr</h3>



<p class="wp-block-paragraph">Um projeto básico no Zephyr possui a seguinte estrutura:</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>meu_projeto/
├── CMakeLists.txt
├── prj.conf
└── src/
    └── main.c
</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">meu_projeto</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">CMakeLists</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">prj</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">conf</span></span>
<span class="line"><span style="color: #D8DEE9FF">└── </span><span style="color: #D8DEE9">src</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">    └── </span><span style="color: #D8DEE9">main</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Cada um desses arquivos tem um papel bem definido:</p>



<ul class="wp-block-list">
<li><strong>CMakeLists.txt</strong>: descreve a aplicação para o sistema de build do Zephyr.</li>



<li><strong>prj.conf</strong>: define quais recursos do kernel e drivers serão habilitados.</li>



<li><strong>main.c</strong>: contém o código da aplicação.</li>
</ul>



<p class="wp-block-paragraph">Exemplo mínimo de <code>CMakeLists.txt</code>:</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>cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(primeiro_projeto)

target_sources(app PRIVATE src/main.c)
</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">cmake_minimum_required</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">VERSION</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3.20</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">find_package</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">Zephyr</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">REQUIRED</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">HINTS</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$ENV</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9">ZEPHYR_BASE</span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #88C0D0">project</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">primeiro_projeto</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">target_sources</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">app</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PRIVATE</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">src</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">main</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse arquivo conecta o projeto ao núcleo do Zephyr e informa qual arquivo C será compilado como aplicação.</p>



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



<h3 class="wp-block-heading">Arquivo de configuração do projeto (prj.conf)</h3>



<p class="wp-block-paragraph">O <code>prj.conf</code> é onde se define o comportamento do kernel. Para trabalhar com threads, algumas opções são fundamentais:</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>CONFIG_PRINTK=y
CONFIG_LOG=y
CONFIG_MAIN_STACK_SIZE=1024
CONFIG_HEAP_MEM_POOL_SIZE=2048
</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">CONFIG_PRINTK</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">y</span></span>
<span class="line"><span style="color: #D8DEE9">CONFIG_LOG</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">y</span></span>
<span class="line"><span style="color: #D8DEE9">CONFIG_MAIN_STACK_SIZE</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1024</span></span>
<span class="line"><span style="color: #D8DEE9">CONFIG_HEAP_MEM_POOL_SIZE</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">2048</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essas opções:</p>



<ul class="wp-block-list">
<li>Ativam saída de debug (<code>printk</code> e sistema de log)</li>



<li>Definem o tamanho da pilha da thread principal</li>



<li>Reservam memória dinâmica para criação de threads adicionais</li>
</ul>



<p class="wp-block-paragraph">No Zephyr, <strong>nada é habilitado por padrão sem intenção explícita</strong>, o que reduz consumo de memória e aumenta previsibilidade — um ponto crítico em sistemas embarcados.</p>



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



<h3 class="wp-block-heading">O papel da thread principal (<code>main</code>)</h3>



<p class="wp-block-paragraph">No Zephyr, a função <code>main()</code> <strong>não é executada em bare-metal</strong>. Ela roda dentro de uma <strong>thread já criada pelo kernel</strong>, chamada informalmente de <em>main thread</em>. Essa thread:</p>



<ul class="wp-block-list">
<li>Possui prioridade configurável</li>



<li>Possui pilha própria</li>



<li>Pode bloquear, dormir ou ser preemptada</li>
</ul>



<p class="wp-block-paragraph">Exemplo simples de <code>main.c</code>:</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>#include &lt;zephyr/kernel.h>
#include &lt;zephyr/sys/printk.h>

void main(void)
{
    while (1) {
        printk("Thread principal em execução\n");
        k_sleep(K_SECONDS(1));
    }
}
</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: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kernel</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sys</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">printk</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">main</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</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: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printk</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Thread principal em execução</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">k_sleep</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">K_SECONDS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">1</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></code></pre></div>



<p class="wp-block-paragraph">Aqui já aparecem conceitos essenciais do Zephyr:</p>



<ul class="wp-block-list">
<li><code>k_sleep()</code> coloca a thread em estado <strong>bloqueado</strong>, liberando a CPU</li>



<li>O escalonador decide qual thread executa em seguida</li>



<li>Não há <em>busy wait</em>, o que melhora eficiência energética e temporal</li>
</ul>



<p class="wp-block-paragraph">Esse comportamento é radicalmente diferente de um <code>while(1)</code> típico de sistemas bare-metal.</p>



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



<h3 class="wp-block-heading">Por que usar threads no Zephyr?</h3>



<p class="wp-block-paragraph">Threads são usadas quando há necessidade de:</p>



<ul class="wp-block-list">
<li>Executar tarefas independentes concorrentemente</li>



<li>Garantir tempos de resposta previsíveis</li>



<li>Isolar funcionalidades críticas</li>



<li>Simplificar arquitetura orientada a eventos</li>
</ul>



<p class="wp-block-paragraph">No Zephyr, <strong>tudo é thread</strong>: drivers, subsistemas, stacks de rede e sua aplicação compartilham o mesmo modelo de execução, o que facilita análise temporal e depuração.</p>



<p class="wp-block-paragraph">Na próxima seção, entraremos no <strong>modelo de threads do Zephyr</strong>, explicando:</p>



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



<li>estados</li>



<li>pilha</li>



<li>criação estática e dinâmica</li>



<li>boas práticas e erros comuns</li>
</ul>



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



<h2 class="wp-block-heading">Modelo de Threads no Zephyr: Prioridades, Estados e Escalonamento</h2>



<p class="wp-block-paragraph">O coração do Zephyr OS é o seu <strong>escalonador preemptivo de tempo real</strong>, projetado para operar de forma determinística mesmo em microcontroladores com poucos kilobytes de RAM. Para usar threads corretamente, é fundamental compreender <strong>como o Zephyr enxerga uma thread</strong>, quais estados ela pode assumir e como o kernel decide qual delas executa a cada instante.</p>



<p class="wp-block-paragraph">Diferente de alguns RTOS mais antigos ou simplificados, o Zephyr adota um modelo moderno, fortemente inspirado em sistemas operacionais clássicos, porém adaptado às restrições de sistemas embarcados.</p>



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



<h3 class="wp-block-heading">Prioridades no Zephyr: quanto menor, mais prioritária</h3>



<p class="wp-block-paragraph">No Zephyr, <strong>prioridade é um valor inteiro</strong>, e aqui existe um detalhe crucial:</p>



<ul class="wp-block-list">
<li><strong>Valores menores representam maior prioridade</strong></li>



<li>Threads podem ser:
<ul class="wp-block-list">
<li><strong>Cooperativas</strong></li>



<li><strong>Preemptivas</strong></li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">A separação acontece por meio de faixas de prioridade.</p>



<p class="wp-block-paragraph">Exemplo típico:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Prioridade</strong></td><td class="has-text-align-center" data-align="center"><strong>Tipo</strong></td></tr><tr><td class="has-text-align-center" data-align="center">-1 a -CONFIG_NUM_COOP_PRIORITIES</td><td class="has-text-align-center" data-align="center">Cooperativas</td></tr><tr><td class="has-text-align-center" data-align="center">0 a CONFIG_NUM_PREEMPT_PRIORITIES</td><td class="has-text-align-center" data-align="center">Preemptivas</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Threads cooperativas <strong>nunca são interrompidas por outras threads</strong>, apenas cedem a CPU voluntariamente. Já threads preemptivas podem ser interrompidas assim que uma thread de maior prioridade fica pronta para executar.</p>



<p class="wp-block-paragraph">Essa distinção permite arquiteturas híbridas extremamente eficientes.</p>



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



<h3 class="wp-block-heading">Estados possíveis de uma thread</h3>



<p class="wp-block-paragraph">Uma thread no Zephyr pode assumir vários estados ao longo de sua vida útil:</p>



<ol class="wp-block-list">
<li><strong>READY (Pronta)</strong><br>A thread está apta a executar e aguarda escalonamento.</li>



<li><strong>RUNNING (Executando)</strong><br>A thread está ocupando a CPU no momento.</li>



<li><strong>BLOCKED (Bloqueada)</strong><br>Está aguardando um evento, tempo ou recurso (ex: <code>k_sleep</code>, <code>k_sem_take</code>).</li>



<li><strong>SUSPENDED (Suspensa)</strong><br>Foi explicitamente suspensa por outra thread.</li>



<li><strong>DEAD (Encerrada)</strong><br>A execução terminou e seus recursos foram liberados.</li>
</ol>



<p class="wp-block-paragraph">O kernel transita entre esses estados automaticamente, garantindo previsibilidade temporal.</p>



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



<h3 class="wp-block-heading">Escalonamento: como o Zephyr decide quem executa</h3>



<p class="wp-block-paragraph">O escalonador do Zephyr segue regras claras:</p>



<ol class="wp-block-list">
<li>Sempre executa a <strong>thread pronta de maior prioridade</strong></li>



<li>Entre threads da mesma prioridade:
<ul class="wp-block-list">
<li>Usa <strong>round-robin</strong>, se habilitado</li>
</ul>
</li>



<li>Threads cooperativas nunca sofrem preempção</li>



<li>Chamadas bloqueantes liberam a CPU imediatamente</li>
</ol>



<p class="wp-block-paragraph">Esse modelo é especialmente importante em aplicações embarcadas críticas, como controle motor, protocolos industriais e sensores em tempo real.</p>



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



<h3 class="wp-block-heading">Criando uma thread explicitamente</h3>



<p class="wp-block-paragraph">No Zephyr, threads podem ser criadas de forma <strong>estática</strong> ou <strong>dinâmica</strong>. A forma mais comum e segura em sistemas embarcados é a criação estática.</p>



<p class="wp-block-paragraph">Exemplo completo:</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>#include &lt;zephyr/kernel.h>
#include &lt;zephyr/sys/printk.h>

#define STACK_SIZE 1024
#define PRIORITY 5

K_THREAD_STACK_DEFINE(thread_stack, STACK_SIZE);
struct k_thread thread_data;

void thread_func(void *arg1, void *arg2, void *arg3)
{
    while (1) {
        printk("Thread secundária em execução\n");
        k_sleep(K_SECONDS(2));
    }
}

void main(void)
{
    k_thread_create(&amp;thread_data,
                    thread_stack,
                    STACK_SIZE,
                    thread_func,
                    NULL, NULL, NULL,
                    PRIORITY,
                    0,
                    K_NO_WAIT);

    while (1) {
        printk("Thread principal\n");
        k_sleep(K_SECONDS(1));
    }
}
</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: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kernel</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sys</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">printk</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">STACK_SIZE</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1024</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">PRIORITY</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">K_THREAD_STACK_DEFINE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">thread_stack</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">STACK_SIZE</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k_thread</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">thread_data</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">thread_func</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">arg1</span><span style="color: #ECEFF4">,</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">arg2</span><span style="color: #ECEFF4">,</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">arg3</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: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printk</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Thread secundária em execução</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">k_sleep</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">K_SECONDS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">2</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>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">main</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</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">k_thread_create</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">thread_data</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">thread_stack</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">STACK_SIZE</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">thread_func</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">NULL</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: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">PRIORITY</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #D8DEE9">K_NO_WAIT</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">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printk</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Thread principal</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">k_sleep</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">K_SECONDS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">1</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></code></pre></div>



<p class="wp-block-paragraph">Aqui aparecem conceitos fundamentais:</p>



<ul class="wp-block-list">
<li><strong><code>K_THREAD_STACK_DEFINE</code></strong>: reserva pilha estaticamente</li>



<li><strong><code>struct k_thread</code></strong>: controle interno da thread</li>



<li><strong>Função com três argumentos genéricos</strong>: padrão do Zephyr</li>



<li><strong>Prioridade explícita</strong></li>



<li><strong>Delay inicial configurável</strong></li>
</ul>



<p class="wp-block-paragraph">Esse modelo evita alocação dinâmica descontrolada, algo crítico em sistemas embarcados.</p>



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



<h3 class="wp-block-heading">Erros comuns no uso de threads</h3>



<p class="wp-block-paragraph">Alguns erros aparecem com frequência em projetos iniciais:</p>



<ul class="wp-block-list">
<li>Criar muitas threads sem necessidade</li>



<li>Subdimensionar pilha</li>



<li>Usar prioridade inadequada</li>



<li>Bloquear threads críticas com <code>k_sleep</code></li>



<li>Misturar lógica de tempo real com lógica de aplicação</li>
</ul>



<p class="wp-block-paragraph">No Zephyr, <strong>menos threads bem definidas quase sempre é melhor</strong> do que muitas threads mal planejadas.</p>



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



<h2 class="wp-block-heading">Gerenciamento Correto de Pilha (Stack) de Threads no Zephyr</h2>



<p class="wp-block-paragraph">Em sistemas embarcados, <strong>a pilha de uma thread é um recurso crítico e finito</strong>. Diferente de sistemas operacionais de propósito geral, não existe “memória virtual” nem crescimento automático de stack. No Zephyr, cada thread possui <strong>uma pilha dedicada</strong>, e o erro mais comum em projetos iniciais é <strong>subdimensionar ou superdimensionar esse recurso</strong>.</p>



<p class="wp-block-paragraph">Gerenciar corretamente a pilha é fundamental para:</p>



<ul class="wp-block-list">
<li>Evitar <em>stack overflow</em></li>



<li>Garantir previsibilidade</li>



<li>Reduzir consumo de RAM</li>



<li>Aumentar confiabilidade do sistema</li>
</ul>



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



<h3 class="wp-block-heading">Como o Zephyr organiza a pilha de uma thread</h3>



<p class="wp-block-paragraph">Cada thread no Zephyr possui:</p>



<ul class="wp-block-list">
<li>Uma área de stack exclusiva</li>



<li>Guard regions (quando habilitado)</li>



<li>Metadados usados pelo kernel</li>
</ul>



<p class="wp-block-paragraph">A pilha é usada para:</p>



<ul class="wp-block-list">
<li>Variáveis locais</li>



<li>Contexto de chamada de funções</li>



<li>Salvamento de registradores</li>



<li>Interrupções aninhadas (dependendo da arquitetura)</li>
</ul>



<p class="wp-block-paragraph">Exemplo de definição explícita:</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>#define STACK_SIZE 1024

K_THREAD_STACK_DEFINE(my_stack, STACK_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: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">STACK_SIZE</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1024</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">K_THREAD_STACK_DEFINE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">my_stack</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">STACK_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">Esse valor <strong>não é arbitrário</strong>. Ele precisa considerar:</p>



<ul class="wp-block-list">
<li>Profundidade de chamadas</li>



<li>Uso de bibliotecas (ex: printf, logging)</li>



<li>Contextos de interrupção</li>



<li>Otimizações do compilador</li>
</ul>



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



<h3 class="wp-block-heading">Dimensionando a pilha de forma técnica</h3>



<p class="wp-block-paragraph">Uma regra prática inicial:</p>



<ul class="wp-block-list">
<li>Threads simples (controle, polling): <strong>512 a 1024 bytes</strong></li>



<li>Threads com logs, strings, buffers: <strong>1024 a 2048 bytes</strong></li>



<li>Threads de rede, filesystem ou criptografia: <strong>2048 bytes ou mais</strong></li>
</ul>



<p class="wp-block-paragraph">No entanto, o correto é <strong>medir</strong>, não apenas estimar.</p>



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



<h3 class="wp-block-heading">Habilitando monitoramento de stack</h3>



<p class="wp-block-paragraph">O Zephyr oferece mecanismos nativos para análise de consumo de pilha.</p>



<p class="wp-block-paragraph">No <code>prj.conf</code>:</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>CONFIG_THREAD_STACK_INFO=y
CONFIG_INIT_STACKS=y
CONFIG_THREAD_MONITOR=y
</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">CONFIG_THREAD_STACK_INFO</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">y</span></span>
<span class="line"><span style="color: #D8DEE9">CONFIG_INIT_STACKS</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">y</span></span>
<span class="line"><span style="color: #D8DEE9">CONFIG_THREAD_MONITOR</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">y</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essas opções permitem que o kernel:</p>



<ul class="wp-block-list">
<li>Inicialize a stack com um padrão conhecido</li>



<li>Monitore uso máximo</li>



<li>Detecte corrupção</li>
</ul>



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



<h3 class="wp-block-heading">Medindo o uso real da pilha</h3>



<p class="wp-block-paragraph">Com <code>CONFIG_THREAD_STACK_INFO</code> habilitado, é possível consultar o consumo real:</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>#include &lt;zephyr/kernel.h>
#include &lt;zephyr/sys/printk.h>

void print_stack_usage(struct k_thread *thread)
{
    size_t unused;
    k_thread_stack_space_get(thread, &amp;unused);
    printk("Stack livre: %u bytes\n", unused);
}
</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: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kernel</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sys</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">printk</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">print_stack_usage</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k_thread</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">thread</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">unused</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">k_thread_stack_space_get</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">thread</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">unused</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printk</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Stack livre: %u bytes</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unused</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">Esse tipo de análise é essencial durante testes e validação.</p>



<p class="wp-block-paragraph">Boa prática:</p>



<ul class="wp-block-list">
<li>Medir em cenários de pior caso</li>



<li>Executar todos os caminhos críticos</li>



<li>Avaliar após integração de novas bibliotecas</li>
</ul>



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



<h3 class="wp-block-heading">Stack overflow: o inimigo silencioso</h3>



<p class="wp-block-paragraph">Quando ocorre um <em>stack overflow</em>:</p>



<ul class="wp-block-list">
<li>O comportamento pode ser imprevisível</li>



<li>Variáveis de outras threads podem ser corrompidas</li>



<li>O sistema pode travar sem mensagens claras</li>
</ul>



<p class="wp-block-paragraph">Para mitigar isso, habilite proteção:</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>CONFIG_STACK_SENTINEL=y
</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">CONFIG_STACK_SENTINEL</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">y</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Em arquiteturas suportadas, isso ativa mecanismos de detecção automática de estouro de pilha.</p>



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



<h3 class="wp-block-heading">Thread principal também tem stack</h3>



<p class="wp-block-paragraph">Um erro comum é esquecer que a <code>main()</code> também roda em uma thread.</p>



<p class="wp-block-paragraph">O tamanho da pilha da thread principal é configurado em:</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>CONFIG_MAIN_STACK_SIZE=1024
</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">CONFIG_MAIN_STACK_SIZE</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1024</span></span>
<span class="line"></span></code></pre></div>



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



<ul class="wp-block-list">
<li><code>printk</code></li>



<li>buffers locais</li>



<li>chamadas profundas</li>
</ul>



<p class="wp-block-paragraph">Esse valor deve ser ajustado cuidadosamente.</p>



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



<h3 class="wp-block-heading">Boas práticas de engenharia</h3>



<ul class="wp-block-list">
<li>Nunca compartilhe stack entre threads</li>



<li>Evite grandes variáveis locais</li>



<li>Prefira buffers estáticos ou globais controlados</li>



<li>Use análise de stack durante testes</li>



<li>Documente o propósito de cada thread</li>
</ul>



<p class="wp-block-paragraph">Em Zephyr, <strong>a arquitetura correta começa pela pilha</strong>.</p>



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



<h2 class="wp-block-heading">Quando Usar Threads (e Quando NÃO Usar) no Zephyr OS</h2>



<p class="wp-block-paragraph">Um dos erros mais comuns em projetos iniciais com Zephyr é assumir que <strong>toda funcionalidade precisa virar uma thread</strong>. Embora o Zephyr facilite a criação de threads, isso não significa que elas sejam sempre a melhor escolha. Em sistemas embarcados de tempo real, <strong>threads são recursos caros</strong>: consomem RAM (stack), exigem escalonamento e aumentam a complexidade de análise temporal.</p>



<p class="wp-block-paragraph">Um bom projeto Zephyr começa respondendo à pergunta:<br><strong>“Essa funcionalidade realmente precisa de uma thread dedicada?”</strong></p>



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



<h3 class="wp-block-heading">Quando o uso de threads é justificado</h3>



<p class="wp-block-paragraph">Threads devem ser usadas quando a tarefa:</p>



<ul class="wp-block-list">
<li>Executa continuamente ou por longos períodos</li>



<li>Possui requisitos temporais bem definidos</li>



<li>Pode bloquear (sleep, semáforos, filas) sem impactar o restante do sistema</li>



<li>Representa uma responsabilidade clara e isolável (ex: controle, comunicação, aquisição)</li>
</ul>



<p class="wp-block-paragraph">Exemplos típicos:</p>



<ul class="wp-block-list">
<li>Thread de controle de motor</li>



<li>Thread de comunicação (UART, TCP/IP)</li>



<li>Thread de aquisição periódica de sensores</li>



<li>Thread de processamento pesado (FFT, filtros, criptografia)</li>
</ul>



<p class="wp-block-paragraph">Nesses casos, a thread fornece <strong>isolamento, previsibilidade e clareza arquitetural</strong>.</p>



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



<h3 class="wp-block-heading">Quando threads NÃO são a melhor solução</h3>



<p class="wp-block-paragraph">Evite threads quando a funcionalidade:</p>



<ul class="wp-block-list">
<li>Executa rapidamente</li>



<li>É acionada por eventos esporádicos</li>



<li>Não pode consumir stack adicional</li>



<li>Apenas reage a interrupções ou timers</li>
</ul>



<p class="wp-block-paragraph">Exemplos ruins de uso de thread:</p>



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



<li>Debounce de botão</li>



<li>Atualização de flags</li>



<li>Callbacks de periféricos rápidos</li>
</ul>



<p class="wp-block-paragraph">Para esses cenários, o Zephyr oferece mecanismos mais eficientes.</p>



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



<h3 class="wp-block-heading">Alternativa 1 – Timers (<code>k_timer</code>)</h3>



<p class="wp-block-paragraph">Timers são ideais para tarefas periódicas simples.</p>



<p class="wp-block-paragraph">Exemplo:</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>#include &lt;zephyr/kernel.h>
#include &lt;zephyr/sys/printk.h>

void timer_handler(struct k_timer *timer)
{
    printk("Timer expirou\n");
}

K_TIMER_DEFINE(my_timer, timer_handler, NULL);

void main(void)
{
    k_timer_start(&amp;my_timer, K_SECONDS(1), K_SECONDS(1));
}
</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: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kernel</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sys</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">printk</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">timer_handler</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k_timer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">timer</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">printk</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Timer expirou</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</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>
<span class="line"><span style="color: #88C0D0">K_TIMER_DEFINE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">my_timer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">timer_handler</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NULL</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">main</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</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">k_timer_start</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">my_timer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">K_SECONDS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">)</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">K_SECONDS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">1</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">Vantagens:</p>



<ul class="wp-block-list">
<li>Zero stack dedicada</li>



<li>Execução curta</li>



<li>Baixo overhead</li>
</ul>



<p class="wp-block-paragraph">Limitação:</p>



<ul class="wp-block-list">
<li>Não deve executar código pesado ou bloqueante</li>
</ul>



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



<h3 class="wp-block-heading">Alternativa 2 – Work Queues (<code>k_work</code>)</h3>



<p class="wp-block-paragraph">As <em>work queues</em> são uma das ferramentas mais poderosas do Zephyr. Elas permitem <strong>executar código em contexto de thread sem criar uma nova thread</strong>.</p>



<p class="wp-block-paragraph">Exemplo:</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>#include &lt;zephyr/kernel.h>
#include &lt;zephyr/sys/printk.h>

void work_handler(struct k_work *work)
{
    printk("Work executado\n");
}

K_WORK_DEFINE(my_work, work_handler);

void main(void)
{
    k_work_submit(&amp;my_work);
}
</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: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">kernel</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">zephyr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sys</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">printk</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">work_handler</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">k_work</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">work</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">printk</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Work executado</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</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>
<span class="line"><span style="color: #88C0D0">K_WORK_DEFINE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">my_work</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">work_handler</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">main</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</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">k_work_submit</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">my_work</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">Características importantes:</p>



<ul class="wp-block-list">
<li>Executa em uma thread compartilhada</li>



<li>Ideal para processamento pós-interrupção</li>



<li>Reduz drasticamente consumo de RAM</li>
</ul>



<p class="wp-block-paragraph">Essa abordagem é extremamente comum em drivers e stacks do próprio Zephyr.</p>



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



<h3 class="wp-block-heading">Alternativa 3 – Arquitetura orientada a eventos</h3>



<p class="wp-block-paragraph">Em vez de múltiplas threads, muitas aplicações Zephyr são mais eficientes quando estruturadas como:</p>



<ul class="wp-block-list">
<li>Uma thread principal</li>



<li>Múltiplos eventos</li>



<li>Filas, sinais ou notificações</li>
</ul>



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



<ul class="wp-block-list">
<li>ISR gera evento</li>



<li>Evento dispara work</li>



<li>Work atualiza estado</li>



<li>Thread principal reage</li>
</ul>



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



<ul class="wp-block-list">
<li>Simplifica análise temporal</li>



<li>Reduz número de stacks</li>



<li>Melhora testabilidade</li>
</ul>



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



<h3 class="wp-block-heading">Critério prático de decisão</h3>



<p class="wp-block-paragraph">Use este critério simples:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Se a tarefa precisa esperar algo → thread</strong><br><strong>Se a tarefa apenas reage → evento/work/timer</strong></p>
</blockquote>



<p class="wp-block-paragraph">Em projetos profissionais com Zephyr, é comum encontrar:</p>



<ul class="wp-block-list">
<li>Poucas threads</li>



<li>Muitas works</li>



<li>Uso intenso de eventos</li>
</ul>



<p class="wp-block-paragraph">Isso resulta em sistemas mais estáveis, previsíveis e fáceis de manter.</p>



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



<p class="wp-block-paragraph">Perfeito. Vamos seguir.</p>



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



<h2 class="wp-block-heading">Gerenciamento do Ciclo de Vida das Threads no Zephyr</h2>



<p class="wp-block-paragraph">Criar uma thread é apenas o primeiro passo. Em sistemas embarcados reais, o ponto mais delicado está em <strong>controlar corretamente o ciclo de vida das threads</strong>, evitando situações como threads órfãs, consumo desnecessário de CPU, starvation ou comportamentos difíceis de depurar. O Zephyr fornece uma API clara para <strong>iniciar, pausar, retomar e finalizar threads</strong>, mas essas operações devem ser usadas com critério.</p>



<p class="wp-block-paragraph">Um bom projeto trata threads como <strong>entidades gerenciáveis</strong>, não como laços infinitos esquecidos no código.</p>



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



<h3 class="wp-block-heading">Criação e início de execução</h3>



<p class="wp-block-paragraph">Como visto anteriormente, uma thread pode ser criada já pronta para executar ou com atraso inicial:</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>k_thread_create(&amp;thread_data,
                thread_stack,
                STACK_SIZE,
                thread_func,
                NULL, NULL, NULL,
                PRIORITY,
                0,
                K_NO_WAIT);
</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">k_thread_create</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">thread_data</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">thread_stack</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">STACK_SIZE</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">thread_func</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">NULL</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: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">PRIORITY</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">K_NO_WAIT</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 último parâmetro define quando a thread entra no estado READY. Em sistemas mais complexos, é comum atrasar o início para garantir que:</p>



<ul class="wp-block-list">
<li>Drivers já estejam inicializados</li>



<li>Recursos compartilhados estejam prontos</li>



<li>Outras threads críticas já estejam rodando</li>
</ul>



<p class="wp-block-paragraph">Exemplo com atraso inicial:</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>K_SECONDS(5)
</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">K_SECONDS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">5</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



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



<h3 class="wp-block-heading">Suspensão e retomada de threads</h3>



<p class="wp-block-paragraph">O Zephyr permite suspender explicitamente uma thread:</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>k_thread_suspend(&amp;thread_data);
</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">k_thread_suspend</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">thread_data</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">E retomá-la posteriormente:</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>k_thread_resume(&amp;thread_data);
</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">k_thread_resume</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">thread_data</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse mecanismo é útil quando:</p>



<ul class="wp-block-list">
<li>Uma funcionalidade é temporariamente desnecessária</li>



<li>Um recurso externo não está disponível</li>



<li>O sistema entra em modo de economia de energia</li>
</ul>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Cuidado</strong>: suspender threads críticas pode causar deadlocks se elas forem responsáveis por liberar recursos.</p>



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



<h3 class="wp-block-heading">Encerramento de threads</h3>



<p class="wp-block-paragraph">Uma thread pode terminar de duas formas:</p>



<ol class="wp-block-list">
<li>Retornando da função</li>



<li>Chamando explicitamente:</li>
</ol>



<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>k_thread_abort(&amp;thread_data);
</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">k_thread_abort</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">thread_data</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Após o encerramento:</p>



<ul class="wp-block-list">
<li>A thread entra em estado DEAD</li>



<li>Seus recursos podem ser reutilizados</li>



<li>Ela não pode ser retomada</li>
</ul>



<p class="wp-block-paragraph">Boa prática:<br>Threads permanentes → laço infinito<br>Threads temporárias → função com ciclo bem definido</p>



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



<h3 class="wp-block-heading">Evitando starvation e inversão de prioridade</h3>



<p class="wp-block-paragraph">Em sistemas com múltiplas threads, dois problemas clássicos surgem:</p>



<ul class="wp-block-list">
<li><strong>Starvation</strong>: uma thread nunca executa</li>



<li><strong>Inversão de prioridade</strong>: uma thread de baixa prioridade bloqueia uma de alta</li>
</ul>



<p class="wp-block-paragraph">O Zephyr ajuda a mitigar isso por meio de:</p>



<ul class="wp-block-list">
<li>Escalonamento preemptivo</li>



<li>Herança de prioridade (em mutexes)</li>



<li>Design correto de prioridades</li>
</ul>



<p class="wp-block-paragraph">Boa prática:</p>



<ul class="wp-block-list">
<li>Threads críticas → prioridade mais alta</li>



<li>Threads de logging/UI → prioridade mais baixa</li>



<li>Nunca usar prioridades extremas sem necessidade</li>
</ul>



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



<h3 class="wp-block-heading">Comunicação segura entre threads</h3>



<p class="wp-block-paragraph">Threads raramente vivem isoladas. Elas se comunicam por meio de:</p>



<ul class="wp-block-list">
<li>Filas (<code>k_msgq</code>)</li>



<li>Semáforos (<code>k_sem</code>)</li>



<li>Mutexes (<code>k_mutex</code>)</li>



<li>Eventos (<code>k_event</code>)</li>
</ul>



<p class="wp-block-paragraph">Exemplo simples com semáforo:</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>K_SEM_DEFINE(sync_sem, 0, 1);

void producer(void)
{
    k_sem_give(&amp;sync_sem);
}

void consumer(void)
{
    k_sem_take(&amp;sync_sem, K_FOREVER);
}
</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">K_SEM_DEFINE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">sync_sem</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">producer</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</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">k_sem_give</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">sync_sem</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>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">consumer</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</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">k_sem_take</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">sync_sem</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">K_FOREVER</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">Esse modelo evita:</p>



<ul class="wp-block-list">
<li>Busy wait</li>



<li>Condições de corrida</li>



<li>Uso incorreto de flags globais</li>
</ul>



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



<h3 class="wp-block-heading">Threads e consumo de energia</h3>



<p class="wp-block-paragraph">Cada thread ativa:</p>



<ul class="wp-block-list">
<li>Aumenta wake-ups do kernel</li>



<li>Reduz tempo em low power</li>



<li>Aumenta consumo energético</li>
</ul>



<p class="wp-block-paragraph">Por isso, sistemas eficientes com Zephyr:</p>



<ul class="wp-block-list">
<li>Usam poucas threads</li>



<li>Preferem bloqueio a polling</li>



<li>Integram timers e events</li>



<li>Aproveitam o idle thread do kernel</li>
</ul>



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



<h2 class="wp-block-heading">Seção 6 – Boas Práticas Arquiteturais para o Primeiro Projeto Zephyr</h2>



<p class="wp-block-paragraph">Ao dar os primeiros passos com o Zephyr OS, o maior diferencial entre um projeto experimental e um projeto profissional está na <strong>arquitetura escolhida desde o início</strong>. O Zephyr foi concebido para sistemas embarcados modernos, modulares e escaláveis, e isso exige uma mudança de mentalidade em relação ao desenvolvimento bare-metal tradicional.</p>



<p class="wp-block-paragraph">A primeira boa prática é <strong>pensar em responsabilidades, não em laços infinitos</strong>. Cada thread deve representar uma função clara do sistema, como aquisição, controle ou comunicação. Se uma funcionalidade não precisa esperar por eventos ou executar continuamente, ela provavelmente não deveria ser uma thread, mas sim um <em>work</em>, <em>timer</em> ou <em>callback</em>.</p>



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



<h3 class="wp-block-heading">Princípios fundamentais para projetos Zephyr bem-sucedidos</h3>



<p class="wp-block-paragraph">Um projeto Zephyr bem estruturado normalmente segue estes princípios:</p>



<ul class="wp-block-list">
<li>Poucas threads, bem definidas</li>



<li>Uso extensivo de mecanismos de bloqueio (sem busy wait)</li>



<li>Prioridades coerentes com criticidade temporal</li>



<li>Pilhas dimensionadas com base em medição real</li>



<li>Comunicação entre threads sempre via primitivas do kernel</li>
</ul>



<p class="wp-block-paragraph">Essa abordagem resulta em sistemas:</p>



<ul class="wp-block-list">
<li>Mais previsíveis</li>



<li>Mais fáceis de depurar</li>



<li>Mais eficientes energeticamente</li>



<li>Mais portáveis entre placas e arquiteturas</li>
</ul>



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



<h3 class="wp-block-heading">Organização do código da aplicação</h3>



<p class="wp-block-paragraph">Uma organização comum e eficiente:</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>src/
├── main.c
├── sensor_task.c
├── comm_task.c
├── control_task.c
└── app_events.c
</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">src</span><span style="color: #81A1C1">/</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">main</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">sensor_task</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">comm_task</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span></span>
<span class="line"><span style="color: #D8DEE9FF">├── </span><span style="color: #D8DEE9">control_task</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span></span>
<span class="line"><span style="color: #D8DEE9FF">└── </span><span style="color: #D8DEE9">app_events</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">c</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Cada módulo:</p>



<ul class="wp-block-list">
<li>Implementa uma responsabilidade</li>



<li>Exporta apenas interfaces necessárias</li>



<li>Evita dependências cruzadas desnecessárias</li>
</ul>



<p class="wp-block-paragraph">No Zephyr, modularidade não é luxo — é uma exigência para manter escalabilidade.</p>



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



<h3 class="wp-block-heading">Erros clássicos a evitar no primeiro projeto</h3>



<p class="wp-block-paragraph">Alguns erros aparecem com frequência e devem ser evitados desde o início:</p>



<ul class="wp-block-list">
<li>Criar threads para tarefas triviais</li>



<li>Ignorar o consumo de stack</li>



<li>Usar prioridades “no chute”</li>



<li>Compartilhar variáveis globais sem proteção</li>



<li>Usar delays ativos em vez de bloqueio</li>
</ul>



<p class="wp-block-paragraph">Evitar esses erros economiza semanas de debug no futuro.</p>



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



<h3 class="wp-block-heading">Fechamento do artigo</h3>



<p class="wp-block-paragraph">Este artigo apresentou os <strong>primeiros passos práticos com o Zephyr OS após a instalação</strong>, focando na criação do primeiro projeto, no modelo de threads, no gerenciamento correto de pilha, no uso consciente de concorrência e no controle do ciclo de vida das threads. Esses conceitos formam a base para qualquer aplicação profissional desenvolvida sobre o Zephyr.</p>



<p class="wp-block-paragraph">Nos próximos artigos da série, é natural avançar para:</p>



<ul class="wp-block-list">
<li>Comunicação entre threads</li>



<li>Arquitetura orientada a eventos</li>



<li>Uso de drivers e Device Tree</li>



<li>Integração com periféricos reais</li>
</ul>



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



<h1 class="wp-block-heading">Material para SEO</h1>



<h3 class="wp-block-heading">Título do Artigo</h3>



<p class="wp-block-paragraph">Primeiros Projetos com Zephyr OS: Threads, Arquitetura e Boas Práticas</p>



<h3 class="wp-block-heading">Meta descrição</h3>



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



<h3 class="wp-block-heading">Frase chave foco</h3>



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



<h3 class="wp-block-heading">Palavras-chave</h3>



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



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



<p class="wp-block-paragraph">Se quiser, no próximo artigo podemos evoluir diretamente para <strong>sincronização entre threads no Zephyr</strong>, <strong>Device Tree aplicado à aplicação</strong>, ou <strong>arquitetura orientada a eventos</strong>.</p><p>The post <a href="https://mcu.tec.br/rtos/primeiros-passos-com-projetos-e-threads-no-zephyr-os/">Primeiros Passos com Projetos e Threads no Zephyr OS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1042</post-id>	</item>
	</channel>
</rss>
