<?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>k_mutex - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/k_mutex/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Tue, 06 Jan 2026 23:58:34 +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>k_mutex - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Filas, Flags, Mutexes, Notificações e Eventos no Zephyr RTOS</title>
		<link>https://mcu.tec.br/rtos/filas-flags-mutexes-notificacoes-e-eventos-no-zephyr-rtos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=filas-flags-mutexes-notificacoes-e-eventos-no-zephyr-rtos</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Tue, 06 Jan 2026 17:05:59 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[comunicação entre threads]]></category>
		<category><![CDATA[eventos Zephyr]]></category>
		<category><![CDATA[k_event]]></category>
		<category><![CDATA[k_mutex]]></category>
		<category><![CDATA[k_poll]]></category>
		<category><![CDATA[k_queue]]></category>
		<category><![CDATA[k_sem]]></category>
		<category><![CDATA[mutex Zephyr]]></category>
		<category><![CDATA[queues Zephyr]]></category>
		<category><![CDATA[RTOS em C]]></category>
		<category><![CDATA[semáforo Zephyr]]></category>
		<category><![CDATA[sincronização RTOS]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[Zephyr RTOS]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1052</guid>

					<description><![CDATA[<p>Aprenda em profundidade como usar queues, flags, semáforos, mutexes, eventos e notificações no Zephyr RTOS. Um guia didático e prático com exemplos em C, comparativos arquiteturais e boas práticas para construir sistemas embarcados robustos, determinísticos e escaláveis.</p>
<p>The post <a href="https://mcu.tec.br/rtos/filas-flags-mutexes-notificacoes-e-eventos-no-zephyr-rtos/">Filas, Flags, Mutexes, Notificações e Eventos no Zephyr RTOS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph"></p>


<div class="root-eb-toc-hud2p wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-hud2p "><div class="eb-toc-container eb-toc-hud2p  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:1,&quot;content&quot;:&quot;Vis\u00e3o Geral dos Mecanismos de Sincroniza\u00e7\u00e3o e Comunica\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Vis\u00e3o Geral dos Mecanismos de Sincroniza\u00e7\u00e3o e Comunica\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.1 Por que o Zephyr oferece m\u00faltiplos mecanismos?&quot;,&quot;text&quot;:&quot;1.1 Por que o Zephyr oferece m\u00faltiplos mecanismos?&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.2 Threads no Zephyr: o pano de fundo necess\u00e1rio&quot;,&quot;text&quot;:&quot;1.2 Threads no Zephyr: o pano de fundo necess\u00e1rio&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.3 Introdu\u00e7\u00e3o \u00e0s Queues no Zephyr&quot;,&quot;text&quot;:&quot;1.3 Introdu\u00e7\u00e3o \u00e0s Queues no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.4 Estrutura b\u00e1sica de uma k_queue&quot;,&quot;text&quot;:&quot;1.4 Estrutura b\u00e1sica de uma k_queue&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.5 Enviando dados para a fila (Producer)&quot;,&quot;text&quot;:&quot;1.5 Enviando dados para a fila (Producer)&quot;,&quot;link&quot;:&quot;15-enviando-dados-para-a-fila-producer&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.6 Recebendo dados da fila (Consumer)&quot;,&quot;text&quot;:&quot;1.6 Recebendo dados da fila (Consumer)&quot;,&quot;link&quot;:&quot;16-recebendo-dados-da-fila-consumer&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.7 Quando usar k_queue (e quando n\u00e3o usar)&quot;,&quot;text&quot;:&quot;1.7 Quando usar k_queue (e quando n\u00e3o usar)&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1.8 Erros comuns no uso de Queues no Zephyr&quot;,&quot;text&quot;:&quot;1.8 Erros comuns no uso de Queues no Zephyr&quot;,&quot;link&quot;:&quot;18-erros-comuns-no-uso-de-queues-no-zephyr&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Flags, Sem\u00e1foros e Eventos no Zephyr: Sinaliza\u00e7\u00e3o e Coordena\u00e7\u00e3o de Threads&quot;,&quot;text&quot;:&quot;Flags, Sem\u00e1foros e Eventos no Zephyr: Sinaliza\u00e7\u00e3o e Coordena\u00e7\u00e3o de Threads&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.1 O que s\u00e3o \u201cFlags\u201d no contexto do Zephyr?&quot;,&quot;text&quot;:&quot;2.1 O que s\u00e3o \u201cFlags\u201d no contexto do Zephyr?&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.2 Sem\u00e1foros (k_sem): a forma mais simples de flag&quot;,&quot;text&quot;:&quot;2.2 Sem\u00e1foros (k_sem): a forma mais simples de flag&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Declara\u00e7\u00e3o de um sem\u00e1foro&quot;,&quot;text&quot;:&quot;Declara\u00e7\u00e3o de um sem\u00e1foro&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.3 Thread aguardando um sem\u00e1foro (consumidor do evento)&quot;,&quot;text&quot;:&quot;2.3 Thread aguardando um sem\u00e1foro (consumidor do evento)&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.4 Thread ou ISR liberando o sem\u00e1foro (produtor do evento)&quot;,&quot;text&quot;:&quot;2.4 Thread ou ISR liberando o sem\u00e1foro (produtor do evento)&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.5 Sem\u00e1foro bin\u00e1rio vs sem\u00e1foro contador&quot;,&quot;text&quot;:&quot;2.5 Sem\u00e1foro bin\u00e1rio vs sem\u00e1foro contador&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.6 Limita\u00e7\u00f5es dos sem\u00e1foros como flags&quot;,&quot;text&quot;:&quot;2.6 Limita\u00e7\u00f5es dos sem\u00e1foros como flags&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.7 Eventos (k_event): flags m\u00faltiplas em um \u00fanico objeto&quot;,&quot;text&quot;:&quot;2.7 Eventos (k_event): flags m\u00faltiplas em um \u00fanico objeto&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.8 Definindo flags de evento&quot;,&quot;text&quot;:&quot;2.8 Definindo flags de evento&quot;,&quot;link&quot;:&quot;28-definindo-flags-de-evento&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.9 Sinalizando eventos&quot;,&quot;text&quot;:&quot;2.9 Sinalizando eventos&quot;,&quot;link&quot;:&quot;29-sinalizando-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.10 Aguardando eventos&quot;,&quot;text&quot;:&quot;2.10 Aguardando eventos&quot;,&quot;link&quot;:&quot;210-aguardando-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.11 Quando usar k_sem vs k_event&quot;,&quot;text&quot;:&quot;2.11 Quando usar k_sem vs k_event&quot;,&quot;link&quot;:&quot;211-quando-usar-k_sem-vs-k_event&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.12 Erros comuns com Flags e Eventos&quot;,&quot;text&quot;:&quot;2.12 Erros comuns com Flags e Eventos&quot;,&quot;link&quot;:&quot;212-erros-comuns-com-flags-e-eventos&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Mutex no Zephyr: Exclus\u00e3o M\u00fatua, Heran\u00e7a de Prioridade e Uso Correto&quot;,&quot;text&quot;:&quot;Mutex no Zephyr: Exclus\u00e3o M\u00fatua, Heran\u00e7a de Prioridade e Uso Correto&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.1 Por que Mutex existem (e por que eles s\u00e3o perigosos)&quot;,&quot;text&quot;:&quot;3.1 Por que Mutex existem (e por que eles s\u00e3o perigosos)&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.2 O que \u00e9 um recurso compartilhado de verdade?&quot;,&quot;text&quot;:&quot;3.2 O que \u00e9 um recurso compartilhado de verdade?&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.3 Declara\u00e7\u00e3o e inicializa\u00e7\u00e3o de um Mutex&quot;,&quot;text&quot;:&quot;3.3 Declara\u00e7\u00e3o e inicializa\u00e7\u00e3o de um Mutex&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.4 Protegendo uma regi\u00e3o cr\u00edtica com k_mutex&quot;,&quot;text&quot;:&quot;3.4 Protegendo uma regi\u00e3o cr\u00edtica com k_mutex&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.5 Mutex no Zephyr n\u00e3o \u00e9 ISR-safe&quot;,&quot;text&quot;:&quot;3.5 Mutex no Zephyr n\u00e3o \u00e9 ISR-safe&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.6 Invers\u00e3o de prioridade: o problema cl\u00e1ssico&quot;,&quot;text&quot;:&quot;3.6 Invers\u00e3o de prioridade: o problema cl\u00e1ssico&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.7 Heran\u00e7a de prioridade no k_mutex&quot;,&quot;text&quot;:&quot;3.7 Heran\u00e7a de prioridade no k_mutex&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.8 Timeout em mutex: quando faz sentido?&quot;,&quot;text&quot;:&quot;3.8 Timeout em mutex: quando faz sentido?&quot;,&quot;link&quot;:&quot;38-timeout-em-mutex-quando-faz-sentido&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.9 Deadlocks: como eles surgem&quot;,&quot;text&quot;:&quot;3.9 Deadlocks: como eles surgem&quot;,&quot;link&quot;:&quot;39-deadlocks-como-eles-surgem&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.10 Boas pr\u00e1ticas para uso de mutex no Zephyr&quot;,&quot;text&quot;:&quot;3.10 Boas pr\u00e1ticas para uso de mutex no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.11 Quando n\u00e3o usar mutex&quot;,&quot;text&quot;:&quot;3.11 Quando n\u00e3o usar mutex&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Notifica\u00e7\u00f5es e k_poll: Esperando M\u00faltiplos Eventos de Forma Elegante&quot;,&quot;text&quot;:&quot;Notifica\u00e7\u00f5es e k_poll: Esperando M\u00faltiplos Eventos de Forma Elegante&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.1 Por que k_poll existe?&quot;,&quot;text&quot;:&quot;4.1 Por que k_poll existe?&quot;,&quot;link&quot;:&quot;41-por-que-k_poll-existe&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.2 O que \u00e9 k_poll conceitualmente?&quot;,&quot;text&quot;:&quot;4.2 O que \u00e9 k_poll conceitualmente?&quot;,&quot;link&quot;:&quot;eb-table-content-37&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.3 Objetos suportados pelo k_poll&quot;,&quot;text&quot;:&quot;4.3 Objetos suportados pelo k_poll&quot;,&quot;link&quot;:&quot;43-objetos-suportados-pelo-k_poll&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.4 Declarando eventos de polling&quot;,&quot;text&quot;:&quot;4.4 Declarando eventos de polling&quot;,&quot;link&quot;:&quot;44-declarando-eventos-de-polling&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.5 Aguardando m\u00faltiplos eventos&quot;,&quot;text&quot;:&quot;4.5 Aguardando m\u00faltiplos eventos&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.6 k_poll n\u00e3o \u00e9 uma fila nem uma flag&quot;,&quot;text&quot;:&quot;4.6 k_poll n\u00e3o \u00e9 uma fila nem uma flag&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.7 k_poll_signal: notifica\u00e7\u00f5es leves e diretas&quot;,&quot;text&quot;:&quot;4.7 k_poll_signal: notifica\u00e7\u00f5es leves e diretas&quot;,&quot;link&quot;:&quot;eb-table-content-42&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.8 Arquitetura orientada a eventos com k_poll&quot;,&quot;text&quot;:&quot;4.8 Arquitetura orientada a eventos com k_poll&quot;,&quot;link&quot;:&quot;48-arquitetura-orientada-a-eventos-com-k_poll&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.9 Quando n\u00e3o usar k_poll&quot;,&quot;text&quot;:&quot;4.9 Quando n\u00e3o usar k_poll&quot;,&quot;link&quot;:&quot;eb-table-content-44&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.10 Erros comuns com k_poll&quot;,&quot;text&quot;:&quot;4.10 Erros comuns com k_poll&quot;,&quot;link&quot;:&quot;410-erros-comuns-com-k_poll&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot; Comparativo Pr\u00e1tico e Diretrizes Arquiteturais no Zephyr&quot;,&quot;text&quot;:&quot; Comparativo Pr\u00e1tico e Diretrizes Arquiteturais no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-46&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.1 O problema real: escolher o mecanismo errado&quot;,&quot;text&quot;:&quot;5.1 O problema real: escolher o mecanismo errado&quot;,&quot;link&quot;:&quot;51-o-problema-real-escolher-o-mecanismo-errado&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.2 Comparativo conceitual direto&quot;,&quot;text&quot;:&quot;5.2 Comparativo conceitual direto&quot;,&quot;link&quot;:&quot;52-comparativo-conceitual-direto&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.3 Diretrizes pr\u00e1ticas de escolha (regra de engenharia)&quot;,&quot;text&quot;:&quot;5.3 Diretrizes pr\u00e1ticas de escolha (regra de engenharia)&quot;,&quot;link&quot;:&quot;eb-table-content-49&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.4 Arquitetura t\u00edpica bem projetada no Zephyr&quot;,&quot;text&quot;:&quot;5.4 Arquitetura t\u00edpica bem projetada no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-50&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.5 Erros arquiteturais cl\u00e1ssicos a evitar&quot;,&quot;text&quot;:&quot;5.5 Erros arquiteturais cl\u00e1ssicos a evitar&quot;,&quot;link&quot;:&quot;eb-table-content-51&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.6 Conclus\u00e3o da s\u00e9rie (neste artigo)&quot;,&quot;text&quot;:&quot;5.6 Conclus\u00e3o da s\u00e9rie (neste artigo)&quot;,&quot;link&quot;:&quot;eb-table-content-52&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Vis\u00e3o Geral dos Mecanismos de Sincroniza\u00e7\u00e3o e Comunica\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;vis\u00e3o-geral-dos-mecanismos-de-sincroniza\u00e7\u00e3o-e-comunica\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.1 Por que o Zephyr oferece m\u00faltiplos mecanismos?&quot;,&quot;value&quot;:&quot;11-por-que-o-zephyr-oferece-m\u00faltiplos-mecanismos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.2 Threads no Zephyr: o pano de fundo necess\u00e1rio&quot;,&quot;value&quot;:&quot;12-threads-no-zephyr-o-pano-de-fundo-necess\u00e1rio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.3 Introdu\u00e7\u00e3o \u00e0s Queues no Zephyr&quot;,&quot;value&quot;:&quot;13-introdu\u00e7\u00e3o-\u00e0s-queues-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.4 Estrutura b\u00e1sica de uma k_queue&quot;,&quot;value&quot;:&quot;14-estrutura-b\u00e1sica-de-uma-k_queue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.5 Enviando dados para a fila (Producer)&quot;,&quot;value&quot;:&quot;15-enviando-dados-para-a-fila-producer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.6 Recebendo dados da fila (Consumer)&quot;,&quot;value&quot;:&quot;16-recebendo-dados-da-fila-consumer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.7 Quando usar k_queue (e quando n\u00e3o usar)&quot;,&quot;value&quot;:&quot;17-quando-usar-k_queue-e-quando-n\u00e3o-usar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1.8 Erros comuns no uso de Queues no Zephyr&quot;,&quot;value&quot;:&quot;18-erros-comuns-no-uso-de-queues-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Flags, Sem\u00e1foros e Eventos no Zephyr: Sinaliza\u00e7\u00e3o e Coordena\u00e7\u00e3o de Threads&quot;,&quot;value&quot;:&quot;flags-sem\u00e1foros-e-eventos-no-zephyr-sinaliza\u00e7\u00e3o-e-coordena\u00e7\u00e3o-de-threads&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.1 O que s\u00e3o \u201cFlags\u201d no contexto do Zephyr?&quot;,&quot;value&quot;:&quot;21-o-que-s\u00e3o-flags-no-contexto-do-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.2 Sem\u00e1foros (k_sem): a forma mais simples de flag&quot;,&quot;value&quot;:&quot;22-sem\u00e1foros-k_sem-a-forma-mais-simples-de-flag&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Declara\u00e7\u00e3o de um sem\u00e1foro&quot;,&quot;value&quot;:&quot;declara\u00e7\u00e3o-de-um-sem\u00e1foro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.3 Thread aguardando um sem\u00e1foro (consumidor do evento)&quot;,&quot;value&quot;:&quot;23-thread-aguardando-um-sem\u00e1foro-consumidor-do-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.4 Thread ou ISR liberando o sem\u00e1foro (produtor do evento)&quot;,&quot;value&quot;:&quot;24-thread-ou-isr-liberando-o-sem\u00e1foro-produtor-do-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.5 Sem\u00e1foro bin\u00e1rio vs sem\u00e1foro contador&quot;,&quot;value&quot;:&quot;25-sem\u00e1foro-bin\u00e1rio-vs-sem\u00e1foro-contador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.6 Limita\u00e7\u00f5es dos sem\u00e1foros como flags&quot;,&quot;value&quot;:&quot;26-limita\u00e7\u00f5es-dos-sem\u00e1foros-como-flags&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.7 Eventos (k_event): flags m\u00faltiplas em um \u00fanico objeto&quot;,&quot;value&quot;:&quot;27-eventos-k_event-flags-m\u00faltiplas-em-um-\u00fanico-objeto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.8 Definindo flags de evento&quot;,&quot;value&quot;:&quot;28-definindo-flags-de-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.9 Sinalizando eventos&quot;,&quot;value&quot;:&quot;29-sinalizando-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.10 Aguardando eventos&quot;,&quot;value&quot;:&quot;210-aguardando-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.11 Quando usar k_sem vs k_event&quot;,&quot;value&quot;:&quot;211-quando-usar-k_sem-vs-k_event&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.12 Erros comuns com Flags e Eventos&quot;,&quot;value&quot;:&quot;212-erros-comuns-com-flags-e-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Mutex no Zephyr: Exclus\u00e3o M\u00fatua, Heran\u00e7a de Prioridade e Uso Correto&quot;,&quot;value&quot;:&quot;mutex-no-zephyr-exclus\u00e3o-m\u00fatua-heran\u00e7a-de-prioridade-e-uso-correto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.1 Por que Mutex existem (e por que eles s\u00e3o perigosos)&quot;,&quot;value&quot;:&quot;31-por-que-mutex-existem-e-por-que-eles-s\u00e3o-perigosos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.2 O que \u00e9 um recurso compartilhado de verdade?&quot;,&quot;value&quot;:&quot;32-o-que-\u00e9-um-recurso-compartilhado-de-verdade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.3 Declara\u00e7\u00e3o e inicializa\u00e7\u00e3o de um Mutex&quot;,&quot;value&quot;:&quot;33-declara\u00e7\u00e3o-e-inicializa\u00e7\u00e3o-de-um-mutex&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4 Protegendo uma regi\u00e3o cr\u00edtica com k_mutex&quot;,&quot;value&quot;:&quot;34-protegendo-uma-regi\u00e3o-cr\u00edtica-com-k_mutex&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.5 Mutex no Zephyr n\u00e3o \u00e9 ISR-safe&quot;,&quot;value&quot;:&quot;35-mutex-no-zephyr-n\u00e3o-\u00e9-isr-safe&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6 Invers\u00e3o de prioridade: o problema cl\u00e1ssico&quot;,&quot;value&quot;:&quot;36-invers\u00e3o-de-prioridade-o-problema-cl\u00e1ssico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.7 Heran\u00e7a de prioridade no k_mutex&quot;,&quot;value&quot;:&quot;37-heran\u00e7a-de-prioridade-no-k_mutex&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.8 Timeout em mutex: quando faz sentido?&quot;,&quot;value&quot;:&quot;38-timeout-em-mutex-quando-faz-sentido&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.9 Deadlocks: como eles surgem&quot;,&quot;value&quot;:&quot;39-deadlocks-como-eles-surgem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.10 Boas pr\u00e1ticas para uso de mutex no Zephyr&quot;,&quot;value&quot;:&quot;310-boas-pr\u00e1ticas-para-uso-de-mutex-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.11 Quando n\u00e3o usar mutex&quot;,&quot;value&quot;:&quot;311-quando-n\u00e3o-usar-mutex&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Notifica\u00e7\u00f5es e k_poll: Esperando M\u00faltiplos Eventos de Forma Elegante&quot;,&quot;value&quot;:&quot;notifica\u00e7\u00f5es-e-k_poll-esperando-m\u00faltiplos-eventos-de-forma-elegante&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.1 Por que k_poll existe?&quot;,&quot;value&quot;:&quot;41-por-que-k_poll-existe&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.2 O que \u00e9 k_poll conceitualmente?&quot;,&quot;value&quot;:&quot;42-o-que-\u00e9-k_poll-conceitualmente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3 Objetos suportados pelo k_poll&quot;,&quot;value&quot;:&quot;43-objetos-suportados-pelo-k_poll&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4 Declarando eventos de polling&quot;,&quot;value&quot;:&quot;44-declarando-eventos-de-polling&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5 Aguardando m\u00faltiplos eventos&quot;,&quot;value&quot;:&quot;45-aguardando-m\u00faltiplos-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.6 k_poll n\u00e3o \u00e9 uma fila nem uma flag&quot;,&quot;value&quot;:&quot;46-k_poll-n\u00e3o-\u00e9-uma-fila-nem-uma-flag&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.7 k_poll_signal: notifica\u00e7\u00f5es leves e diretas&quot;,&quot;value&quot;:&quot;47-k_poll_signal-notifica\u00e7\u00f5es-leves-e-diretas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.8 Arquitetura orientada a eventos com k_poll&quot;,&quot;value&quot;:&quot;48-arquitetura-orientada-a-eventos-com-k_poll&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.9 Quando n\u00e3o usar k_poll&quot;,&quot;value&quot;:&quot;49-quando-n\u00e3o-usar-k_poll&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.10 Erros comuns com k_poll&quot;,&quot;value&quot;:&quot;410-erros-comuns-com-k_poll&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot; Comparativo Pr\u00e1tico e Diretrizes Arquiteturais no Zephyr&quot;,&quot;value&quot;:&quot;comparativo-pr\u00e1tico-e-diretrizes-arquiteturais-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1 O problema real: escolher o mecanismo errado&quot;,&quot;value&quot;:&quot;51-o-problema-real-escolher-o-mecanismo-errado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2 Comparativo conceitual direto&quot;,&quot;value&quot;:&quot;52-comparativo-conceitual-direto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.3 Diretrizes pr\u00e1ticas de escolha (regra de engenharia)&quot;,&quot;value&quot;:&quot;53-diretrizes-pr\u00e1ticas-de-escolha-regra-de-engenharia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.4 Arquitetura t\u00edpica bem projetada no Zephyr&quot;,&quot;value&quot;:&quot;54-arquitetura-t\u00edpica-bem-projetada-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.5 Erros arquiteturais cl\u00e1ssicos a evitar&quot;,&quot;value&quot;:&quot;55-erros-arquiteturais-cl\u00e1ssicos-a-evitar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.6 Conclus\u00e3o da s\u00e9rie (neste artigo)&quot;,&quot;value&quot;:&quot;56-conclus\u00e3o-da-s\u00e9rie-neste-artigo&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Visão Geral dos Mecanismos de Sincronização e Comunicação</a><ul class="eb-toc__list"><li><a href="#eb-table-content-1">1.1 Por que o Zephyr oferece múltiplos mecanismos?</a><li><a href="#eb-table-content-2">1.2 Threads no Zephyr: o pano de fundo necessário</a><li><a href="#eb-table-content-3">1.3 Introdução às Queues no Zephyr</a><li><a href="#eb-table-content-4">1.4 Estrutura básica de uma k_queue</a><li><a href="#15-enviando-dados-para-a-fila-producer">1.5 Enviando dados para a fila (Producer)</a><li><a href="#16-recebendo-dados-da-fila-consumer">1.6 Recebendo dados da fila (Consumer)</a><li><a href="#eb-table-content-7">1.7 Quando usar k_queue (e quando não usar)</a><li><a href="#18-erros-comuns-no-uso-de-queues-no-zephyr">1.8 Erros comuns no uso de Queues no Zephyr</a><li><a href="#eb-table-content-9">Flags, Semáforos e Eventos no Zephyr: Sinalização e Coordenação de Threads</a><ul class="eb-toc__list"><li><a href="#eb-table-content-10">2.1 O que são “Flags” no contexto do Zephyr?</a><li><a href="#eb-table-content-11">2.2 Semáforos (k_sem): a forma mais simples de flag</a><ul class="eb-toc__list"><li><a href="#eb-table-content-12">Declaração de um semáforo</a></li></ul><li><a href="#eb-table-content-13">2.3 Thread aguardando um semáforo (consumidor do evento)</a><li><a href="#eb-table-content-14">2.4 Thread ou ISR liberando o semáforo (produtor do evento)</a><li><a href="#eb-table-content-15">2.5 Semáforo binário vs semáforo contador</a><li><a href="#eb-table-content-16">2.6 Limitações dos semáforos como flags</a><li><a href="#eb-table-content-17">2.7 Eventos (k_event): flags múltiplas em um único objeto</a><li><a href="#28-definindo-flags-de-evento">2.8 Definindo flags de evento</a><li><a href="#29-sinalizando-eventos">2.9 Sinalizando eventos</a><li><a href="#210-aguardando-eventos">2.10 Aguardando eventos</a><li><a href="#211-quando-usar-k_sem-vs-k_event">2.11 Quando usar k_sem vs k_event</a><li><a href="#212-erros-comuns-com-flags-e-eventos">2.12 Erros comuns com Flags e Eventos</a></li></ul><li><a href="#eb-table-content-23">Mutex no Zephyr: Exclusão Mútua, Herança de Prioridade e Uso Correto</a><ul class="eb-toc__list"><li><a href="#eb-table-content-24">3.1 Por que Mutex existem (e por que eles são perigosos)</a><li><a href="#eb-table-content-25">3.2 O que é um recurso compartilhado de verdade?</a><li><a href="#eb-table-content-26">3.3 Declaração e inicialização de um Mutex</a><li><a href="#eb-table-content-27">3.4 Protegendo uma região crítica com k_mutex</a><li><a href="#eb-table-content-28">3.5 Mutex no Zephyr não é ISR-safe</a><li><a href="#eb-table-content-29">3.6 Inversão de prioridade: o problema clássico</a><li><a href="#eb-table-content-30">3.7 Herança de prioridade no k_mutex</a><li><a href="#38-timeout-em-mutex-quando-faz-sentido">3.8 Timeout em mutex: quando faz sentido?</a><li><a href="#39-deadlocks-como-eles-surgem">3.9 Deadlocks: como eles surgem</a><li><a href="#eb-table-content-33">3.10 Boas práticas para uso de mutex no Zephyr</a><li><a href="#eb-table-content-34">3.11 Quando não usar mutex</a></li></ul><li><a href="#eb-table-content-35">Notificações e k_poll: Esperando Múltiplos Eventos de Forma Elegante</a><ul class="eb-toc__list"><li><a href="#41-por-que-k_poll-existe">4.1 Por que k_poll existe?</a><li><a href="#eb-table-content-37">4.2 O que é k_poll conceitualmente?</a><li><a href="#43-objetos-suportados-pelo-k_poll">4.3 Objetos suportados pelo k_poll</a><li><a href="#44-declarando-eventos-de-polling">4.4 Declarando eventos de polling</a><li><a href="#eb-table-content-40">4.5 Aguardando múltiplos eventos</a><li><a href="#eb-table-content-41">4.6 k_poll não é uma fila nem uma flag</a><li><a href="#eb-table-content-42">4.7 k_poll_signal: notificações leves e diretas</a><li><a href="#48-arquitetura-orientada-a-eventos-com-k_poll">4.8 Arquitetura orientada a eventos com k_poll</a><li><a href="#eb-table-content-44">4.9 Quando não usar k_poll</a><li><a href="#410-erros-comuns-com-k_poll">4.10 Erros comuns com k_poll</a></li></ul><li><a href="#eb-table-content-46"> Comparativo Prático e Diretrizes Arquiteturais no Zephyr</a><ul class="eb-toc__list"><li><a href="#51-o-problema-real-escolher-o-mecanismo-errado">5.1 O problema real: escolher o mecanismo errado</a><li><a href="#52-comparativo-conceitual-direto">5.2 Comparativo conceitual direto</a><li><a href="#eb-table-content-49">5.3 Diretrizes práticas de escolha (regra de engenharia)</a><li><a href="#eb-table-content-50">5.4 Arquitetura típica bem projetada no Zephyr</a><li><a href="#eb-table-content-51">5.5 Erros arquiteturais clássicos a evitar</a><li><a href="#eb-table-content-52">5.6 Conclusão da série (neste artigo)</a></li></ul></li></ul></ul></div></div></div></div></div>


<h1 class="wp-block-heading">Visão Geral dos Mecanismos de Sincronização e Comunicação</h1>



<h3 class="wp-block-heading">1.1 Por que o Zephyr oferece múltiplos mecanismos?</h3>



<p class="wp-block-paragraph">Diferente de um RTOS minimalista, o <strong>Zephyr OS</strong> foi projetado para atender desde microcontroladores simples até sistemas complexos com múltiplos <em>cores</em>, <em>drivers</em>, <em>stacks de comunicação</em> e <em>middleware</em>. Por isso, ele <strong>não impõe um único modelo de comunicação entre threads</strong>, mas oferece vários mecanismos, cada um otimizado para um tipo específico de problema.</p>



<p class="wp-block-paragraph">Em termos práticos, isso significa que <strong>não existe “o melhor mecanismo”</strong>, mas sim <strong>o mecanismo correto para cada cenário</strong>. Usar <code>k_mutex</code> onde um <code>k_queue</code> seria adequado gera latência desnecessária. Usar <code>k_poll</code> quando um <code>k_sem</code> resolveria o problema aumenta complexidade sem ganho real.</p>



<p class="wp-block-paragraph">De forma conceitual, os mecanismos do Zephyr podem ser classificados em três grandes grupos:</p>



<ul class="wp-block-list">
<li><strong>Comunicação de dados</strong>: quando informações precisam ser transferidas entre threads</li>



<li><strong>Sincronização</strong>: quando o objetivo é coordenar execução</li>



<li><strong>Exclusão mútua</strong>: quando recursos compartilhados precisam ser protegidos</li>
</ul>



<p class="wp-block-paragraph">Nas próximas seções, vamos analisar como <strong>Queues, Flags, Mutexes, Notificações e Eventos</strong> se encaixam nesses grupos.</p>



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



<h3 class="wp-block-heading">1.2 Threads no Zephyr: o pano de fundo necessário</h3>



<p class="wp-block-paragraph">Antes de falar de filas e eventos, é importante lembrar que o Zephyr adota um <strong>modelo de threads preemptivas</strong>, com prioridades explícitas. Threads de prioridade menor podem ser interrompidas por threads de prioridade maior a qualquer momento.</p>



<p class="wp-block-paragraph">Isso cria dois desafios fundamentais:</p>



<ol class="wp-block-list">
<li><strong>Compartilhamento seguro de dados</strong></li>



<li><strong>Coordenação determinística entre tarefas concorrentes</strong></li>
</ol>



<p class="wp-block-paragraph">Sem mecanismos adequados, surgem problemas clássicos:</p>



<ul class="wp-block-list">
<li><em>Race conditions</em></li>



<li><em>Deadlocks</em></li>



<li><em>Priority inversion</em></li>



<li>Leitura de dados inconsistentes</li>
</ul>



<p class="wp-block-paragraph">Os objetos do kernel (<code>k_*</code>) existem exatamente para resolver esses problemas.</p>



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



<h3 class="wp-block-heading">1.3 Introdução às Queues no Zephyr</h3>



<p class="wp-block-paragraph">As <strong>Queues</strong> no Zephyr são usadas quando <strong>dados precisam ser transferidos entre contextos</strong>, tipicamente entre threads produtoras e consumidoras. Diferente de simples variáveis globais, as queues:</p>



<ul class="wp-block-list">
<li>Garantem <strong>acesso thread-safe</strong></li>



<li>Permitem <strong>bloqueio automático</strong></li>



<li>São integradas ao <strong>escalonador do kernel</strong></li>
</ul>



<p class="wp-block-paragraph">O Zephyr oferece múltiplos tipos de fila. A mais usada conceitualmente é a <strong><code>k_queue</code></strong>, que trabalha com <strong>ponteiros genéricos (<code>void *</code>)</strong>, permitindo grande flexibilidade.</p>



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



<h3 class="wp-block-heading">1.4 Estrutura básica de uma <code>k_queue</code></h3>



<p class="wp-block-paragraph">Uma fila no Zephyr é declarada estaticamente ou dinamicamente. O caso mais comum em sistemas embarcados é a <strong>declaração estática</strong>, que evita alocação dinâmica em tempo de execuçã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>#include &lt;zephyr/kernel.h>

K_QUEUE_DEFINE(minha_fila);
</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>
<span class="line"><span style="color: #88C0D0">K_QUEUE_DEFINE</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">minha_fila</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



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



<ul class="wp-block-list">
<li>A estrutura de controle da fila</li>



<li>A sincronização interna</li>



<li>A integração com o escalonador</li>
</ul>



<p class="wp-block-paragraph">Não há necessidade de inicialização manual.</p>



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



<h3 class="wp-block-heading">1.5 Enviando dados para a fila (Producer)</h3>



<p class="wp-block-paragraph">Um produtor insere elementos na fila usando <code>k_queue_append()</code> ou <code>k_queue_prepend()</code>.</p>



<p class="wp-block-paragraph">Exemplo simples: uma thread que produz mensagens.</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>struct mensagem {
    uint32_t id;
    uint32_t valor;
};

void produtor_thread(void)
{
    static struct mensagem msg;

    while (1) {
        msg.id++;
        msg.valor = k_uptime_get_32();

        k_queue_append(&amp;minha_fila, &amp;msg);

        k_sleep(K_MSEC(500));
    }
}
</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">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mensagem</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">id</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">valor</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">produtor_thread</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: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mensagem</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">msg</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: #D8DEE9">msg</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">id</span><span style="color: #81A1C1">++;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">msg</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">k_uptime_get_32</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: #88C0D0">k_queue_append</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">minha_fila</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">msg</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: #88C0D0">k_sleep</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">K_MSEC</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">500</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"><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>Ponto crítico</strong>:<br>A fila armazena <strong>ponteiros</strong>, não cópias.<br>Isso significa que:</p>



<ul class="wp-block-list">
<li>O objeto precisa existir enquanto estiver na fila</li>



<li>Variáveis automáticas de pilha <strong>não devem</strong> ser usadas</li>
</ul>



<p class="wp-block-paragraph">Esse detalhe é uma das principais fontes de bugs para quem vem de FreeRTOS (onde queues normalmente copiam dados).</p>



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



<h3 class="wp-block-heading">1.6 Recebendo dados da fila (Consumer)</h3>



<p class="wp-block-paragraph">O consumidor usa <code>k_queue_get()</code>, podendo:</p>



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



<li>Bloquear por tempo definido</li>



<li>Não bloquear</li>
</ul>



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

    while (1) {
        msg = k_queue_get(&amp;minha_fila, K_FOREVER);

        printk("Recebido: id=%d valor=%d\n",
               msg->id, msg->valor);
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">consumidor_thread</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: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mensagem</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">msg</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: #D8DEE9">msg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">k_queue_get</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">minha_fila</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>
<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">Recebido: id=%d valor=%d</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">               </span><span style="color: #D8DEE9">msg</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">id</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">msg</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">valor</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 o kernel:</p>



<ul class="wp-block-list">
<li>Coloca a thread em <strong>estado bloqueado</strong></li>



<li>Acorda automaticamente quando um item chega</li>



<li>Garante que apenas um consumidor receba cada item</li>
</ul>



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



<h3 class="wp-block-heading">1.7 Quando usar <code>k_queue</code> (e quando não usar)</h3>



<p class="wp-block-paragraph">Use <strong>Queues</strong> quando:</p>



<ul class="wp-block-list">
<li>Dados precisam ser transferidos entre threads</li>



<li>Existe um padrão produtor–consumidor</li>



<li>O volume de dados não é trivial</li>



<li>A ordem de processamento importa</li>
</ul>



<p class="wp-block-paragraph">Evite <code>k_queue</code> quando:</p>



<ul class="wp-block-list">
<li>Apenas um <em>flag</em> é necessário</li>



<li>Não há dados associados ao evento</li>



<li>Latência mínima é crítica (flags são mais rápidas)</li>
</ul>



<p class="wp-block-paragraph">Nesses casos, <strong>Flags e Eventos</strong> são mais apropriados — tema da próxima seção.</p>



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



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



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



<ol class="wp-block-list">
<li>Inserir ponteiros para variáveis locais</li>



<li>Reutilizar a mesma estrutura sem controle</li>



<li>Usar fila quando um simples evento resolveria</li>



<li>Esquecer que múltiplos consumidores competem pelo mesmo item</li>
</ol>



<p class="wp-block-paragraph">Esses erros não geram <em>warnings</em> de compilação, mas resultam em <strong>comportamento não determinístico</strong>, especialmente sob carga.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/rtos/filas-flags-mutexes-notificacoes-e-eventos-no-zephyr-rtos/">Filas, Flags, Mutexes, Notificações e Eventos no Zephyr RTOS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1052</post-id>	</item>
	</channel>
</rss>
