<?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>MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 27 May 2026 19:08:20 +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>MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>JavaScript em Microcontroladores: Espruino, Microvium, Moddable XS, mJS e JerryScript</title>
		<link>https://mcu.tec.br/geral/javascript-em-microcontroladores-espruino-microvium-moddable-xs-mjs-e-jerryscript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascript-em-microcontroladores-espruino-microvium-moddable-xs-mjs-e-jerryscript</link>
					<comments>https://mcu.tec.br/geral/javascript-em-microcontroladores-espruino-microvium-moddable-xs-mjs-e-jerryscript/#respond</comments>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 29 May 2026 21:29:52 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1455</guid>

					<description><![CDATA[<p>Entenda como usar JavaScript em microcontroladores com engines como Espruino, Microvium, Moddable SDK com XS Engine, mJS da Cesanta e JerryScript. O artigo compara vantagens, limitações, consumo de memória, integração com C/C++, uso em IoT, prototipação, scripting embarcado e aplicações reais. Também explica quando JavaScript pode ser útil em sistemas embarcados e quando C ou C++ continuam sendo escolhas mais adequadas para tarefas críticas de tempo real, drivers, interrupções, controle de periféricos e processamento intensivo.</p>
<p>The post <a href="https://mcu.tec.br/geral/javascript-em-microcontroladores-espruino-microvium-moddable-xs-mjs-e-jerryscript/">JavaScript em Microcontroladores: Espruino, Microvium, Moddable XS, mJS e JerryScript</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-dh01j wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-dh01j "><div class="eb-toc-container eb-toc-dh01j  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;:2,&quot;content&quot;:&quot;Espruino: JavaScript interativo para prototipa\u00e7\u00e3o embarcada&quot;,&quot;text&quot;:&quot;Espruino: JavaScript interativo para prototipa\u00e7\u00e3o embarcada&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Microvium: JavaScript min\u00fasculo para firmware em C&quot;,&quot;text&quot;:&quot;Microvium: JavaScript min\u00fasculo para firmware em C&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Moddable SDK e XS Engine: JavaScript moderno para produtos IoT embarcados&quot;,&quot;text&quot;:&quot;Moddable SDK e XS Engine: JavaScript moderno para produtos IoT embarcados&quot;,&quot;link&quot;:&quot;moddable-sdk-e-xs-engine-javascript-moderno-para-produtos-iot-embarcados&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;mJS da Cesanta: scripting JavaScript enxuto para firmware em C\/C++&quot;,&quot;text&quot;:&quot;mJS da Cesanta: scripting JavaScript enxuto para firmware em C\/C++&quot;,&quot;link&quot;:&quot;mjs-da-cesanta-scripting-javascript-enxuto-para-firmware-em-cc&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;JerryScript: uma engine JavaScript leve para IoT e dispositivos restritos&quot;,&quot;text&quot;:&quot;JerryScript: uma engine JavaScript leve para IoT e dispositivos restritos&quot;,&quot;link&quot;:&quot;jerryscript-uma-engine-javascript-leve-para-iot-e-dispositivos-restritos&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conclus\u00e3o: JavaScript em microcontroladores \u00e9 uma camada, n\u00e3o um substituto absoluto do C&quot;,&quot;text&quot;:&quot;Conclus\u00e3o: JavaScript em microcontroladores \u00e9 uma camada, n\u00e3o um substituto absoluto do C&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Sites oficiais das engines apresentadas&quot;,&quot;text&quot;:&quot;Sites oficiais das engines apresentadas&quot;,&quot;link&quot;:&quot;sites-oficiais-das-engines-apresentadas&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Espruino: JavaScript interativo para prototipa\u00e7\u00e3o embarcada&quot;,&quot;value&quot;:&quot;espruino-javascript-interativo-para-prototipa\u00e7\u00e3o-embarcada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Microvium: JavaScript min\u00fasculo para firmware em C&quot;,&quot;value&quot;:&quot;microvium-javascript-min\u00fasculo-para-firmware-em-c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Moddable SDK e XS Engine: JavaScript moderno para produtos IoT embarcados&quot;,&quot;value&quot;:&quot;moddable-sdk-e-xs-engine-javascript-moderno-para-produtos-iot-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;mJS da Cesanta: scripting JavaScript enxuto para firmware em C\/C++&quot;,&quot;value&quot;:&quot;mjs-da-cesanta-scripting-javascript-enxuto-para-firmware-em-cc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;JerryScript: uma engine JavaScript leve para IoT e dispositivos restritos&quot;,&quot;value&quot;:&quot;jerryscript-uma-engine-javascript-leve-para-iot-e-dispositivos-restritos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o: JavaScript em microcontroladores \u00e9 uma camada, n\u00e3o um substituto absoluto do C&quot;,&quot;value&quot;:&quot;conclus\u00e3o-javascript-em-microcontroladores-\u00e9-uma-camada-n\u00e3o-um-substituto-absoluto-do-c&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sites oficiais das engines apresentadas&quot;,&quot;value&quot;:&quot;sites-oficiais-das-engines-apresentadas&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">Espruino: JavaScript interativo para prototipação embarcada</a><li><a href="#eb-table-content-1">Microvium: JavaScript minúsculo para firmware em C</a><li><a href="#moddable-sdk-e-xs-engine-javascript-moderno-para-produtos-iot-embarcados">Moddable SDK e XS Engine: JavaScript moderno para produtos IoT embarcados</a><li><a href="#mjs-da-cesanta-scripting-javascript-enxuto-para-firmware-em-cc">mJS da Cesanta: scripting JavaScript enxuto para firmware em C/C++</a><li><a href="#jerryscript-uma-engine-javascript-leve-para-iot-e-dispositivos-restritos">JerryScript: uma engine JavaScript leve para IoT e dispositivos restritos</a><li><a href="#eb-table-content-5">Conclusão: JavaScript em microcontroladores é uma camada, não um substituto absoluto do C</a><li><a href="#sites-oficiais-das-engines-apresentadas">Sites oficiais das engines apresentadas</a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Quando falamos em JavaScript, é comum imaginar navegadores, servidores Node.js, aplicações web, painéis administrativos e sistemas de automação em nuvem. Porém, nos últimos anos, surgiram engines específicas para permitir que partes de um firmware sejam escritas em JavaScript, mesmo em ambientes extremamente restritos, como microcontroladores com pouca memória RAM, pouca Flash e baixo poder de processamento. Essa abordagem não substitui C ou C++ em todos os cenários, mas abre uma possibilidade interessante: usar JavaScript como linguagem de controle, automação, prototipação ou scripting embarcado.</p>



<p class="wp-block-paragraph">Em sistemas embarcados tradicionais, especialmente aqueles baseados em microcontroladores, C e C++ continuam sendo as linguagens dominantes porque oferecem controle direto sobre memória, registradores, interrupções, periféricos e tempo de execução. Esse domínio é essencial quando lidamos com temporização precisa, drivers, comunicação em baixo nível, controle de motores, aquisição de sinais, DSP ou sistemas de tempo real. O próprio Bruce Powel Douglass destaca que sistemas embarcados trabalham sob restrições severas de memória, energia, custo, desempenho, confiabilidade e segurança, o que torna a escolha da linguagem e da arquitetura uma decisão crítica de projeto.</p>



<p class="wp-block-paragraph">A vantagem do JavaScript nesse contexto está principalmente na produtividade. Um código em JavaScript pode ser mais simples de escrever, testar e modificar do que um código equivalente em C, especialmente quando o objetivo é criar lógica de alto nível, regras de automação, manipulação de JSON, comunicação com serviços web ou comportamento configurável pelo usuário. Em aplicações IoT, onde o dispositivo conversa com APIs, processa mensagens, recebe comandos remotos e executa regras de negócio, JavaScript pode ser uma camada conveniente acima do firmware nativo.</p>



<p class="wp-block-paragraph">Outra vantagem importante é a capacidade de atualização dinâmica. Algumas engines permitem carregar ou alterar scripts sem recompilar todo o firmware. Isso é muito interessante em produtos que precisam ajustar regras de funcionamento em campo. Imagine um gateway IoT, um sensor inteligente ou um controlador de automação residencial: a camada de baixo nível continua em C, garantindo acesso seguro ao hardware, enquanto uma camada em JavaScript define comportamentos mais flexíveis. Esse modelo lembra a ideia de separar responsabilidades em camadas: o firmware nativo controla o hardware; o script expressa a lógica variável.</p>



<p class="wp-block-paragraph">No entanto, essa flexibilidade tem custo. JavaScript normalmente exige uma engine de interpretação ou execução, o que consome Flash, RAM e ciclos de CPU. Mesmo engines otimizadas, como Espruino, Microvium, XS, mJS e JerryScript, precisam representar objetos, funções, strings, escopos e valores dinâmicos. Isso cria uma sobrecarga que não existiria em uma implementação puramente em C. Em microcontroladores muito pequenos, essa diferença pode inviabilizar o uso de JavaScript ou limitar fortemente o tamanho dos scripts.</p>



<p class="wp-block-paragraph">Também existe o problema da previsibilidade temporal. JavaScript é uma linguagem dinâmica: tipos podem mudar em tempo de execução, objetos podem ser criados dinamicamente e algumas engines podem usar mecanismos de gerenciamento de memória. Em sistemas de tempo real, isso precisa ser analisado com muito cuidado. Um código que funciona bem em uma tarefa de configuração, telemetria ou automação pode não ser adequado para uma rotina de controle com deadline rígido, como PWM de alta precisão, leitura determinística de ADC por DMA ou controle de corrente em uma fonte chaveada.</p>



<p class="wp-block-paragraph">Outro ponto crítico é a integração com o hardware. JavaScript não acessa diretamente registradores, interrupções ou periféricos da mesma forma que C. Ele depende de APIs fornecidas pela engine ou pelo firmware hospedeiro. Isso pode ser uma vantagem, porque cria uma camada mais segura e abstrata; mas também pode ser uma limitação, porque o desenvolvedor fica preso ao que a engine expõe. Em muitos projetos reais, a solução mais equilibrada é híbrida: C/C++ implementa drivers, HAL, protocolos críticos e rotinas temporais; JavaScript implementa scripts de configuração, regras de negócio, automação e lógica de aplicação.</p>



<p class="wp-block-paragraph">A segurança também deve ser considerada. Permitir scripts em um dispositivo embarcado significa abrir uma superfície adicional de erro. Um script mal escrito pode consumir memória, travar uma lógica de aplicação, gerar loops indesejados ou acessar funções expostas de forma inadequada. Por isso, em produtos profissionais, a engine JavaScript deve ser usada com limites claros: controle de memória, validação de scripts, APIs restritas, watchdog, testes de integração e, quando necessário, assinatura ou autenticação do código carregado.</p>



<p class="wp-block-paragraph">Portanto, usar JavaScript em microcontroladores não deve ser visto como “trocar C por JavaScript”. A visão mais madura é entender JavaScript como uma camada complementar. Ele é útil quando o projeto precisa de produtividade, atualização rápida, scripting, integração com JSON, regras configuráveis ou facilidade para desenvolvedores vindos do mundo web. Ele é menos indicado quando o projeto exige controle absoluto de tempo, uso mínimo de memória, certificação rigorosa, processamento digital pesado ou acesso intenso e direto ao hardware.</p>



<p class="wp-block-paragraph">No restante do artigo, analisaremos algumas das principais engines que tornam essa abordagem possível: Espruino, Microvium, Moddable SDK com XS Engine, mJS da Cesanta e JerryScript. Cada uma adota uma estratégia diferente para resolver o mesmo desafio: como levar JavaScript para um ambiente onde cada kilobyte de RAM, cada kilobyte de Flash e cada ciclo de CPU importam.</p><p>The post <a href="https://mcu.tec.br/geral/javascript-em-microcontroladores-espruino-microvium-moddable-xs-mjs-e-jerryscript/">JavaScript em Microcontroladores: Espruino, Microvium, Moddable XS, mJS e JerryScript</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://mcu.tec.br/geral/javascript-em-microcontroladores-espruino-microvium-moddable-xs-mjs-e-jerryscript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1455</post-id>	</item>
		<item>
		<title>Sistemas de Arquivos em Microcontroladores: LittleFS, SPIFFS e SD Card no STM32N6</title>
		<link>https://mcu.tec.br/geral/sistemas-de-arquivos-em-microcontroladores-littlefs-spiffs-e-sd-card-no-stm32n6/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sistemas-de-arquivos-em-microcontroladores-littlefs-spiffs-e-sd-card-no-stm32n6</link>
					<comments>https://mcu.tec.br/geral/sistemas-de-arquivos-em-microcontroladores-littlefs-spiffs-e-sd-card-no-stm32n6/#respond</comments>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 27 May 2026 18:54:56 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1446</guid>

					<description><![CDATA[<p>sistemas de arquivos para microcontroladores, LittleFS, SPIFFS, FATFS, SD Card, STM32N6, FreeRTOS, Flash externa, SPI Flash, QSPI, OctoSPI, sistemas embarcados, firmware em C, armazenamento em microcontroladores, logs em SD Card, arquivos em sistemas embarcados, memória Flash NOR, wear leveling, sistema de arquivos embarcado, STM32, datalogger com STM32, configuração persistente em firmware, armazenamento não volátil</p>
<p>The post <a href="https://mcu.tec.br/geral/sistemas-de-arquivos-em-microcontroladores-littlefs-spiffs-e-sd-card-no-stm32n6/">Sistemas de Arquivos em Microcontroladores: LittleFS, SPIFFS e SD Card no STM32N6</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-pdcts wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-pdcts "><div class="eb-toc-container eb-toc-pdcts  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;:2,&quot;content&quot;:&quot;A diferen\u00e7a entre Flash bruta, SPI Flash e SD Card&quot;,&quot;text&quot;:&quot;A diferen\u00e7a entre Flash bruta, SPI Flash e SD Card&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;LittleFS vs SPIFFS: compara\u00e7\u00e3o t\u00e9cnica para microcontroladores&quot;,&quot;text&quot;:&quot;LittleFS vs SPIFFS: compara\u00e7\u00e3o t\u00e9cnica para microcontroladores&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Arquitetura proposta: STM32N6, SD Card, FATFS e FreeRTOS&quot;,&quot;text&quot;:&quot;Arquitetura proposta: STM32N6, SD Card, FATFS e FreeRTOS&quot;,&quot;link&quot;:&quot;arquitetura-proposta-stm32n6-sd-card-fatfs-e-freertos&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Gravando logs no SD Card com uma tarefa dedicada&quot;,&quot;text&quot;:&quot;Gravando logs no SD Card com uma tarefa dedicada&quot;,&quot;link&quot;:&quot;gravando-logs-no-sd-card-com-uma-tarefa-dedicada&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Exemplo conceitual usando LittleFS em uma Flash externa no STM32N6&quot;,&quot;text&quot;:&quot;Exemplo conceitual usando LittleFS em uma Flash externa no STM32N6&quot;,&quot;link&quot;:&quot;exemplo-conceitual-usando-littlefs-em-uma-flash-externa-no-stm32n6&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Exemplo conceitual usando SPIFFS em Flash externa&quot;,&quot;text&quot;:&quot;Exemplo conceitual usando SPIFFS em Flash externa&quot;,&quot;link&quot;:&quot;exemplo-conceitual-usando-spiffs-em-flash-externa&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Comparativo pr\u00e1tico: FATFS, LittleFS e SPIFFS no STM32N6&quot;,&quot;text&quot;:&quot;Comparativo pr\u00e1tico: FATFS, LittleFS e SPIFFS no STM32N6&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Boas pr\u00e1ticas de projeto ao gravar arquivos em SD Card e Flash&quot;,&quot;text&quot;:&quot;Boas pr\u00e1ticas de projeto ao gravar arquivos em SD Card e Flash&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Escolher o sistema de arquivos \u00e9 escolher a arquitetura de persist\u00eancia&quot;,&quot;text&quot;:&quot;Escolher o sistema de arquivos \u00e9 escolher a arquitetura de persist\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;A diferen\u00e7a entre Flash bruta, SPI Flash e SD Card&quot;,&quot;value&quot;:&quot;a-diferen\u00e7a-entre-flash-bruta-spi-flash-e-sd-card&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;LittleFS vs SPIFFS: compara\u00e7\u00e3o t\u00e9cnica para microcontroladores&quot;,&quot;value&quot;:&quot;littlefs-vs-spiffs-compara\u00e7\u00e3o-t\u00e9cnica-para-microcontroladores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquitetura proposta: STM32N6, SD Card, FATFS e FreeRTOS&quot;,&quot;value&quot;:&quot;arquitetura-proposta-stm32n6-sd-card-fatfs-e-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Gravando logs no SD Card com uma tarefa dedicada&quot;,&quot;value&quot;:&quot;gravando-logs-no-sd-card-com-uma-tarefa-dedicada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual usando LittleFS em uma Flash externa no STM32N6&quot;,&quot;value&quot;:&quot;exemplo-conceitual-usando-littlefs-em-uma-flash-externa-no-stm32n6&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual usando SPIFFS em Flash externa&quot;,&quot;value&quot;:&quot;exemplo-conceitual-usando-spiffs-em-flash-externa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Comparativo pr\u00e1tico: FATFS, LittleFS e SPIFFS no STM32N6&quot;,&quot;value&quot;:&quot;comparativo-pr\u00e1tico-fatfs-littlefs-e-spiffs-no-stm32n6&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas pr\u00e1ticas de projeto ao gravar arquivos em SD Card e Flash&quot;,&quot;value&quot;:&quot;boas-pr\u00e1ticas-de-projeto-ao-gravar-arquivos-em-sd-card-e-flash&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Escolher o sistema de arquivos \u00e9 escolher a arquitetura de persist\u00eancia&quot;,&quot;value&quot;:&quot;escolher-o-sistema-de-arquivos-\u00e9-escolher-a-arquitetura-de-persist\u00eancia&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">A diferença entre Flash bruta, SPI Flash e SD Card</a><li><a href="#eb-table-content-1">LittleFS vs SPIFFS: comparação técnica para microcontroladores</a><li><a href="#arquitetura-proposta-stm32n6-sd-card-fatfs-e-freertos">Arquitetura proposta: STM32N6, SD Card, FATFS e FreeRTOS</a><li><a href="#gravando-logs-no-sd-card-com-uma-tarefa-dedicada">Gravando logs no SD Card com uma tarefa dedicada</a><li><a href="#exemplo-conceitual-usando-littlefs-em-uma-flash-externa-no-stm32n6">Exemplo conceitual usando LittleFS em uma Flash externa no STM32N6</a><li><a href="#exemplo-conceitual-usando-spiffs-em-flash-externa">Exemplo conceitual usando SPIFFS em Flash externa</a><li><a href="#eb-table-content-6">Comparativo prático: FATFS, LittleFS e SPIFFS no STM32N6</a><li><a href="#eb-table-content-7">Boas práticas de projeto ao gravar arquivos em SD Card e Flash</a><li><a href="#eb-table-content-8">Escolher o sistema de arquivos é escolher a arquitetura de persistência</a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Em sistemas embarcados, nem todo dado pode ficar apenas em variáveis, memória RAM ou registradores. Um microcontrolador frequentemente precisa guardar configurações, logs, arquivos de calibração, certificados, imagens, modelos de IA embarcada, tabelas de parâmetros, amostras de sensores e dados coletados em campo. Quando esses dados precisam sobreviver a um reset ou à falta de energia, entramos no domínio do armazenamento não volátil.</p>



<p class="wp-block-paragraph">É nesse ponto que surge a necessidade de um sistema de arquivos. Um sistema de arquivos é uma camada de software responsável por organizar dados persistentes em estruturas compreensíveis: arquivos, diretórios, nomes, metadados, posições de leitura e escrita, controle de espaço livre e, em alguns casos, mecanismos de recuperação contra falhas. Sem essa camada, o firmware teria que gravar diretamente blocos crus de memória, controlando manualmente endereços, apagamentos, alinhamento, desgaste e integridade.</p>



<p class="wp-block-paragraph">No mundo dos microcontroladores, porém, o problema é mais delicado do que em um computador comum. O firmware trabalha com pouca memória RAM, tempo de execução limitado, risco de queda súbita de energia, ciclos de escrita finitos e diferentes tipos de mídia. Uma memória NOR Flash externa via SPI tem comportamento muito diferente de um cartão SD. A Flash exige apagamento por blocos, escrita com restrições físicas e controle de desgaste. Já o cartão SD possui um controlador interno que oculta boa parte da complexidade da NAND Flash usada dentro do cartão.</p>



<p class="wp-block-paragraph">Por isso, comparar <strong>LittleFS</strong> e <strong>SPIFFS</strong> diretamente em um projeto com <strong>SD Card</strong> exige cuidado. O <strong>LittleFS</strong> foi projetado como um sistema de arquivos pequeno, resistente a falhas de energia, com desgaste distribuído e uso limitado de RAM/ROM para dispositivos de Flash embarcada. A própria documentação do projeto destaca recursos como <em>dynamic wear leveling</em> e uso de memória limitado. (<a href="https://github.com/littlefs-project/littlefs?utm_source=chatgpt.com">GitHub</a>) O <strong>SPIFFS</strong>, por sua vez, também foi criado para dispositivos <strong>SPI NOR Flash</strong>, com foco em alvos embarcados pequenos, pouca RAM e desgaste de blocos de Flash. (<a href="https://github.com/pellepl/spiffs?utm_source=chatgpt.com">GitHub</a>)</p>



<p class="wp-block-paragraph">Isso significa que, em um projeto com <strong>STM32N6 + SD Card + FreeRTOS</strong>, o sistema de arquivos mais natural normalmente seria <strong>FATFS</strong> ou <strong>FreeRTOS+FAT</strong>, porque cartões SD são tradicionalmente formatados em FAT/FAT32/exFAT e precisam ser lidos por computadores, celulares, câmeras, gravadores e ferramentas comuns. Já LittleFS e SPIFFS fazem mais sentido quando o armazenamento é uma Flash externa ou interna acessada diretamente pelo microcontrolador, não um SD Card convencional.</p>



<p class="wp-block-paragraph">O <strong>STM32N6</strong> é uma família moderna da STMicroelectronics baseada em Arm Cortex-M55 a 800 MHz, voltada a aplicações embarcadas de alto desempenho, inclusive com recursos adequados para aplicações complexas de borda. (<a href="https://www.st.com/en/microcontrollers-microprocessors/stm32n6-series.html?utm_source=chatgpt.com">STMicroelectronics</a>) Em um sistema desse tipo, usar SD Card é bastante coerente para registrar grandes volumes de dados, armazenar arquivos de configuração, gravar logs de inferência, coletar amostras de sensores ou guardar modelos e metadados de aplicação. O FreeRTOS entra apenas como camada de execução concorrente: uma tarefa pode coletar dados, outra pode gravar no cartão, outra pode transmitir pela rede, mas o sistema de arquivos precisa ser protegido contra acesso simultâneo indevido.</p>



<p class="wp-block-paragraph">Portanto, neste artigo, vamos tratar o tema de forma prática: primeiro entenderemos as diferenças entre LittleFS, SPIFFS e sistemas FAT para SD Card; depois veremos quando usar cada um; em seguida construiremos exemplos em C para STM32N6 com SD Card e FreeRTOS; e, por fim, mostraremos como adaptar a ideia para LittleFS e SPIFFS, mesmo explicando por que eles não são a escolha mais natural para um cartão SD comum.</p>



<p class="wp-block-paragraph">Nesta primeira parte, a ideia central é simples: <strong>sistema de arquivos em microcontrolador não é apenas “salvar um arquivo”; é escolher uma estratégia de persistência compatível com a mídia física, com a robustez desejada e com os limites do firmware.</strong></p><p>The post <a href="https://mcu.tec.br/geral/sistemas-de-arquivos-em-microcontroladores-littlefs-spiffs-e-sd-card-no-stm32n6/">Sistemas de Arquivos em Microcontroladores: LittleFS, SPIFFS e SD Card no STM32N6</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://mcu.tec.br/geral/sistemas-de-arquivos-em-microcontroladores-littlefs-spiffs-e-sd-card-no-stm32n6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1446</post-id>	</item>
		<item>
		<title>Apollo Guidance Computer: o software embarcado que levou a humanidade à Lua</title>
		<link>https://mcu.tec.br/geral/apollo-guidance-computer-o-software-embarcado-que-levou-a-humanidade-a-lua/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=apollo-guidance-computer-o-software-embarcado-que-levou-a-humanidade-a-lua</link>
					<comments>https://mcu.tec.br/geral/apollo-guidance-computer-o-software-embarcado-que-levou-a-humanidade-a-lua/#respond</comments>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 27 May 2026 14:43:55 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1460</guid>

					<description><![CDATA[<p>Conheça a história do Apollo Guidance Computer, o computador embarcado que ajudou a levar o homem à Lua. O artigo explica como limitações extremas de memória, processamento e energia moldaram uma das maiores conquistas da engenharia de software, destacando Margaret Hamilton, a core rope memory, os alarmes 1201 e 1202 da Apollo 11, o uso de prioridades em tempo real, a validação por simulação e as lições que continuam atuais para quem desenvolve firmware, microcontroladores, RTOS, FPGA, IoT e sistemas embarcados críticos.</p>
<p>The post <a href="https://mcu.tec.br/geral/apollo-guidance-computer-o-software-embarcado-que-levou-a-humanidade-a-lua/">Apollo Guidance Computer: o software embarcado que levou a humanidade à Lua</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Quando a escassez se transforma em engenharia</h2>


<div class="root-eb-toc-pzeny wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-pzeny "><div class="eb-toc-container eb-toc-pzeny  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;:2,&quot;content&quot;:&quot;Quando a escassez se transforma em engenharia&quot;,&quot;text&quot;:&quot;Quando a escassez se transforma em engenharia&quot;,&quot;link&quot;:&quot;quando-a-escassez-se-transforma-em-engenharia&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Margaret Hamilton e o nascimento da engenharia de software cr\u00edtica&quot;,&quot;text&quot;:&quot;Margaret Hamilton e o nascimento da engenharia de software cr\u00edtica&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Core rope memory: quando o software era tecido no hardware&quot;,&quot;text&quot;:&quot;Core rope memory: quando o software era tecido no hardware&quot;,&quot;link&quot;:&quot;core-rope-memory-quando-o-software-era-tecido-no-hardware&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Se\u00e7\u00e3o 4 \u2014 Alarmes 1201 e 1202: o software sob press\u00e3o durante o pouso da Apollo 11&quot;,&quot;text&quot;:&quot;Se\u00e7\u00e3o 4 \u2014 Alarmes 1201 e 1202: o software sob press\u00e3o durante o pouso da Apollo 11&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Valida\u00e7\u00e3o, simula\u00e7\u00e3o e confian\u00e7a: como testar um sistema para um ambiente desconhecido&quot;,&quot;text&quot;:&quot;Valida\u00e7\u00e3o, simula\u00e7\u00e3o e confian\u00e7a: como testar um sistema para um ambiente desconhecido&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Se\u00e7\u00e3o 6 \u2014 Conclus\u00e3o: o legado do Apollo Guidance Computer para os sistemas embarcados modernos&quot;,&quot;text&quot;:&quot;Se\u00e7\u00e3o 6 \u2014 Conclus\u00e3o: o legado do Apollo Guidance Computer para os sistemas embarcados modernos&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Refer\u00eancias&quot;,&quot;text&quot;:&quot;Refer\u00eancias&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Quando a escassez se transforma em engenharia&quot;,&quot;value&quot;:&quot;quando-a-escassez-se-transforma-em-engenharia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Margaret Hamilton e o nascimento da engenharia de software cr\u00edtica&quot;,&quot;value&quot;:&quot;margaret-hamilton-e-o-nascimento-da-engenharia-de-software-cr\u00edtica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Core rope memory: quando o software era tecido no hardware&quot;,&quot;value&quot;:&quot;core-rope-memory-quando-o-software-era-tecido-no-hardware&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Se\u00e7\u00e3o 4 \u2014 Alarmes 1201 e 1202: o software sob press\u00e3o durante o pouso da Apollo 11&quot;,&quot;value&quot;:&quot;se\u00e7\u00e3o-4-alarmes-1201-e-1202-o-software-sob-press\u00e3o-durante-o-pouso-da-apollo-11&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Valida\u00e7\u00e3o, simula\u00e7\u00e3o e confian\u00e7a: como testar um sistema para um ambiente desconhecido&quot;,&quot;value&quot;:&quot;valida\u00e7\u00e3o-simula\u00e7\u00e3o-e-confian\u00e7a-como-testar-um-sistema-para-um-ambiente-desconhecido&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Se\u00e7\u00e3o 6 \u2014 Conclus\u00e3o: o legado do Apollo Guidance Computer para os sistemas embarcados modernos&quot;,&quot;value&quot;:&quot;se\u00e7\u00e3o-6-conclus\u00e3o-o-legado-do-apollo-guidance-computer-para-os-sistemas-embarcados-modernos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Refer\u00eancias&quot;,&quot;value&quot;:&quot;refer\u00eancias&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="#quando-a-escassez-se-transforma-em-engenharia">Quando a escassez se transforma em engenharia</a><li><a href="#eb-table-content-1">Margaret Hamilton e o nascimento da engenharia de software crítica</a><li><a href="#core-rope-memory-quando-o-software-era-tecido-no-hardware">Core rope memory: quando o software era tecido no hardware</a><li><a href="#eb-table-content-3">Seção 4 — Alarmes 1201 e 1202: o software sob pressão durante o pouso da Apollo 11</a><li><a href="#eb-table-content-4">Validação, simulação e confiança: como testar um sistema para um ambiente desconhecido</a><li><a href="#eb-table-content-5">Seção 6 — Conclusão: o legado do Apollo Guidance Computer para os sistemas embarcados modernos</a><li><a href="#eb-table-content-6">Referências</a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Quando pensamos na missão Apollo, é natural imaginar os foguetes Saturn V, os astronautas, os centros de controle da NASA e a imensa infraestrutura criada para levar seres humanos à Lua. Mas uma das partes mais decisivas dessa história cabia dentro da nave e operava com recursos que hoje pareceriam quase absurdos: o <strong>Apollo Guidance Computer</strong>, ou <strong>AGC</strong>, o computador de orientação usado no módulo de comando e no módulo lunar.</p>



<p class="wp-block-paragraph">O AGC não era um computador genérico. Ele era um sistema embarcado crítico, projetado para executar funções muito específicas: navegação, orientação, controle de atitude, apoio ao pouso lunar e interação com os astronautas por meio da interface chamada <strong>DSKY</strong>, sigla para <em>Display and Keyboard</em>. Essa interface permitia que os astronautas enviassem comandos numéricos ao computador usando combinações de “verbos” e “substantivos”, uma forma compacta e direta de conversar com a máquina em pleno voo. (<a href="https://en.wikipedia.org/wiki/Apollo_Guidance_Computer?utm_source=chatgpt.com" rel="noreferrer noopener" target="_blank">Wikipedia</a>)</p>



<p class="wp-block-paragraph">A limitação mais conhecida do AGC está na memória. O modelo usado nas missões Apollo possuía <strong>2.048 words de memória erasable</strong>, usada como memória regravável para dados temporários, e <strong>36.864 words de memória fixed</strong>, usada como memória permanente de programa. Essas “words” não devem ser confundidas diretamente com bytes modernos, porque a arquitetura usava palavras de 16 bits, com 15 bits úteis e 1 bit de paridade. Por isso, quando se diz de forma simplificada que o AGC tinha algo próximo de “4 KB de RAM”, estamos fazendo uma aproximação didática a partir da memória erasable. (<a href="https://en.wikipedia.org/wiki/Apollo_Guidance_Computer?utm_source=chatgpt.com" rel="noreferrer noopener" target="_blank">Wikipedia</a>)</p>



<p class="wp-block-paragraph">Essa precisão é importante porque nos impede de transformar a história em mito. O AGC não era “fraco” por incompetência tecnológica. Pelo contrário: ele era uma solução extremamente sofisticada para as restrições de sua época. Peso, consumo de energia, volume, dissipação térmica, confiabilidade e previsibilidade eram fatores tão importantes quanto capacidade de processamento. Na engenharia embarcada, esse tipo de restrição continua sendo decisivo. Sistemas embarcados normalmente precisam executar funções reais, com recursos limitados e fortes exigências de desempenho, confiabilidade, robustez e segurança.</p>



<p class="wp-block-paragraph">Na década de 1960, colocar um computador digital dentro de uma espaçonave era uma decisão ousada. Computadores ainda eram grandes, caros e, muitas vezes, tratados como equipamentos de apoio em solo. A NASA e o MIT Instrumentation Laboratory seguiram por outro caminho: levar a computação para dentro da missão. Isso significava confiar ao software decisões que afetariam diretamente a vida dos astronautas e o sucesso do pouso.</p>



<p class="wp-block-paragraph">Essa escolha mudou a história da engenharia. O software deixou de ser apenas uma sequência de instruções auxiliares e passou a fazer parte do núcleo funcional da missão. Ele precisava responder em tempo real, lidar com sensores, interpretar comandos humanos, calcular trajetórias, preservar tarefas críticas e continuar funcionando mesmo quando o sistema fosse pressionado além do esperado.</p>



<p class="wp-block-paragraph">Hoje, quando abrimos dezenas de abas no navegador, usamos frameworks pesados e tratamos memória como recurso abundante, é difícil imaginar uma equipe discutindo cada instrução como se ela tivesse peso físico. Mas no Projeto Apollo, ela tinha. Cada palavra de memória precisava ser justificada. Cada rotina precisava ter uma razão clara para existir. Cada decisão de projeto precisava equilibrar desempenho, confiabilidade e uso mínimo de recursos.</p>



<p class="wp-block-paragraph">Essa escassez não destruiu a criatividade dos engenheiros. Ela a organizou. Quando tudo é limitado, o projeto precisa ser mais claro. Quando não há espaço para desperdício, a arquitetura precisa ser mais disciplinada. Quando uma falha pode comprometer uma missão inteira, o código deixa de ser apenas funcional e passa a ser uma peça de engenharia crítica.</p>



<p class="wp-block-paragraph">Essa é uma lição muito atual para quem trabalha com microcontroladores, firmware, RTOS, bare metal, FPGA, IoT ou sistemas distribuídos em borda. Mais memória e mais processamento não garantem automaticamente sistemas melhores. Muitas vezes, eles apenas escondem decisões ruins por mais tempo. O Apollo Guidance Computer nos lembra que excelência técnica não nasce da abundância, mas da disciplina aplicada sob restrições reais.</p>



<p class="wp-block-paragraph">A pergunta que fica para nós, desenvolvedores modernos, é simples e desconfortável: se o nosso sistema tivesse apenas alguns kilobytes disponíveis para executar uma função crítica, nosso código sobreviveria?</p>



<p class="wp-block-paragraph">Na próxima seção, vamos entrar na transformação mais importante dessa história: o momento em que Margaret Hamilton e sua equipe ajudaram a mostrar que software também precisava ser tratado como engenharia.</p><p>The post <a href="https://mcu.tec.br/geral/apollo-guidance-computer-o-software-embarcado-que-levou-a-humanidade-a-lua/">Apollo Guidance Computer: o software embarcado que levou a humanidade à Lua</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://mcu.tec.br/geral/apollo-guidance-computer-o-software-embarcado-que-levou-a-humanidade-a-lua/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1460</post-id>	</item>
		<item>
		<title>Usando JSON e cJSON em Microcontroladores</title>
		<link>https://mcu.tec.br/linguagem/c/usando-json-e-cjson-em-microcontroladores/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usando-json-e-cjson-em-microcontroladores</link>
					<comments>https://mcu.tec.br/linguagem/c/usando-json-e-cjson-em-microcontroladores/#respond</comments>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 24 May 2026 22:16:00 +0000</pubDate>
				<category><![CDATA[C]]></category>
		<category><![CDATA[C++]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1443</guid>

					<description><![CDATA[<p>Aprenda como usar JSON e a biblioteca cJSON em microcontroladores com linguagem C. Neste tutorial didático, mostramos como criar objetos JSON, montar hierarquias de dois níveis, trabalhar com arrays, simular sensores, enviar dados para um serviço web mock e interpretar respostas JSON recebidas do servidor. O conteúdo é genérico e pode ser adaptado para STM32, ESP32, RP2040, AVR, RISC-V, FreeRTOS, Zephyr ou projetos bare-metal. Também são apresentados cuidados essenciais com memória, validação de campos, limites de arrays e boas práticas para aplicações IoT embarcadas.</p>
<p>The post <a href="https://mcu.tec.br/linguagem/c/usando-json-e-cjson-em-microcontroladores/">Usando JSON e cJSON em Microcontroladores</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-6lmbw wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-6lmbw "><div class="eb-toc-container eb-toc-6lmbw  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;:2,&quot;content&quot;:&quot;Preparando a cJSON para uso em microcontroladores&quot;,&quot;text&quot;:&quot;Preparando a cJSON para uso em microcontroladores&quot;,&quot;link&quot;:&quot;preparando-a-cjson-para-uso-em-microcontroladores&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Criando JSON com hierarquia de dois n\u00edveis&quot;,&quot;text&quot;:&quot;Criando JSON com hierarquia de dois n\u00edveis&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Trabalhando com arrays em JSON usando cJSON&quot;,&quot;text&quot;:&quot;Trabalhando com arrays em JSON usando cJSON&quot;,&quot;link&quot;:&quot;trabalhando-com-arrays-em-json-usando-cjson&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;sensor_mock.h&quot;,&quot;text&quot;:&quot;sensor_mock.h&quot;,&quot;link&quot;:&quot;sensor_mockh&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;sensor_mock.c&quot;,&quot;text&quot;:&quot;sensor_mock.c&quot;,&quot;link&quot;:&quot;sensor_mockc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;json_builder.c com array&quot;,&quot;text&quot;:&quot;json_builder.c com array&quot;,&quot;link&quot;:&quot;json_builderc-com-array&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Interpretando uma resposta JSON recebida do servidor&quot;,&quot;text&quot;:&quot;Interpretando uma resposta JSON recebida do servidor&quot;,&quot;link&quot;:&quot;interpretando-uma-resposta-json-recebida-do-servidor&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;web_mock.h&quot;,&quot;text&quot;:&quot;web_mock.h&quot;,&quot;link&quot;:&quot;web_mockh&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;web_mock.c&quot;,&quot;text&quot;:&quot;web_mock.c&quot;,&quot;link&quot;:&quot;web_mockc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;app_config.h&quot;,&quot;text&quot;:&quot;app_config.h&quot;,&quot;link&quot;:&quot;app_configh&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;json_parser.h&quot;,&quot;text&quot;:&quot;json_parser.h&quot;,&quot;link&quot;:&quot;json_parserh&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;json_parser.c&quot;,&quot;text&quot;:&quot;json_parser.c&quot;,&quot;link&quot;:&quot;json_parserc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;main.c&quot;,&quot;text&quot;:&quot;main.c&quot;,&quot;link&quot;:&quot;mainc&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Interpretando arrays recebidos em JSON&quot;,&quot;text&quot;:&quot;Interpretando arrays recebidos em JSON&quot;,&quot;link&quot;:&quot;interpretando-arrays-recebidos-em-json&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;app_config.h&quot;,&quot;text&quot;:&quot;app_config.h&quot;,&quot;link&quot;:&quot;app_configh&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;web_mock.c&quot;,&quot;text&quot;:&quot;web_mock.c&quot;,&quot;link&quot;:&quot;web_mockc&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;json_parser.c com leitura de array&quot;,&quot;text&quot;:&quot;json_parser.c com leitura de array&quot;,&quot;link&quot;:&quot;json_parserc-com-leitura-de-array&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;main.c&quot;,&quot;text&quot;:&quot;main.c&quot;,&quot;link&quot;:&quot;mainc&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conclus\u00e3o&quot;,&quot;text&quot;:&quot;Conclus\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;&quot;,&quot;text&quot;:&quot;&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Preparando a cJSON para uso em microcontroladores&quot;,&quot;value&quot;:&quot;preparando-a-cjson-para-uso-em-microcontroladores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Criando JSON com hierarquia de dois n\u00edveis&quot;,&quot;value&quot;:&quot;criando-json-com-hierarquia-de-dois-n\u00edveis&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Trabalhando com arrays em JSON usando cJSON&quot;,&quot;value&quot;:&quot;trabalhando-com-arrays-em-json-usando-cjson&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;sensor_mock.h&quot;,&quot;value&quot;:&quot;sensor_mockh&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;sensor_mock.c&quot;,&quot;value&quot;:&quot;sensor_mockc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;json_builder.c com array&quot;,&quot;value&quot;:&quot;json_builderc-com-array&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpretando uma resposta JSON recebida do servidor&quot;,&quot;value&quot;:&quot;interpretando-uma-resposta-json-recebida-do-servidor&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;web_mock.h&quot;,&quot;value&quot;:&quot;web_mockh&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;web_mock.c&quot;,&quot;value&quot;:&quot;web_mockc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;app_config.h&quot;,&quot;value&quot;:&quot;app_configh&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;json_parser.h&quot;,&quot;value&quot;:&quot;json_parserh&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;json_parser.c&quot;,&quot;value&quot;:&quot;json_parserc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;main.c&quot;,&quot;value&quot;:&quot;mainc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpretando arrays recebidos em JSON&quot;,&quot;value&quot;:&quot;interpretando-arrays-recebidos-em-json&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;app_config.h&quot;,&quot;value&quot;:&quot;app_configh&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;web_mock.c&quot;,&quot;value&quot;:&quot;web_mockc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;json_parser.c com leitura de array&quot;,&quot;value&quot;:&quot;json_parserc-com-leitura-de-array&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;main.c&quot;,&quot;value&quot;:&quot;mainc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o&quot;,&quot;value&quot;:&quot;conclus\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;&quot;,&quot;value&quot;:&quot;&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="#preparando-a-cjson-para-uso-em-microcontroladores">Preparando a cJSON para uso em microcontroladores</a><li><a href="#eb-table-content-1">Criando JSON com hierarquia de dois níveis</a><li><a href="#trabalhando-com-arrays-em-json-usando-cjson">Trabalhando com arrays em JSON usando cJSON</a><ul class="eb-toc__list"><li><a href="#sensor_mockh">sensor_mock.h</a><li><a href="#sensor_mockc">sensor_mock.c</a><li><a href="#json_builderc-com-array">json_builder.c com array</a></li></ul><li><a href="#interpretando-uma-resposta-json-recebida-do-servidor">Interpretando uma resposta JSON recebida do servidor</a><ul class="eb-toc__list"><li><a href="#web_mockh">web_mock.h</a><li><a href="#web_mockc">web_mock.c</a><li><a href="#app_configh">app_config.h</a><li><a href="#json_parserh">json_parser.h</a><li><a href="#json_parserc">json_parser.c</a><li><a href="#mainc">main.c</a></li></ul><li><a href="#interpretando-arrays-recebidos-em-json">Interpretando arrays recebidos em JSON</a><ul class="eb-toc__list"><li><a href="#app_configh">app_config.h</a><li><a href="#web_mockc">web_mock.c</a><li><a href="#json_parserc-com-leitura-de-array">json_parser.c com leitura de array</a><li><a href="#mainc">main.c</a></li></ul><li><a href="#eb-table-content-18">Conclusão</a><li><a href="#eb-table-content-19"></a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">JSON, sigla para <strong>JavaScript Object Notation</strong>, é um formato textual usado para representar dados estruturados. Apesar de ter nascido no ecossistema JavaScript, hoje ele é amplamente usado em APIs web, sistemas IoT, serviços REST, comunicação entre dispositivos, arquivos de configuração e troca de mensagens entre firmware e aplicações externas.</p>



<p class="wp-block-paragraph">Em microcontroladores, JSON aparece principalmente quando o dispositivo precisa conversar com algum sistema externo. Por exemplo, um ESP32 pode enviar leituras de temperatura para um servidor HTTP; um STM32 com modem 4G pode publicar dados em uma API; um RP2040 conectado a um gateway pode receber parâmetros de calibração; ou um dispositivo industrial pode gerar mensagens estruturadas para diagnóstico remoto.</p>



<p class="wp-block-paragraph">A grande vantagem do JSON é a legibilidade. Uma mensagem como esta:</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>{
  "device": "sensor-01",
  "temperature": 27.5,
  "humidity": 61.2,
  "relay": true
}
</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>
<span class="line"><span style="color: #D8DEE9FF">  &quot;device&quot;: &quot;sensor-01&quot;,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;temperature&quot;: 27.5,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;humidity&quot;: 61.2,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;relay&quot;: true</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">é fácil de entender tanto por humanos quanto por máquinas. Isso ajuda no desenvolvimento, no teste, no debug e na integração com sistemas web. Em vez de criar um protocolo binário próprio logo no início do projeto, muitas vezes podemos começar com JSON para acelerar a prototipagem e tornar a comunicação mais clara.</p>



<p class="wp-block-paragraph">Mas existe um ponto importante: <strong>JSON não é o formato mais eficiente para microcontroladores pequenos</strong>. Ele consome mais memória que um protocolo binário, ocupa mais bytes na comunicação e exige processamento para converter texto em dados internos. Em um microcontrolador com poucos kilobytes de RAM, isso precisa ser tratado com cuidado.</p>



<p class="wp-block-paragraph">Por isso, em sistemas embarcados, usamos JSON quando a clareza, a interoperabilidade e a integração com serviços externos são mais importantes do que a máxima economia de memória. Essa é uma decisão típica de projeto embarcado: escolher uma solução que facilite a comunicação, mas sem ignorar restrições de RAM, Flash, tempo de execução e robustez. Esse cuidado está alinhado com a visão clássica de desenvolvimento embarcado em C, onde restrições de memória, desempenho, confiabilidade e custo recorrente influenciam diretamente as decisões de arquitetura.</p>



<p class="wp-block-paragraph">Neste tutorial, vamos usar a biblioteca <strong>cJSON</strong>, uma biblioteca em linguagem C para criar e interpretar documentos JSON. A ideia será manter tudo genérico, sem depender de ESP-IDF, STM32 HAL, Pico SDK, Zephyr ou FreeRTOS. Quando precisarmos simular comunicação com um servidor web, usaremos funções mock, ou seja, funções falsas que imitam o comportamento de uma API externa.</p>



<p class="wp-block-paragraph">A arquitetura básica do nosso exemplo será esta:</p>



<pre class="wp-block-code"><code>+-------------------------+
|     Aplicação MCU       |
|                         |
|  Lê sensores simulados  |
|  Monta JSON com cJSON   |
|  Envia para Web Mock    |
|  Recebe resposta JSON   |
|  Interpreta resposta    |
+-----------+-------------+
            |
            v
+-------------------------+
| Serviço Web Simulado    |
|                         |
| Recebe JSON             |
| Processa dados fake     |
| Retorna JSON            |
+-------------------------+
</code></pre>



<p class="wp-block-paragraph">Neste primeiro momento, podemos imaginar que o microcontrolador coleta dados de sensores e envia essas informações para um servidor. O servidor, por sua vez, responde com alguma configuração, como ligar ou desligar um relé, alterar o intervalo de amostragem ou informar se houve erro na requisição.</p>



<p class="wp-block-paragraph">Um exemplo de mensagem enviada pelo microcontrolador poderia ser:</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>{
  "device_id": "mcu-001",
  "temperature": 28.75,
  "voltage": 3.29,
  "uptime": 15240
}
</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>
<span class="line"><span style="color: #D8DEE9FF">  &quot;device_id&quot;: &quot;mcu-001&quot;,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;temperature&quot;: 28.75,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;voltage&quot;: 3.29,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;uptime&quot;: 15240</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">E uma resposta simulada do servidor poderia ser:</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>{
  "status": "ok",
  "relay": true,
  "sample_interval_ms": 5000
}
</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>
<span class="line"><span style="color: #D8DEE9FF">  &quot;status&quot;: &quot;ok&quot;,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;relay&quot;: true,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  &quot;sample_interval_ms&quot;: 5000</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Perceba que o JSON permite representar textos, números, valores booleanos, objetos e listas. Isso é muito útil quando queremos criar mensagens flexíveis. Porém, em firmware, devemos evitar documentos JSON muito grandes, objetos muito profundos e alocações dinâmicas descontroladas.</p>



<p class="wp-block-paragraph">Ao longo do tutorial, vamos trabalhar com quatro ideias principais: criar JSON, converter JSON para texto, interpretar JSON recebido e proteger o firmware contra erros de formato. A biblioteca cJSON facilita bastante esse processo, mas ela não elimina a responsabilidade do programador embarcado. Sempre será necessário verificar ponteiros, validar tipos, controlar tamanho de buffers e liberar memória corretamente.</p><p>The post <a href="https://mcu.tec.br/linguagem/c/usando-json-e-cjson-em-microcontroladores/">Usando JSON e cJSON em Microcontroladores</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://mcu.tec.br/linguagem/c/usando-json-e-cjson-em-microcontroladores/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1443</post-id>	</item>
		<item>
		<title>mDNS no ESP32 — tornando dispositivos IoT fáceis de encontrar na rede local</title>
		<link>https://mcu.tec.br/protoclos/mdns-no-esp32-tornando-dispositivos-iot-faceis-de-encontrar-na-rede-local/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mdns-no-esp32-tornando-dispositivos-iot-faceis-de-encontrar-na-rede-local</link>
					<comments>https://mcu.tec.br/protoclos/mdns-no-esp32-tornando-dispositivos-iot-faceis-de-encontrar-na-rede-local/#respond</comments>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 24 May 2026 14:16:09 +0000</pubDate>
				<category><![CDATA[protocolos]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1435</guid>

					<description><![CDATA[<p>Aprenda o que é mDNS, como ele funciona e como usá-lo no ESP32 com ESP-IDF para acessar dispositivos IoT por nomes como esp32-sensor.local. O artigo explica a diferença entre descoberta de host e descoberta de serviço, mostra exemplos em C com servidor HTTP, registros TXT e consultas mDNS entre dispositivos ESP32, além de apresentar boas práticas, limitações, segurança e aplicações em arquiteturas IoT locais com sensores, gateways e aplicativos clientes.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/mdns-no-esp32-tornando-dispositivos-iot-faceis-de-encontrar-na-rede-local/">mDNS no ESP32 — tornando dispositivos IoT fáceis de encontrar na rede local</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Quando desenvolvemos aplicações com microcontroladores conectados à rede, como o ESP32, uma das primeiras dificuldades práticas aparece logo após o dispositivo entrar no Wi-Fi: <strong>como o usuário, o aplicativo ou outro equipamento da rede vai descobrir o endereço IP desse ESP32?</strong></p>


<div class="root-eb-toc-bj0ur wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-bj0ur "><div class="eb-toc-container eb-toc-bj0ur  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:3,&quot;content&quot;:&quot;Como o mDNS funciona internamente&quot;,&quot;text&quot;:&quot;Como o mDNS funciona internamente&quot;,&quot;link&quot;:&quot;como-o-mdns-funciona-internamente&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Preparando o ESP-IDF para usar mDNS no ESP32&quot;,&quot;text&quot;:&quot;Preparando o ESP-IDF para usar mDNS no ESP32&quot;,&quot;link&quot;:&quot;preparando-o-esp-idf-para-usar-mdns-no-esp32&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo pr\u00e1tico: ESP32 com servidor HTTP anunciado via mDNS&quot;,&quot;text&quot;:&quot;Exemplo pr\u00e1tico: ESP32 com servidor HTTP anunciado via mDNS&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ESP32 encontrado via mDNS&quot;,&quot;text&quot;:&quot;ESP32 encontrado via mDNS&quot;,&quot;link&quot;:&quot;esp32-encontrado-via-mdns&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ESP32 encontrado via mDNS&quot;,&quot;text&quot;:&quot;ESP32 encontrado via mDNS&quot;,&quot;link&quot;:&quot;esp32-encontrado-via-mdns&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Usando registros TXT no mDNS para descrever o dispositivo&quot;,&quot;text&quot;:&quot;Usando registros TXT no mDNS para descrever o dispositivo&quot;,&quot;link&quot;:&quot;usando-registros-txt-no-mdns-para-descrever-o-dispositivo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Se\u00e7\u00e3o 6 \u2014 Consultando servi\u00e7os mDNS a partir do pr\u00f3prio ESP32&quot;,&quot;text&quot;:&quot;Se\u00e7\u00e3o 6 \u2014 Consultando servi\u00e7os mDNS a partir do pr\u00f3prio ESP32&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Arquitetura pr\u00e1tica: ESP32 sensor, ESP32 gateway e aplicativo cliente&quot;,&quot;text&quot;:&quot;Arquitetura pr\u00e1tica: ESP32 sensor, ESP32 gateway e aplicativo cliente&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boas pr\u00e1ticas e limita\u00e7\u00f5es do mDNS no ESP32&quot;,&quot;text&quot;:&quot;Boas pr\u00e1ticas e limita\u00e7\u00f5es do mDNS no ESP32&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o&quot;,&quot;text&quot;:&quot;Conclus\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Refer\u00eancias&quot;,&quot;text&quot;:&quot;Refer\u00eancias&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Como o mDNS funciona internamente&quot;,&quot;value&quot;:&quot;como-o-mdns-funciona-internamente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Preparando o ESP-IDF para usar mDNS no ESP32&quot;,&quot;value&quot;:&quot;preparando-o-esp-idf-para-usar-mdns-no-esp32&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo pr\u00e1tico: ESP32 com servidor HTTP anunciado via mDNS&quot;,&quot;value&quot;:&quot;exemplo-pr\u00e1tico-esp32-com-servidor-http-anunciado-via-mdns&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ESP32 encontrado via mDNS&quot;,&quot;value&quot;:&quot;esp32-encontrado-via-mdns&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Usando registros TXT no mDNS para descrever o dispositivo&quot;,&quot;value&quot;:&quot;usando-registros-txt-no-mdns-para-descrever-o-dispositivo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Se\u00e7\u00e3o 6 \u2014 Consultando servi\u00e7os mDNS a partir do pr\u00f3prio ESP32&quot;,&quot;value&quot;:&quot;se\u00e7\u00e3o-6-consultando-servi\u00e7os-mdns-a-partir-do-pr\u00f3prio-esp32&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquitetura pr\u00e1tica: ESP32 sensor, ESP32 gateway e aplicativo cliente&quot;,&quot;value&quot;:&quot;arquitetura-pr\u00e1tica-esp32-sensor-esp32-gateway-e-aplicativo-cliente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas pr\u00e1ticas e limita\u00e7\u00f5es do mDNS no ESP32&quot;,&quot;value&quot;:&quot;boas-pr\u00e1ticas-e-limita\u00e7\u00f5es-do-mdns-no-esp32&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o&quot;,&quot;value&quot;:&quot;conclus\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Refer\u00eancias&quot;,&quot;value&quot;:&quot;refer\u00eancias&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="#como-o-mdns-funciona-internamente">Como o mDNS funciona internamente</a><li><a href="#preparando-o-esp-idf-para-usar-mdns-no-esp32">Preparando o ESP-IDF para usar mDNS no ESP32</a><li><a href="#eb-table-content-2">Exemplo prático: ESP32 com servidor HTTP anunciado via mDNS</a><li><a href="#esp32-encontrado-via-mdns">ESP32 encontrado via mDNS</a><li><a href="#esp32-encontrado-via-mdns">ESP32 encontrado via mDNS</a><ul class="eb-toc__list"><li><a href="#usando-registros-txt-no-mdns-para-descrever-o-dispositivo">Usando registros TXT no mDNS para descrever o dispositivo</a><li><a href="#eb-table-content-6">Seção 6 — Consultando serviços mDNS a partir do próprio ESP32</a><li><a href="#eb-table-content-7">Arquitetura prática: ESP32 sensor, ESP32 gateway e aplicativo cliente</a><li><a href="#eb-table-content-8">Boas práticas e limitações do mDNS no ESP32</a><li><a href="#eb-table-content-9">Conclusão</a></li></ul></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Em uma rede doméstica, escolar, industrial ou de laboratório, o endereço IP quase sempre é atribuído automaticamente por DHCP, ou seja, pelo roteador. Hoje o ESP32 pode receber <code>192.168.0.34</code>; amanhã, depois de reiniciar o roteador, pode receber <code>192.168.0.51</code>. Isso cria um problema simples, mas muito comum: se eu hospedo uma página web, uma API REST, um painel de configuração ou um serviço TCP dentro do ESP32, como acesso esse serviço sem ficar procurando o IP no monitor serial ou na lista de clientes do roteador?</p>



<p class="wp-block-paragraph">É aqui que entra o <strong>mDNS</strong>, sigla para <strong>Multicast DNS</strong>. Ele permite que dispositivos em uma rede local sejam encontrados por nome, sem depender de um servidor DNS tradicional. Em vez de acessar:</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>http://192.168.0.34
</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">http://192.168.0.34</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">podemos acessar algo como:</p>



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



<p class="wp-block-paragraph">A documentação oficial da Espressif descreve o mDNS como um serviço UDP multicast usado para descoberta de hosts e serviços na rede local. Ela também destaca que, em versões atuais do ESP-IDF, o componente mDNS foi movido para um repositório separado e pode ser adicionado ao projeto com <code>idf.py add-dependency espressif/mdns</code>. (<a href="https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/protocols/mdns.html?utm_source=chatgpt.com">Espressif Systems</a>)</p>



<p class="wp-block-paragraph">No contexto de sistemas embarcados, isso é extremamente útil porque evita que o dispositivo precise ter uma interface complexa apenas para informar seu endereço IP. Um sensor ambiental, um controlador de relé, um gateway Modbus, um nó MQTT local ou um pequeno servidor HTTP embarcado podem ser encontrados diretamente por nome. Isso reduz atrito na instalação, melhora a experiência do usuário e facilita testes em bancada.</p>



<p class="wp-block-paragraph">Em termos de arquitetura embarcada, o mDNS se encaixa como uma camada de descoberta de serviço dentro da comunicação do sistema. Ele não substitui TCP, UDP, HTTP, MQTT ou WebSocket; ele apenas ajuda os outros dispositivos a descobrirem <strong>onde</strong> determinado serviço está rodando. Essa separação é importante: o mDNS resolve o problema de localização local, enquanto o protocolo da aplicação resolve o problema de troca de dados.</p>



<p class="wp-block-paragraph">Essa abordagem também conversa bem com boas práticas de projeto embarcado. Em sistemas com poucos recursos, como microcontroladores, normalmente buscamos reduzir dependências manuais, simplificar configuração e tornar o sistema mais robusto em campo. Bruce Powel Douglass destaca que sistemas embarcados costumam operar sob restrições severas de memória, processamento, custo, energia e confiabilidade, o que torna importante escolher soluções arquiteturais que otimizem o sistema sem adicionar complexidade desnecessária.</p>



<p class="wp-block-paragraph">No caso do ESP32, o uso do mDNS é especialmente interessante porque esse microcontrolador já possui conectividade Wi-Fi integrada e é muito usado em projetos IoT. Em vez de exigir que o usuário descubra o IP do dispositivo, podemos registrar um nome como <code>meu-dispositivo.local</code> e, opcionalmente, anunciar serviços como <code>_http._tcp</code>, <code>_mqtt._tcp</code> ou outro serviço local. Assim, um computador, celular ou outro nó da rede pode encontrar o dispositivo de maneira mais natural.</p>



<p class="wp-block-paragraph">Portanto, o mDNS não é apenas uma “comodidade”. Ele melhora a implantação, facilita manutenção, reduz erros humanos e torna o produto mais amigável. Em protótipos, ele acelera testes. Em produtos, ele reduz suporte técnico. Em laboratórios, ele permite trabalhar com vários dispositivos sem decorar IPs. Em sistemas distribuídos, ele pode ajudar os nós a se descobrirem localmente sem depender da internet.</p><p>The post <a href="https://mcu.tec.br/protoclos/mdns-no-esp32-tornando-dispositivos-iot-faceis-de-encontrar-na-rede-local/">mDNS no ESP32 — tornando dispositivos IoT fáceis de encontrar na rede local</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://mcu.tec.br/protoclos/mdns-no-esp32-tornando-dispositivos-iot-faceis-de-encontrar-na-rede-local/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1435</post-id>	</item>
		<item>
		<title>Conversor Analógico Delta-Sigma (ΔΣ ADC)</title>
		<link>https://mcu.tec.br/algoritimos/dsp/conversor-analogico-delta-sigma-%ce%b4%cf%83-adc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=conversor-analogico-delta-sigma-%25ce%25b4%25cf%2583-adc</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Mon, 11 May 2026 16:07:50 +0000</pubDate>
				<category><![CDATA[ADC/DAC]]></category>
		<category><![CDATA[DSP]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1430</guid>

					<description><![CDATA[<p>Aprenda detalhadamente como funciona o conversor analógico Delta-Sigma (ΣΔ ADC), entendendo conceitos como oversampling, noise shaping, quantização, moduladores Sigma-Delta, filtros CIC, decimação, SNR, ENOB e DSD. Veja comparações entre ADC Flash, SAR e Pipeline, além de aplicações práticas em microcontroladores, FPGAs, áudio digital, instrumentação, sensores industriais, controle de potência e sistemas embarcados modernos. Um guia técnico e didático sobre a arquitetura Sigma-Delta aplicado ao universo MCU &#038; FPGA.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/dsp/conversor-analogico-delta-sigma-%ce%b4%cf%83-adc/">Conversor Analógico Delta-Sigma (ΔΣ ADC)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-oj5nd wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-oj5nd "><div class="eb-toc-container eb-toc-oj5nd  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;:2,&quot;content&quot;:&quot;O Problema da Quantiza\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;O Problema da Quantiza\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Superamostragem (Oversampling)&quot;,&quot;text&quot;:&quot;Superamostragem (Oversampling)&quot;,&quot;link&quot;:&quot;superamostragem-oversampling&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrutura Interna do Conversor Delta-Sigma&quot;,&quot;text&quot;:&quot;Estrutura Interna do Conversor Delta-Sigma&quot;,&quot;link&quot;:&quot;estrutura-interna-do-conversor-delta-sigma&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Vis\u00e3o Conceitual do Modulador&quot;,&quot;text&quot;:&quot;Vis\u00e3o Conceitual do Modulador&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;O Integrador&quot;,&quot;text&quot;:&quot;O Integrador&quot;,&quot;link&quot;:&quot;o-integrador&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Quantizador de 1 Bit&quot;,&quot;text&quot;:&quot;Quantizador de 1 Bit&quot;,&quot;link&quot;:&quot;quantizador-de-1-bit&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;DAC de Realimenta\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;DAC de Realimenta\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Fluxo de Bits (Bitstream)&quot;,&quot;text&quot;:&quot;Fluxo de Bits (Bitstream)&quot;,&quot;link&quot;:&quot;fluxo-de-bits-bitstream&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Noise Shaping&quot;,&quot;text&quot;:&quot;Noise Shaping&quot;,&quot;link&quot;:&quot;noise-shaping&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Filtro Digital de Decima\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Filtro Digital de Decima\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;1. Filtrar ru\u00eddo de alta frequ\u00eancia&quot;,&quot;text&quot;:&quot;1. Filtrar ru\u00eddo de alta frequ\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2. Reduzir a taxa de amostragem&quot;,&quot;text&quot;:&quot;2. Reduzir a taxa de amostragem&quot;,&quot;link&quot;:&quot;2-reduzir-a-taxa-de-amostragem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Rela\u00e7\u00e3o entre Oversampling e Resolu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o entre Oversampling e Resolu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Ordens do Modulador&quot;,&quot;text&quot;:&quot;Ordens do Modulador&quot;,&quot;link&quot;:&quot;ordens-do-modulador&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Compara\u00e7\u00e3o entre Delta-Sigma, SAR, Flash e Pipeline ADC&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o entre Delta-Sigma, SAR, Flash e Pipeline ADC&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADC Flash&quot;,&quot;text&quot;:&quot;ADC Flash&quot;,&quot;link&quot;:&quot;adc-flash&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Estrutura&quot;,&quot;text&quot;:&quot;Estrutura&quot;,&quot;link&quot;:&quot;estrutura&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADC SAR (Successive Approximation Register)&quot;,&quot;text&quot;:&quot;ADC SAR (Successive Approximation Register)&quot;,&quot;link&quot;:&quot;adc-sar-successive-approximation-register&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Funcionamento&quot;,&quot;text&quot;:&quot;Funcionamento&quot;,&quot;link&quot;:&quot;funcionamento&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Tempo de Convers\u00e3o&quot;,&quot;text&quot;:&quot;Tempo de Convers\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Caracter\u00edsticas&quot;,&quot;text&quot;:&quot;Caracter\u00edsticas&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADC Pipeline&quot;,&quot;text&quot;:&quot;ADC Pipeline&quot;,&quot;link&quot;:&quot;adc-pipeline&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Conceito&quot;,&quot;text&quot;:&quot;Conceito&quot;,&quot;link&quot;:&quot;conceito&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Caracter\u00edsticas&quot;,&quot;text&quot;:&quot;Caracter\u00edsticas&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Por que o Delta-Sigma possui Alta Lat\u00eancia?&quot;,&quot;text&quot;:&quot;Por que o Delta-Sigma possui Alta Lat\u00eancia?&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Aplica\u00e7\u00f5es Ideais para Delta-Sigma&quot;,&quot;text&quot;:&quot;Aplica\u00e7\u00f5es Ideais para Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;\u00c1udio Digital&quot;,&quot;text&quot;:&quot;\u00c1udio Digital&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Instrumenta\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Instrumenta\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sensores de Precis\u00e3o&quot;,&quot;text&quot;:&quot;Sensores de Precis\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Microcontroladores Modernos&quot;,&quot;text&quot;:&quot;Microcontroladores Modernos&quot;,&quot;link&quot;:&quot;microcontroladores-modernos&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Uso em FPGAs&quot;,&quot;text&quot;:&quot;Uso em FPGAs&quot;,&quot;link&quot;:&quot;uso-em-fpgas&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Moduladores Delta-Sigma de Ordens Superiores&quot;,&quot;text&quot;:&quot;Moduladores Delta-Sigma de Ordens Superiores&quot;,&quot;link&quot;:&quot;moduladores-delta-sigma-de-ordens-superiores&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Noise Shaping em Diferentes Ordens&quot;,&quot;text&quot;:&quot;Noise Shaping em Diferentes Ordens&quot;,&quot;link&quot;:&quot;noise-shaping-em-diferentes-ordens&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Primeira Ordem&quot;,&quot;text&quot;:&quot;Primeira Ordem&quot;,&quot;link&quot;:&quot;primeira-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Segunda Ordem&quot;,&quot;text&quot;:&quot;Segunda Ordem&quot;,&quot;link&quot;:&quot;segunda-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Terceira Ordem&quot;,&quot;text&quot;:&quot;Terceira Ordem&quot;,&quot;link&quot;:&quot;terceira-ordem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o entre Ordem e SNR&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o entre Ordem e SNR&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Primeira ordem&quot;,&quot;text&quot;:&quot;Primeira ordem&quot;,&quot;link&quot;:&quot;primeira-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Segunda ordem&quot;,&quot;text&quot;:&quot;Segunda ordem&quot;,&quot;link&quot;:&quot;segunda-ordem&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Terceira ordem&quot;,&quot;text&quot;:&quot;Terceira ordem&quot;,&quot;link&quot;:&quot;terceira-ordem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Problema da Estabilidade&quot;,&quot;text&quot;:&quot;Problema da Estabilidade&quot;,&quot;link&quot;:&quot;problema-da-estabilidade&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Arquitetura MASH (Multi-Stage Noise Shaping)&quot;,&quot;text&quot;:&quot;Arquitetura MASH (Multi-Stage Noise Shaping)&quot;,&quot;link&quot;:&quot;arquitetura-mash-multi-stage-noise-shaping&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Quantizadores Multi-Bit&quot;,&quot;text&quot;:&quot;Quantizadores Multi-Bit&quot;,&quot;link&quot;:&quot;quantizadores-multi-bit&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtros de Decima\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Filtros de Decima\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-46&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtros CIC&quot;,&quot;text&quot;:&quot;Filtros CIC&quot;,&quot;link&quot;:&quot;filtros-cic&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ENOB (Effective Number Of Bits)&quot;,&quot;text&quot;:&quot;ENOB (Effective Number Of Bits)&quot;,&quot;link&quot;:&quot;enob-effective-number-of-bits&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;THD e SINAD&quot;,&quot;text&quot;:&quot;THD e SINAD&quot;,&quot;link&quot;:&quot;thd-e-sinad&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;THD&quot;,&quot;text&quot;:&quot;THD&quot;,&quot;link&quot;:&quot;thd&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;SINAD&quot;,&quot;text&quot;:&quot;SINAD&quot;,&quot;link&quot;:&quot;sinad&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Problema do Clock Jitter&quot;,&quot;text&quot;:&quot;Problema do Clock Jitter&quot;,&quot;link&quot;:&quot;problema-do-clock-jitter&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;\u00c1udio Hi-Fi e Delta-Sigma&quot;,&quot;text&quot;:&quot;\u00c1udio Hi-Fi e Delta-Sigma&quot;,&quot;link&quot;:&quot;eb-table-content-53&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Limita\u00e7\u00f5es Fundamentais&quot;,&quot;text&quot;:&quot;Limita\u00e7\u00f5es Fundamentais&quot;,&quot;link&quot;:&quot;eb-table-content-54&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;N\u00e3o \u00e9 ideal para sinais ultrarr\u00e1pidos&quot;,&quot;text&quot;:&quot;N\u00e3o \u00e9 ideal para sinais ultrarr\u00e1pidos&quot;,&quot;link&quot;:&quot;eb-table-content-55&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Consumo Digital&quot;,&quot;text&quot;:&quot;Consumo Digital&quot;,&quot;link&quot;:&quot;consumo-digital&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Instabilidade&quot;,&quot;text&quot;:&quot;Instabilidade&quot;,&quot;link&quot;:&quot;instabilidade&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Clock extremamente cr\u00edtico&quot;,&quot;text&quot;:&quot;Clock extremamente cr\u00edtico&quot;,&quot;link&quot;:&quot;eb-table-content-58&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados&quot;,&quot;text&quot;:&quot;Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados&quot;,&quot;link&quot;:&quot;delta-sigma-em-microcontroladores-fpga-e-sistemas-embarcados&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;ADCs Delta-Sigma em Microcontroladores&quot;,&quot;text&quot;:&quot;ADCs Delta-Sigma em Microcontroladores&quot;,&quot;link&quot;:&quot;adcs-delta-sigma-em-microcontroladores&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Por que usar Delta-Sigma em Medi\u00e7\u00e3o de Corrente?&quot;,&quot;text&quot;:&quot;Por que usar Delta-Sigma em Medi\u00e7\u00e3o de Corrente?&quot;,&quot;link&quot;:&quot;eb-table-content-61&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Moduladores Externos Sigma-Delta&quot;,&quot;text&quot;:&quot;Moduladores Externos Sigma-Delta&quot;,&quot;link&quot;:&quot;moduladores-externos-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Isola\u00e7\u00e3o Galv\u00e2nica Simplificada&quot;,&quot;text&quot;:&quot;Isola\u00e7\u00e3o Galv\u00e2nica Simplificada&quot;,&quot;link&quot;:&quot;eb-table-content-63&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Exemplo Real: Controle de Inversores&quot;,&quot;text&quot;:&quot;Exemplo Real: Controle de Inversores&quot;,&quot;link&quot;:&quot;exemplo-real-controle-de-inversores&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtros SINC&quot;,&quot;text&quot;:&quot;Filtros SINC&quot;,&quot;link&quot;:&quot;filtros-sinc&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Delta-Sigma em FPGA&quot;,&quot;text&quot;:&quot;Delta-Sigma em FPGA&quot;,&quot;link&quot;:&quot;delta-sigma-em-fpga&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DAC Sigma-Delta em FPGA&quot;,&quot;text&quot;:&quot;DAC Sigma-Delta em FPGA&quot;,&quot;link&quot;:&quot;dac-sigma-delta-em-fpga&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Exemplo Conceitual em Verilog&quot;,&quot;text&quot;:&quot;Exemplo Conceitual em Verilog&quot;,&quot;link&quot;:&quot;exemplo-conceitual-em-verilog&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Delta-Sigma e PWM&quot;,&quot;text&quot;:&quot;Delta-Sigma e PWM&quot;,&quot;link&quot;:&quot;delta-sigma-e-pwm&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PWM (Pulse Width Modulation)&quot;,&quot;text&quot;:&quot;PWM (Pulse Width Modulation)&quot;,&quot;link&quot;:&quot;pwm-pulse-width-modulation&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PDM (Pulse Density Modulation)&quot;,&quot;text&quot;:&quot;PDM (Pulse Density Modulation)&quot;,&quot;link&quot;:&quot;pdm-pulse-density-modulation&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Aplica\u00e7\u00f5es em Fontes Chaveadas&quot;,&quot;text&quot;:&quot;Aplica\u00e7\u00f5es em Fontes Chaveadas&quot;,&quot;link&quot;:&quot;eb-table-content-72&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sensores MEMS e Sigma-Delta&quot;,&quot;text&quot;:&quot;Sensores MEMS e Sigma-Delta&quot;,&quot;link&quot;:&quot;sensores-mems-e-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Conversores de \u00c1udio MEMS&quot;,&quot;text&quot;:&quot;Conversores de \u00c1udio MEMS&quot;,&quot;link&quot;:&quot;eb-table-content-74&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;link&quot;:&quot;eb-table-content-75&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Fundamentos Matem\u00e1ticos do Noise Shaping&quot;,&quot;text&quot;:&quot;Fundamentos Matem\u00e1ticos do Noise Shaping&quot;,&quot;link&quot;:&quot;eb-table-content-76&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Modelo Linear do Modulador&quot;,&quot;text&quot;:&quot;Modelo Linear do Modulador&quot;,&quot;link&quot;:&quot;modelo-linear-do-modulador&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrutura Linearizada&quot;,&quot;text&quot;:&quot;Estrutura Linearizada&quot;,&quot;link&quot;:&quot;estrutura-linearizada&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Signal Transfer Function (STF)&quot;,&quot;text&quot;:&quot;Signal Transfer Function (STF)&quot;,&quot;link&quot;:&quot;signal-transfer-function-stf&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Noise Transfer Function (NTF)&quot;,&quot;text&quot;:&quot;Noise Transfer Function (NTF)&quot;,&quot;link&quot;:&quot;noise-transfer-function-ntf&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Interpreta\u00e7\u00e3o F\u00edsica&quot;,&quot;text&quot;:&quot;Interpreta\u00e7\u00e3o F\u00edsica&quot;,&quot;link&quot;:&quot;eb-table-content-81&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Segunda Ordem&quot;,&quot;text&quot;:&quot;Segunda Ordem&quot;,&quot;link&quot;:&quot;segunda-ordem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Ordem Superior&quot;,&quot;text&quot;:&quot;Ordem Superior&quot;,&quot;link&quot;:&quot;ordem-superior&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Ru\u00eddo de Quantiza\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Ru\u00eddo de Quantiza\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-84&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Oversampling e Ru\u00eddo&quot;,&quot;text&quot;:&quot;Oversampling e Ru\u00eddo&quot;,&quot;link&quot;:&quot;eb-table-content-85&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com OSR&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com OSR&quot;,&quot;link&quot;:&quot;eb-table-content-86&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;SNR em Delta-Sigma&quot;,&quot;text&quot;:&quot;SNR em Delta-Sigma&quot;,&quot;link&quot;:&quot;snr-em-delta-sigma&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Zero da NTF em DC&quot;,&quot;text&quot;:&quot;Zero da NTF em DC&quot;,&quot;link&quot;:&quot;zero-da-ntf-em-dc&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com Sistemas de Controle&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com Sistemas de Controle&quot;,&quot;link&quot;:&quot;eb-table-content-89&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Idle Tones&quot;,&quot;text&quot;:&quot;Idle Tones&quot;,&quot;link&quot;:&quot;idle-tones&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Dithering&quot;,&quot;text&quot;:&quot;Dithering&quot;,&quot;link&quot;:&quot;dithering&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estabilidade Matem\u00e1tica&quot;,&quot;text&quot;:&quot;Estabilidade Matem\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-92&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;link&quot;:&quot;eb-table-content-93&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DAC Delta-Sigma (\u03a3\u0394 DAC)&quot;,&quot;text&quot;:&quot;DAC Delta-Sigma (\u03a3\u0394 DAC)&quot;,&quot;link&quot;:&quot;eb-table-content-94&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Diferen\u00e7a entre DAC Tradicional e Sigma-Delta&quot;,&quot;text&quot;:&quot;Diferen\u00e7a entre DAC Tradicional e Sigma-Delta&quot;,&quot;link&quot;:&quot;eb-table-content-95&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrat\u00e9gia do DAC Sigma-Delta&quot;,&quot;text&quot;:&quot;Estrat\u00e9gia do DAC Sigma-Delta&quot;,&quot;link&quot;:&quot;eb-table-content-96&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Estrutura B\u00e1sica&quot;,&quot;text&quot;:&quot;Estrutura B\u00e1sica&quot;,&quot;link&quot;:&quot;eb-table-content-97&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PCM e Oversampling&quot;,&quot;text&quot;:&quot;PCM e Oversampling&quot;,&quot;link&quot;:&quot;pcm-e-oversampling&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;&quot;,&quot;text&quot;:&quot;&quot;,&quot;link&quot;:&quot;eb-table-content-99&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Modulador Sigma-Delta no DAC&quot;,&quot;text&quot;:&quot;Modulador Sigma-Delta no DAC&quot;,&quot;link&quot;:&quot;modulador-sigma-delta-no-dac&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sa\u00edda de 1 Bit&quot;,&quot;text&quot;:&quot;Sa\u00edda de 1 Bit&quot;,&quot;link&quot;:&quot;eb-table-content-101&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filtro Anal\u00f3gico de Sa\u00edda&quot;,&quot;text&quot;:&quot;Filtro Anal\u00f3gico de Sa\u00edda&quot;,&quot;link&quot;:&quot;eb-table-content-102&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Grande Vantagem do DAC Sigma-Delta&quot;,&quot;text&quot;:&quot;Grande Vantagem do DAC Sigma-Delta&quot;,&quot;link&quot;:&quot;grande-vantagem-do-dac-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Rela\u00e7\u00e3o com PWM&quot;,&quot;text&quot;:&quot;Rela\u00e7\u00e3o com PWM&quot;,&quot;link&quot;:&quot;eb-table-content-104&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PWM Tradicional&quot;,&quot;text&quot;:&quot;PWM Tradicional&quot;,&quot;link&quot;:&quot;pwm-tradicional&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sigma-Delta&quot;,&quot;text&quot;:&quot;Sigma-Delta&quot;,&quot;link&quot;:&quot;sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Classe D e Sigma-Delta&quot;,&quot;text&quot;:&quot;Classe D e Sigma-Delta&quot;,&quot;link&quot;:&quot;classe-d-e-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DSD (Direct Stream Digital)&quot;,&quot;text&quot;:&quot;DSD (Direct Stream Digital)&quot;,&quot;link&quot;:&quot;dsd-direct-stream-digital&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;O que \u00e9 DSD?&quot;,&quot;text&quot;:&quot;O que \u00e9 DSD?&quot;,&quot;link&quot;:&quot;eb-table-content-109&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Filosofia do DSD&quot;,&quot;text&quot;:&quot;Filosofia do DSD&quot;,&quot;link&quot;:&quot;filosofia-do-dsd&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;SACD&quot;,&quot;text&quot;:&quot;SACD&quot;,&quot;link&quot;:&quot;sacd&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Vantagens do DSD&quot;,&quot;text&quot;:&quot;Vantagens do DSD&quot;,&quot;link&quot;:&quot;vantagens-do-dsd&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Problemas do DSD&quot;,&quot;text&quot;:&quot;Problemas do DSD&quot;,&quot;link&quot;:&quot;problemas-do-dsd&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Muito ru\u00eddo ultrass\u00f4nico&quot;,&quot;text&quot;:&quot;Muito ru\u00eddo ultrass\u00f4nico&quot;,&quot;link&quot;:&quot;eb-table-content-114&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Edi\u00e7\u00e3o complexa&quot;,&quot;text&quot;:&quot;Edi\u00e7\u00e3o complexa&quot;,&quot;link&quot;:&quot;eb-table-content-115&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Estabilidade e filtragem&quot;,&quot;text&quot;:&quot;Estabilidade e filtragem&quot;,&quot;link&quot;:&quot;estabilidade-e-filtragem&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DACs Multi-Bit Sigma-Delta&quot;,&quot;text&quot;:&quot;DACs Multi-Bit Sigma-Delta&quot;,&quot;link&quot;:&quot;dacs-multi-bit-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;DEM (Dynamic Element Matching)&quot;,&quot;text&quot;:&quot;DEM (Dynamic Element Matching)&quot;,&quot;link&quot;:&quot;dem-dynamic-element-matching&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sigma-Delta em RF&quot;,&quot;text&quot;:&quot;Sigma-Delta em RF&quot;,&quot;link&quot;:&quot;sigma-delta-em-rf&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;PLL Fractional-N Sigma-Delta&quot;,&quot;text&quot;:&quot;PLL Fractional-N Sigma-Delta&quot;,&quot;link&quot;:&quot;pll-fractional-n-sigma-delta&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Sigma-Delta e CMOS Moderno&quot;,&quot;text&quot;:&quot;Sigma-Delta e CMOS Moderno&quot;,&quot;link&quot;:&quot;sigma-delta-e-cmos-moderno&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;O Problema da Quantiza\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;o-problema-da-quantiza\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Superamostragem (Oversampling)&quot;,&quot;value&quot;:&quot;superamostragem-oversampling&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura Interna do Conversor Delta-Sigma&quot;,&quot;value&quot;:&quot;estrutura-interna-do-conversor-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vis\u00e3o Conceitual do Modulador&quot;,&quot;value&quot;:&quot;vis\u00e3o-conceitual-do-modulador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O Integrador&quot;,&quot;value&quot;:&quot;o-integrador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quantizador de 1 Bit&quot;,&quot;value&quot;:&quot;quantizador-de-1-bit&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DAC de Realimenta\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;dac-de-realimenta\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Fluxo de Bits (Bitstream)&quot;,&quot;value&quot;:&quot;fluxo-de-bits-bitstream&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Noise Shaping&quot;,&quot;value&quot;:&quot;noise-shaping&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtro Digital de Decima\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;filtro-digital-de-decima\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1. Filtrar ru\u00eddo de alta frequ\u00eancia&quot;,&quot;value&quot;:&quot;1-filtrar-ru\u00eddo-de-alta-frequ\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2. Reduzir a taxa de amostragem&quot;,&quot;value&quot;:&quot;2-reduzir-a-taxa-de-amostragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o entre Oversampling e Resolu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-entre-oversampling-e-resolu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ordens do Modulador&quot;,&quot;value&quot;:&quot;ordens-do-modulador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o entre Delta-Sigma, SAR, Flash e Pipeline ADC&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-entre-delta-sigma-sar-flash-e-pipeline-adc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADC Flash&quot;,&quot;value&quot;:&quot;adc-flash&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura&quot;,&quot;value&quot;:&quot;estrutura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-com-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADC SAR (Successive Approximation Register)&quot;,&quot;value&quot;:&quot;adc-sar-successive-approximation-register&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Funcionamento&quot;,&quot;value&quot;:&quot;funcionamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tempo de Convers\u00e3o&quot;,&quot;value&quot;:&quot;tempo-de-convers\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Caracter\u00edsticas&quot;,&quot;value&quot;:&quot;caracter\u00edsticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-com-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADC Pipeline&quot;,&quot;value&quot;:&quot;adc-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conceito&quot;,&quot;value&quot;:&quot;conceito&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Caracter\u00edsticas&quot;,&quot;value&quot;:&quot;caracter\u00edsticas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o com Delta-Sigma&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-com-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que o Delta-Sigma possui Alta Lat\u00eancia?&quot;,&quot;value&quot;:&quot;por-que-o-delta-sigma-possui-alta-lat\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Aplica\u00e7\u00f5es Ideais para Delta-Sigma&quot;,&quot;value&quot;:&quot;aplica\u00e7\u00f5es-ideais-para-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;\u00c1udio Digital&quot;,&quot;value&quot;:&quot;\u00e1udio-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Instrumenta\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;instrumenta\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sensores de Precis\u00e3o&quot;,&quot;value&quot;:&quot;sensores-de-precis\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Microcontroladores Modernos&quot;,&quot;value&quot;:&quot;microcontroladores-modernos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Uso em FPGAs&quot;,&quot;value&quot;:&quot;uso-em-fpgas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Moduladores Delta-Sigma de Ordens Superiores&quot;,&quot;value&quot;:&quot;moduladores-delta-sigma-de-ordens-superiores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Noise Shaping em Diferentes Ordens&quot;,&quot;value&quot;:&quot;noise-shaping-em-diferentes-ordens&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Primeira Ordem&quot;,&quot;value&quot;:&quot;primeira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Segunda Ordem&quot;,&quot;value&quot;:&quot;segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Terceira Ordem&quot;,&quot;value&quot;:&quot;terceira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o entre Ordem e SNR&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-entre-ordem-e-snr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Primeira ordem&quot;,&quot;value&quot;:&quot;primeira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Segunda ordem&quot;,&quot;value&quot;:&quot;segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Terceira ordem&quot;,&quot;value&quot;:&quot;terceira-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Problema da Estabilidade&quot;,&quot;value&quot;:&quot;problema-da-estabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquitetura MASH (Multi-Stage Noise Shaping)&quot;,&quot;value&quot;:&quot;arquitetura-mash-multi-stage-noise-shaping&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quantizadores Multi-Bit&quot;,&quot;value&quot;:&quot;quantizadores-multi-bit&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtros de Decima\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;filtros-de-decima\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtros CIC&quot;,&quot;value&quot;:&quot;filtros-cic&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ENOB (Effective Number Of Bits)&quot;,&quot;value&quot;:&quot;enob-effective-number-of-bits&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;THD e SINAD&quot;,&quot;value&quot;:&quot;thd-e-sinad&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;THD&quot;,&quot;value&quot;:&quot;thd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SINAD&quot;,&quot;value&quot;:&quot;sinad&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Problema do Clock Jitter&quot;,&quot;value&quot;:&quot;problema-do-clock-jitter&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;\u00c1udio Hi-Fi e Delta-Sigma&quot;,&quot;value&quot;:&quot;\u00e1udio-hi-fi-e-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Limita\u00e7\u00f5es Fundamentais&quot;,&quot;value&quot;:&quot;limita\u00e7\u00f5es-fundamentais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;N\u00e3o \u00e9 ideal para sinais ultrarr\u00e1pidos&quot;,&quot;value&quot;:&quot;n\u00e3o-\u00e9-ideal-para-sinais-ultrarr\u00e1pidos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Consumo Digital&quot;,&quot;value&quot;:&quot;consumo-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Instabilidade&quot;,&quot;value&quot;:&quot;instabilidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Clock extremamente cr\u00edtico&quot;,&quot;value&quot;:&quot;clock-extremamente-cr\u00edtico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados&quot;,&quot;value&quot;:&quot;delta-sigma-em-microcontroladores-fpga-e-sistemas-embarcados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ADCs Delta-Sigma em Microcontroladores&quot;,&quot;value&quot;:&quot;adcs-delta-sigma-em-microcontroladores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Por que usar Delta-Sigma em Medi\u00e7\u00e3o de Corrente?&quot;,&quot;value&quot;:&quot;por-que-usar-delta-sigma-em-medi\u00e7\u00e3o-de-corrente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Moduladores Externos Sigma-Delta&quot;,&quot;value&quot;:&quot;moduladores-externos-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Isola\u00e7\u00e3o Galv\u00e2nica Simplificada&quot;,&quot;value&quot;:&quot;isola\u00e7\u00e3o-galv\u00e2nica-simplificada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo Real: Controle de Inversores&quot;,&quot;value&quot;:&quot;exemplo-real-controle-de-inversores&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtros SINC&quot;,&quot;value&quot;:&quot;filtros-sinc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Delta-Sigma em FPGA&quot;,&quot;value&quot;:&quot;delta-sigma-em-fpga&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DAC Sigma-Delta em FPGA&quot;,&quot;value&quot;:&quot;dac-sigma-delta-em-fpga&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo Conceitual em Verilog&quot;,&quot;value&quot;:&quot;exemplo-conceitual-em-verilog&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Delta-Sigma e PWM&quot;,&quot;value&quot;:&quot;delta-sigma-e-pwm&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PWM (Pulse Width Modulation)&quot;,&quot;value&quot;:&quot;pwm-pulse-width-modulation&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PDM (Pulse Density Modulation)&quot;,&quot;value&quot;:&quot;pdm-pulse-density-modulation&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Aplica\u00e7\u00f5es em Fontes Chaveadas&quot;,&quot;value&quot;:&quot;aplica\u00e7\u00f5es-em-fontes-chaveadas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sensores MEMS e Sigma-Delta&quot;,&quot;value&quot;:&quot;sensores-mems-e-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conversores de \u00c1udio MEMS&quot;,&quot;value&quot;:&quot;conversores-de-\u00e1udio-mems&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-dsp-moderno&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Fundamentos Matem\u00e1ticos do Noise Shaping&quot;,&quot;value&quot;:&quot;fundamentos-matem\u00e1ticos-do-noise-shaping&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo Linear do Modulador&quot;,&quot;value&quot;:&quot;modelo-linear-do-modulador&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura Linearizada&quot;,&quot;value&quot;:&quot;estrutura-linearizada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Signal Transfer Function (STF)&quot;,&quot;value&quot;:&quot;signal-transfer-function-stf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Noise Transfer Function (NTF)&quot;,&quot;value&quot;:&quot;noise-transfer-function-ntf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Interpreta\u00e7\u00e3o F\u00edsica&quot;,&quot;value&quot;:&quot;interpreta\u00e7\u00e3o-f\u00edsica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Segunda Ordem&quot;,&quot;value&quot;:&quot;segunda-ordem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ordem Superior&quot;,&quot;value&quot;:&quot;ordem-superior&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Ru\u00eddo de Quantiza\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;ru\u00eddo-de-quantiza\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Oversampling e Ru\u00eddo&quot;,&quot;value&quot;:&quot;oversampling-e-ru\u00eddo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com OSR&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-osr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SNR em Delta-Sigma&quot;,&quot;value&quot;:&quot;snr-em-delta-sigma&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Zero da NTF em DC&quot;,&quot;value&quot;:&quot;zero-da-ntf-em-dc&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com Sistemas de Controle&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-sistemas-de-controle&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Idle Tones&quot;,&quot;value&quot;:&quot;idle-tones&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Dithering&quot;,&quot;value&quot;:&quot;dithering&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estabilidade Matem\u00e1tica&quot;,&quot;value&quot;:&quot;estabilidade-matem\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com DSP Moderno&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-dsp-moderno&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DAC Delta-Sigma (\u03a3\u0394 DAC)&quot;,&quot;value&quot;:&quot;dac-delta-sigma-\u03c3\u03b4-dac&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Diferen\u00e7a entre DAC Tradicional e Sigma-Delta&quot;,&quot;value&quot;:&quot;diferen\u00e7a-entre-dac-tradicional-e-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrat\u00e9gia do DAC Sigma-Delta&quot;,&quot;value&quot;:&quot;estrat\u00e9gia-do-dac-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura B\u00e1sica&quot;,&quot;value&quot;:&quot;estrutura-b\u00e1sica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PCM e Oversampling&quot;,&quot;value&quot;:&quot;pcm-e-oversampling&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;&quot;,&quot;value&quot;:&quot;&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modulador Sigma-Delta no DAC&quot;,&quot;value&quot;:&quot;modulador-sigma-delta-no-dac&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sa\u00edda de 1 Bit&quot;,&quot;value&quot;:&quot;sa\u00edda-de-1-bit&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filtro Anal\u00f3gico de Sa\u00edda&quot;,&quot;value&quot;:&quot;filtro-anal\u00f3gico-de-sa\u00edda&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Grande Vantagem do DAC Sigma-Delta&quot;,&quot;value&quot;:&quot;grande-vantagem-do-dac-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Rela\u00e7\u00e3o com PWM&quot;,&quot;value&quot;:&quot;rela\u00e7\u00e3o-com-pwm&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PWM Tradicional&quot;,&quot;value&quot;:&quot;pwm-tradicional&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sigma-Delta&quot;,&quot;value&quot;:&quot;sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Classe D e Sigma-Delta&quot;,&quot;value&quot;:&quot;classe-d-e-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DSD (Direct Stream Digital)&quot;,&quot;value&quot;:&quot;dsd-direct-stream-digital&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que \u00e9 DSD?&quot;,&quot;value&quot;:&quot;o-que-\u00e9-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Filosofia do DSD&quot;,&quot;value&quot;:&quot;filosofia-do-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;SACD&quot;,&quot;value&quot;:&quot;sacd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vantagens do DSD&quot;,&quot;value&quot;:&quot;vantagens-do-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Problemas do DSD&quot;,&quot;value&quot;:&quot;problemas-do-dsd&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Muito ru\u00eddo ultrass\u00f4nico&quot;,&quot;value&quot;:&quot;muito-ru\u00eddo-ultrass\u00f4nico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Edi\u00e7\u00e3o complexa&quot;,&quot;value&quot;:&quot;edi\u00e7\u00e3o-complexa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estabilidade e filtragem&quot;,&quot;value&quot;:&quot;estabilidade-e-filtragem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DACs Multi-Bit Sigma-Delta&quot;,&quot;value&quot;:&quot;dacs-multi-bit-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;DEM (Dynamic Element Matching)&quot;,&quot;value&quot;:&quot;dem-dynamic-element-matching&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sigma-Delta em RF&quot;,&quot;value&quot;:&quot;sigma-delta-em-rf&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;PLL Fractional-N Sigma-Delta&quot;,&quot;value&quot;:&quot;pll-fractional-n-sigma-delta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Sigma-Delta e CMOS Moderno&quot;,&quot;value&quot;:&quot;sigma-delta-e-cmos-moderno&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">O Problema da Quantização</a><li><a href="#superamostragem-oversampling">Superamostragem (Oversampling)</a><li><a href="#estrutura-interna-do-conversor-delta-sigma">Estrutura Interna do Conversor Delta-Sigma</a><ul class="eb-toc__list"><li><a href="#eb-table-content-3">Visão Conceitual do Modulador</a><li><a href="#o-integrador">O Integrador</a><li><a href="#quantizador-de-1-bit">Quantizador de 1 Bit</a><li><a href="#eb-table-content-6">DAC de Realimentação</a><li><a href="#fluxo-de-bits-bitstream">Fluxo de Bits (Bitstream)</a><li><a href="#noise-shaping">Noise Shaping</a><li><a href="#eb-table-content-9">Filtro Digital de Decimação</a><ul class="eb-toc__list"><li><a href="#eb-table-content-10">1. Filtrar ruído de alta frequência</a><li><a href="#2-reduzir-a-taxa-de-amostragem">2. Reduzir a taxa de amostragem</a></li></ul><li><a href="#eb-table-content-12">Relação entre Oversampling e Resolução</a><li><a href="#ordens-do-modulador">Ordens do Modulador</a></li></ul><li><a href="#eb-table-content-14">Comparação entre Delta-Sigma, SAR, Flash e Pipeline ADC</a><li><a href="#adc-flash">ADC Flash</a><ul class="eb-toc__list"><li><a href="#estrutura">Estrutura</a><li><a href="#eb-table-content-17">Comparação com Delta-Sigma</a></li></ul><li><a href="#adc-sar-successive-approximation-register">ADC SAR (Successive Approximation Register)</a><ul class="eb-toc__list"><li><a href="#funcionamento">Funcionamento</a><li><a href="#eb-table-content-20">Tempo de Conversão</a><li><a href="#eb-table-content-21">Características</a><li><a href="#eb-table-content-22">Comparação com Delta-Sigma</a></li></ul><li><a href="#adc-pipeline">ADC Pipeline</a><ul class="eb-toc__list"><li><a href="#conceito">Conceito</a><li><a href="#eb-table-content-25">Características</a><li><a href="#eb-table-content-26">Comparação com Delta-Sigma</a></li></ul><li><a href="#eb-table-content-27">Por que o Delta-Sigma possui Alta Latência?</a><li><a href="#eb-table-content-28">Aplicações Ideais para Delta-Sigma</a><ul class="eb-toc__list"><li><a href="#eb-table-content-29">Áudio Digital</a></li></ul><li><a href="#eb-table-content-30">Instrumentação</a><li><a href="#eb-table-content-31">Sensores de Precisão</a><li><a href="#microcontroladores-modernos">Microcontroladores Modernos</a><li><a href="#uso-em-fpgas">Uso em FPGAs</a><li><a href="#moduladores-delta-sigma-de-ordens-superiores">Moduladores Delta-Sigma de Ordens Superiores</a><li><a href="#noise-shaping-em-diferentes-ordens">Noise Shaping em Diferentes Ordens</a><ul class="eb-toc__list"><li><a href="#primeira-ordem">Primeira Ordem</a><li><a href="#segunda-ordem">Segunda Ordem</a><li><a href="#terceira-ordem">Terceira Ordem</a></li></ul><li><a href="#eb-table-content-39">Relação entre Ordem e SNR</a><ul class="eb-toc__list"><li><a href="#primeira-ordem">Primeira ordem</a><li><a href="#segunda-ordem">Segunda ordem</a><li><a href="#terceira-ordem">Terceira ordem</a></li></ul><li><a href="#problema-da-estabilidade">Problema da Estabilidade</a><li><a href="#arquitetura-mash-multi-stage-noise-shaping">Arquitetura MASH (Multi-Stage Noise Shaping)</a><li><a href="#quantizadores-multi-bit">Quantizadores Multi-Bit</a><li><a href="#eb-table-content-46">Filtros de Decimação</a><li><a href="#filtros-cic">Filtros CIC</a><li><a href="#enob-effective-number-of-bits">ENOB (Effective Number Of Bits)</a><li><a href="#thd-e-sinad">THD e SINAD</a><ul class="eb-toc__list"><li><a href="#thd">THD</a><li><a href="#sinad">SINAD</a></li></ul><li><a href="#problema-do-clock-jitter">Problema do Clock Jitter</a><li><a href="#eb-table-content-53">Áudio Hi-Fi e Delta-Sigma</a><li><a href="#eb-table-content-54">Limitações Fundamentais</a><ul class="eb-toc__list"><li><a href="#eb-table-content-55">Não é ideal para sinais ultrarrápidos</a><li><a href="#consumo-digital">Consumo Digital</a><li><a href="#instabilidade">Instabilidade</a><li><a href="#eb-table-content-58">Clock extremamente crítico</a></li></ul><li><a href="#delta-sigma-em-microcontroladores-fpga-e-sistemas-embarcados">Delta-Sigma em Microcontroladores, FPGA e Sistemas Embarcados</a><li><a href="#adcs-delta-sigma-em-microcontroladores">ADCs Delta-Sigma em Microcontroladores</a><li><a href="#eb-table-content-61">Por que usar Delta-Sigma em Medição de Corrente?</a><li><a href="#moduladores-externos-sigma-delta">Moduladores Externos Sigma-Delta</a><li><a href="#eb-table-content-63">Isolação Galvânica Simplificada</a><li><a href="#exemplo-real-controle-de-inversores">Exemplo Real: Controle de Inversores</a><li><a href="#filtros-sinc">Filtros SINC</a><li><a href="#delta-sigma-em-fpga">Delta-Sigma em FPGA</a><li><a href="#dac-sigma-delta-em-fpga">DAC Sigma-Delta em FPGA</a><li><a href="#exemplo-conceitual-em-verilog">Exemplo Conceitual em Verilog</a><li><a href="#delta-sigma-e-pwm">Delta-Sigma e PWM</a><li><a href="#pwm-pulse-width-modulation">PWM (Pulse Width Modulation)</a><li><a href="#pdm-pulse-density-modulation">PDM (Pulse Density Modulation)</a><li><a href="#eb-table-content-72">Aplicações em Fontes Chaveadas</a><li><a href="#sensores-mems-e-sigma-delta">Sensores MEMS e Sigma-Delta</a><li><a href="#eb-table-content-74">Conversores de Áudio MEMS</a><li><a href="#eb-table-content-75">Relação com DSP Moderno</a><li><a href="#eb-table-content-76">Fundamentos Matemáticos do Noise Shaping</a><li><a href="#modelo-linear-do-modulador">Modelo Linear do Modulador</a><li><a href="#estrutura-linearizada">Estrutura Linearizada</a><li><a href="#signal-transfer-function-stf">Signal Transfer Function (STF)</a><li><a href="#noise-transfer-function-ntf">Noise Transfer Function (NTF)</a><li><a href="#eb-table-content-81">Interpretação Física</a><li><a href="#segunda-ordem">Segunda Ordem</a><li><a href="#ordem-superior">Ordem Superior</a><li><a href="#eb-table-content-84">Ruído de Quantização</a><li><a href="#eb-table-content-85">Oversampling e Ruído</a><li><a href="#eb-table-content-86">Relação com OSR</a><li><a href="#snr-em-delta-sigma">SNR em Delta-Sigma</a><li><a href="#zero-da-ntf-em-dc">Zero da NTF em DC</a><li><a href="#eb-table-content-89">Relação com Sistemas de Controle</a><li><a href="#idle-tones">Idle Tones</a><li><a href="#dithering">Dithering</a><li><a href="#eb-table-content-92">Estabilidade Matemática</a><li><a href="#eb-table-content-93">Relação com DSP Moderno</a><li><a href="#eb-table-content-94">DAC Delta-Sigma (ΣΔ DAC)</a><li><a href="#eb-table-content-95">Diferença entre DAC Tradicional e Sigma-Delta</a><li><a href="#eb-table-content-96">Estratégia do DAC Sigma-Delta</a><li><a href="#eb-table-content-97">Estrutura Básica</a><li><a href="#pcm-e-oversampling">PCM e Oversampling</a><li><a href="#eb-table-content-99"></a><li><a href="#modulador-sigma-delta-no-dac">Modulador Sigma-Delta no DAC</a><li><a href="#eb-table-content-101">Saída de 1 Bit</a><li><a href="#eb-table-content-102">Filtro Analógico de Saída</a><li><a href="#grande-vantagem-do-dac-sigma-delta">Grande Vantagem do DAC Sigma-Delta</a><li><a href="#eb-table-content-104">Relação com PWM</a><li><a href="#pwm-tradicional">PWM Tradicional</a><li><a href="#sigma-delta">Sigma-Delta</a><li><a href="#classe-d-e-sigma-delta">Classe D e Sigma-Delta</a><li><a href="#dsd-direct-stream-digital">DSD (Direct Stream Digital)</a><li><a href="#eb-table-content-109">O que é DSD?</a><li><a href="#filosofia-do-dsd">Filosofia do DSD</a><li><a href="#sacd">SACD</a><li><a href="#vantagens-do-dsd">Vantagens do DSD</a><li><a href="#problemas-do-dsd">Problemas do DSD</a><ul class="eb-toc__list"><li><a href="#eb-table-content-114">Muito ruído ultrassônico</a><li><a href="#eb-table-content-115">Edição complexa</a><li><a href="#estabilidade-e-filtragem">Estabilidade e filtragem</a></li></ul><li><a href="#dacs-multi-bit-sigma-delta">DACs Multi-Bit Sigma-Delta</a><li><a href="#dem-dynamic-element-matching">DEM (Dynamic Element Matching)</a><li><a href="#sigma-delta-em-rf">Sigma-Delta em RF</a><li><a href="#pll-fractional-n-sigma-delta">PLL Fractional-N Sigma-Delta</a><li><a href="#sigma-delta-e-cmos-moderno">Sigma-Delta e CMOS Moderno</a></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Os conversores analógico-digitais do tipo Delta-Sigma, também chamados de Sigma-Delta (ΣΔ), representam uma das arquiteturas de conversão mais importantes da eletrônica moderna, especialmente em aplicações que exigem alta resolução, excelente imunidade a ruído e grande precisão. Eles são amplamente utilizados em instrumentos de medição, sistemas de áudio digital, sensores industriais, balanças eletrônicas, sistemas biomédicos, aquisição de sinais lentos e equipamentos científicos.</p>



<p class="wp-block-paragraph">Diferentemente de arquiteturas clássicas como Flash ADC, SAR (Successive Approximation Register) ou Pipeline ADC, o conversor Delta-Sigma não tenta converter instantaneamente o valor analógico em um número digital final. Em vez disso, ele utiliza uma estratégia baseada em superamostragem (oversampling), modelagem espectral de ruído (noise shaping) e filtragem digital para reconstruir o sinal com elevada precisão.</p>



<p class="wp-block-paragraph">O surgimento dessa arquitetura está diretamente ligado às limitações físicas dos conversores tradicionais. Em sistemas de alta resolução, aumentar a precisão usando apenas comparadores extremamente precisos torna-se caro, complexo e energeticamente ineficiente. O Delta-Sigma contorna esse problema utilizando princípios matemáticos e temporais para deslocar o ruído de quantização para frequências mais altas, permitindo removê-lo posteriormente através de filtros digitais.</p>



<p class="wp-block-paragraph">Uma das razões do enorme sucesso dos ADCs Delta-Sigma é que eles combinam:</p>



<ul class="wp-block-list">
<li>Alta resolução (16, 24 e até 32 bits efetivos em aplicações específicas)</li>



<li>Excelente linearidade</li>



<li>Forte rejeição a ruídos</li>



<li>Baixo custo relativo em CMOS moderno</li>



<li>Grande integração digital</li>
</ul>



<p class="wp-block-paragraph">Isso explica por que praticamente todo codec de áudio moderno, muitos sensores MEMS e diversos instrumentos industriais utilizam essa arquitetura.</p>



<p class="wp-block-paragraph">Além disso, a evolução dos microcontroladores e FPGAs tornou o estudo dos conversores Delta-Sigma ainda mais relevante. Muitos microcontroladores modernos já possuem ADCs Sigma-Delta integrados, enquanto FPGAs frequentemente implementam moduladores Delta-Sigma em aplicações de aquisição de sinais, áudio e controle de potência.</p>



<p class="wp-block-paragraph">Antes de entender profundamente o funcionamento interno do conversor Delta-Sigma, é importante compreender um conceito fundamental: o processo de amostragem e o problema do ruído de quantização.</p>



<h2 class="wp-block-heading">O Problema da Quantização</h2>



<p class="wp-block-paragraph">Todo conversor analógico-digital precisa transformar uma grandeza contínua em um conjunto discreto de valores binários. Esse processo inevitavelmente introduz um erro chamado erro de quantização.</p>



<p class="wp-block-paragraph">Imagine um sinal analógico variando continuamente entre 0V e 3,3V. Um ADC de baixa resolução possui poucos níveis possíveis para representar esse sinal. Assim, o valor real do sinal precisa ser arredondado para o nível digital mais próximo.</p>



<p class="wp-block-paragraph">Por exemplo, um ADC de 3 bits possui apenas:</p>



<p class="wp-block-paragraph">2^3 = 8</p>



<p class="wp-block-paragraph">níveis possíveis de quantização.</p>



<p class="wp-block-paragraph">Se o intervalo for de 0V até 3,3V, então cada degrau representará aproximadamente:</p>



<p class="wp-block-paragraph">\[\frac{3.3V}{8} \approx 0.4125V\]



<p class="wp-block-paragraph">Isso significa que pequenas variações menores que aproximadamente 412 mV simplesmente desaparecem na conversão.</p>



<p class="wp-block-paragraph">O erro introduzido pela diferença entre o valor analógico real e o valor digital representado é chamado ruído de quantização.</p>



<p class="wp-block-paragraph">Em arquiteturas tradicionais, esse ruído está distribuído aproximadamente de forma uniforme ao longo do espectro de frequência. O grande diferencial do Delta-Sigma é justamente modificar essa distribuição espectral do ruído, empurrando-o para regiões de frequência onde ele pode ser removido digitalmente.</p>



<p class="wp-block-paragraph">Em outras palavras:</p>



<ul class="wp-block-list">
<li>O ruído não desaparece</li>



<li>O conversor reorganiza onde ele aparece no espectro</li>
</ul>



<p class="wp-block-paragraph">Esse conceito é chamado de Noise Shaping (Modelagem de Ruído), sendo um dos pilares matemáticos do conversor Delta-Sigma.</p>



<h2 class="wp-block-heading">Superamostragem (Oversampling)</h2>



<p class="wp-block-paragraph">Outro conceito essencial no Delta-Sigma é a superamostragem.</p>



<p class="wp-block-paragraph">Um ADC convencional normalmente amostra próximo da frequência mínima necessária definida pelo Teorema de Nyquist:</p>



<p class="wp-block-paragraph">f_s \geq 2f_{max}</p>



<p class="wp-block-paragraph">Já o Delta-Sigma trabalha com frequências de amostragem extremamente maiores que a banda útil do sinal.</p>



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



<ul class="wp-block-list">
<li>Áudio de 20 kHz</li>



<li>ADC operando em vários MHz</li>
</ul>



<p class="wp-block-paragraph">Essa superamostragem traz duas vantagens fundamentais:</p>



<ol class="wp-block-list">
<li>O ruído de quantização é espalhado em uma faixa espectral muito maior</li>



<li>O filtro digital posterior consegue remover boa parte desse ruído</li>
</ol>



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



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



<li>Noise shaping</li>



<li>Filtragem digital</li>
</ul>



<p class="wp-block-paragraph">o conversor Delta-Sigma consegue atingir resoluções extremamente elevadas usando hardware analógico relativamente simples.</p>



<p class="wp-block-paragraph">Na próxima seção veremos a estrutura interna do modulador Delta-Sigma, incluindo:</p>



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



<li>Comparador</li>



<li>Realimentação (feedback)</li>



<li>DAC interno</li>



<li>Fluxo de bits do modulador</li>



<li>Funcionamento temporal do laço Sigma-Delta</li>



<li>Papel do filtro digital de decimação</li>
</ul>



<p class="wp-block-paragraph">Além disso, começaremos a comparar formalmente essa arquitetura com ADCs SAR, Flash e Pipeline.</p><p>The post <a href="https://mcu.tec.br/algoritimos/dsp/conversor-analogico-delta-sigma-%ce%b4%cf%83-adc/">Conversor Analógico Delta-Sigma (ΔΣ ADC)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1430</post-id>	</item>
		<item>
		<title>Baud Rate: o que é, origem, tabela completa e como escolher a taxa ideal na comunicação serial</title>
		<link>https://mcu.tec.br/protoclos/uart-serial/baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Mon, 20 Apr 2026 18:21:56 +0000</pubDate>
				<category><![CDATA[UART (Serial)]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1426</guid>

					<description><![CDATA[<p>Entenda de forma didática o que é baud rate, sua origem histórica ligada à telegrafia de Émile Baudot e como essa taxa influencia diretamente a comunicação serial em sistemas embarcados modernos. Neste artigo, você verá uma explicação clara sobre a diferença entre baud rate e bits por segundo, além de compreender o impacto do tempo de bit na transmissão de dados. Apresentamos também uma tabela completa com os principais baud rates, suas velocidades reais e duração dos bits, além de destacar as taxas mais utilizadas como 9600, 115200 e 921600 baud, explicando em quais contextos são aplicadas, desde sistemas industriais até IoT e debug de firmware.</p>
<p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial/">Baud Rate: o que é, origem, tabela completa e como escolher a taxa ideal na comunicação serial</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Quando trabalhamos com sistemas embarcados, comunicação serial ou redes industriais, um dos primeiros termos que aparece é <strong>baud rate</strong> (ou taxa de transmissão). Embora muitas vezes tratado de forma superficial como “velocidade da comunicação”, o conceito possui uma origem histórica interessante e nuances técnicas importantes que impactam diretamente a confiabilidade e o desempenho dos sistemas.</p>



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



<h3 class="wp-block-heading">O que é Baud Rate</h3>



<p class="wp-block-paragraph">O termo <em>baud</em> representa a <strong>quantidade de símbolos transmitidos por segundo</strong> em um canal de comunicação. Em sistemas simples, como UART (Universal Asynchronous Receiver/Transmitter), cada símbolo geralmente corresponde a um bit, e por isso, na prática, baud rate costuma ser tratado como equivalente a <strong>bits por segundo (bps)</strong>.</p>



<p class="wp-block-paragraph">No entanto, tecnicamente, eles não são sempre iguais. Em sistemas mais complexos (como modulações QAM), um único símbolo pode carregar múltiplos bits. Mas no contexto mais comum em microcontroladores — como STM32, ESP32 ou RP2040 — temos:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>1 baud ≈ 1 bit por segundo</strong></p>
</blockquote>



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



<h3 class="wp-block-heading">Origem do termo</h3>



<p class="wp-block-paragraph">O nome <em>baud</em> vem de <strong>Émile Baudot</strong>, engenheiro francês que desenvolveu um dos primeiros sistemas de telegrafia digital no século XIX. Seu sistema utilizava códigos binários para transmitir caracteres, sendo um dos precursores diretos da comunicação digital moderna.</p>



<p class="wp-block-paragraph">Na época, a preocupação principal era sincronizar transmissor e receptor em meios físicos limitados, como linhas telegráficas. Essa limitação influenciou diretamente as primeiras taxas padronizadas que ainda vemos hoje.</p>



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



<h3 class="wp-block-heading">Como o Baud Rate é utilizado na prática</h3>



<p class="wp-block-paragraph">Em sistemas modernos, especialmente embarcados, o baud rate é fundamental em protocolos como:</p>



<ul class="wp-block-list">
<li>UART (comunicação serial clássica)</li>



<li>RS-232, RS-485 (ambientes industriais)</li>



<li>Comunicação com módulos (GPS, GSM, Bluetooth)</li>



<li>Bootloaders e debug via terminal serial</li>
</ul>



<p class="wp-block-paragraph">Cada taxa define <strong>quanto tempo dura cada bit</strong>, o que impacta diretamente:</p>



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



<li>tolerância a ruído</li>



<li>distância da comunicação</li>



<li>consumo de energia</li>
</ul>



<p class="wp-block-paragraph">Por exemplo, em <strong>9600 baud</strong>, cada bit dura aproximadamente <strong>104 µs</strong>, enquanto em <strong>115200 baud</strong>, dura apenas <strong>8.68 µs</strong>, exigindo maior precisão de clock.</p>



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



<h3 class="wp-block-heading">Entendendo a diferença entre velocidade teórica e real</h3>



<p class="wp-block-paragraph">Na tabela fornecida, aparecem dois valores importantes:</p>



<ul class="wp-block-list">
<li><strong>Speed (bytes/s)</strong> → taxa teórica considerando 8 bits por byte</li>



<li><strong>Actual speed (bytes/s)</strong> → taxa real considerando overhead da UART</li>
</ul>



<p class="wp-block-paragraph">Esse overhead vem do formato típico de transmissão:</p>



<pre class="wp-block-code"><code>1 bit de start + 8 bits de dados + 1 bit de stop = 10 bits por byte
</code></pre>



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



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">A eficiência real é de aproximadamente <strong>80%</strong> (8/10)</p>
</blockquote>



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



<h3 class="wp-block-heading">Tabela de Baud Rates</h3>



<p class="wp-block-paragraph">Abaixo está a tabela organizada com os dados fornecidos:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Bauds</th><th>Bits/s</th><th>Duração do bit</th><th>Velocidade (bytes/s)</th><th>Velocidade real (bytes/s)</th><th>Duração real por byte</th></tr></thead><tbody><tr><td>50</td><td>50</td><td>20.000 ms</td><td>6.25</td><td>5</td><td>200.000 ms</td></tr><tr><td>75</td><td>75</td><td>13.333 ms</td><td>9.375</td><td>7.5</td><td>133.333 ms</td></tr><tr><td>110</td><td>110</td><td>9.091 ms</td><td>13.75</td><td>11</td><td>90.909 ms</td></tr><tr><td>134</td><td>134</td><td>7.463 ms</td><td>16.75</td><td>13.4</td><td>74.627 ms</td></tr><tr><td>150</td><td>150</td><td>6.667 ms</td><td>18.75</td><td>15</td><td>66.667 ms</td></tr><tr><td>200</td><td>200</td><td>5.000 ms</td><td>25</td><td>20</td><td>50.000 ms</td></tr><tr><td>300</td><td>300</td><td>3.333 ms</td><td>37.5</td><td>30</td><td>33.333 ms</td></tr><tr><td>600</td><td>600</td><td>1.667 ms</td><td>75</td><td>60</td><td>16.667 ms</td></tr><tr><td>1200</td><td>1200</td><td>833.333 µs</td><td>150</td><td>120</td><td>8.333 ms</td></tr><tr><td>1800</td><td>1800</td><td>555.556 µs</td><td>225</td><td>180</td><td>5.556 ms</td></tr><tr><td>2400</td><td>2400</td><td>416.667 µs</td><td>300</td><td>240</td><td>4.167 ms</td></tr><tr><td>4800</td><td>4800</td><td>208.333 µs</td><td>600</td><td>480</td><td>2.083 ms</td></tr><tr><td>9600</td><td>9600</td><td>104.167 µs</td><td>1200</td><td>960</td><td>1.042 ms</td></tr><tr><td>19200</td><td>19200</td><td>52.083 µs</td><td>2400</td><td>1920</td><td>520.833 µs</td></tr><tr><td>28800</td><td>28800</td><td>34.722 µs</td><td>3600</td><td>2880</td><td>347.222 µs</td></tr><tr><td>38400</td><td>38400</td><td>26.042 µs</td><td>4800</td><td>3840</td><td>260.417 µs</td></tr><tr><td>57600</td><td>57600</td><td>17.361 µs</td><td>7200</td><td>5760</td><td>173.611 µs</td></tr><tr><td>76800</td><td>76800</td><td>13.021 µs</td><td>9600</td><td>7680</td><td>130.208 µs</td></tr><tr><td>115200</td><td>115200</td><td>8.681 µs</td><td>14400</td><td>11520</td><td>86.806 µs</td></tr><tr><td>230400</td><td>230400</td><td>4.340 µs</td><td>28800</td><td>23040</td><td>43.403 µs</td></tr><tr><td>460800</td><td>460800</td><td>2.170 µs</td><td>57600</td><td>46080</td><td>21.701 µs</td></tr><tr><td>576000</td><td>576000</td><td>1.736 µs</td><td>72000</td><td>57600</td><td>17.361 µs</td></tr><tr><td>921600</td><td>921600</td><td>1.085 µs</td><td>115200</td><td>92160</td><td>10.851 µs</td></tr></tbody></table></figure>



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



<h3 class="wp-block-heading">Velocidades mais usadas e seus contextos</h3>



<p class="wp-block-paragraph">Na prática, algumas taxas se tornaram padrão de mercado:</p>



<p class="wp-block-paragraph"><strong>9600 baud</strong><br>Muito utilizado em sistemas legados, sensores simples e comunicação robusta em ambientes com ruído. Ideal quando confiabilidade é mais importante que velocidade.</p>



<p class="wp-block-paragraph"><strong>19200 e 38400 baud</strong><br>Utilizados em sistemas industriais e automação, oferecendo bom equilíbrio entre velocidade e estabilidade.</p>



<p class="wp-block-paragraph"><strong>57600 baud</strong><br>Comum em comunicação com módulos embarcados intermediários (GPS, modems antigos).</p>



<p class="wp-block-paragraph"><strong>115200 baud</strong><br>O padrão mais usado atualmente para debug serial, comunicação com PCs e bootloaders. É rápido o suficiente para logs e transferência moderada de dados.</p>



<p class="wp-block-paragraph"><strong>230400 a 921600 baud</strong><br>Usados em aplicações mais exigentes, como:</p>



<ul class="wp-block-list">
<li>streaming de dados de sensores</li>



<li>comunicação com displays</li>



<li>transferência de arquivos</li>



<li>aplicações IoT de maior throughput</li>
</ul>



<p class="wp-block-paragraph">Porém, nessas velocidades, entram desafios importantes:</p>



<ul class="wp-block-list">
<li>precisão do clock (erro percentual)</li>



<li>interferência eletromagnética</li>



<li>qualidade do layout de PCB</li>
</ul>



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



<h3 class="wp-block-heading">Considerações de Engenharia</h3>



<p class="wp-block-paragraph">Ao escolher o baud rate em um projeto embarcado, você deve considerar:</p>



<ul class="wp-block-list">
<li><strong>Clock do sistema</strong>: erros de divisão podem gerar falhas de sincronização</li>



<li><strong>Comprimento do cabo</strong>: quanto maior, menor deve ser a taxa</li>



<li><strong>Ambiente</strong>: ruído industrial exige taxas menores</li>



<li><strong>Buffer e DMA</strong>: taxas altas exigem melhor gestão de dados</li>
</ul>



<p class="wp-block-paragraph">Uma decisão errada aqui pode gerar desde perda de dados até travamentos intermitentes difíceis de depurar.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/protoclos/uart-serial/baud-rate-o-que-e-origem-tabela-completa-e-como-escolher-a-taxa-ideal-na-comunicacao-serial/">Baud Rate: o que é, origem, tabela completa e como escolher a taxa ideal na comunicação serial</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1426</post-id>	</item>
		<item>
		<title>PDCL (Plan, Do, Check Logs) com GenAI: A Nova Metodologia de Engenharia de Software Orientada por Logs e Inteligência Artificial Generativa</title>
		<link>https://mcu.tec.br/metodologia/pdcl-plan-do-check-logs-com-genai-a-nova-metodologia-de-engenharia-de-software-orientada-por-logs-e-inteligencia-artificial-generativa/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pdcl-plan-do-check-logs-com-genai-a-nova-metodologia-de-engenharia-de-software-orientada-por-logs-e-inteligencia-artificial-generativa</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 12 Apr 2026 23:43:45 +0000</pubDate>
				<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[automação de código]]></category>
		<category><![CDATA[ciclo PDCL]]></category>
		<category><![CDATA[desenvolvimento orientado a logs]]></category>
		<category><![CDATA[DevOps com IA]]></category>
		<category><![CDATA[engenharia de software com IA]]></category>
		<category><![CDATA[GenAI]]></category>
		<category><![CDATA[geração automática de código]]></category>
		<category><![CDATA[IA para programação]]></category>
		<category><![CDATA[inteligência artificial generativa]]></category>
		<category><![CDATA[metodologia PDCL]]></category>
		<category><![CDATA[observabilidade em software]]></category>
		<category><![CDATA[PDCL]]></category>
		<category><![CDATA[Plan Do Check Logs]]></category>
		<category><![CDATA[REQUIREMENTS.md]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1421</guid>

					<description><![CDATA[<p>Descubra a metodologia PDCL (Plan, Do, Check Logs), uma abordagem inovadora de engenharia de software integrada com GenAI (Inteligência Artificial Generativa). Aprenda como utilizar REQUIREMENTS.md, logs estruturados e modelos como OpenAI Codex e Claude Opus para criar um ciclo contínuo de desenvolvimento, testes e validação automatizada. Entenda como essa metodologia evolui conceitos do PDCA, RUP e DevOps, aplicando princípios de observabilidade e controle em malha fechada para aumentar produtividade, qualidade e automação no desenvolvimento de software moderno.</p>
<p>The post <a href="https://mcu.tec.br/metodologia/pdcl-plan-do-check-logs-com-genai-a-nova-metodologia-de-engenharia-de-software-orientada-por-logs-e-inteligencia-artificial-generativa/">PDCL (Plan, Do, Check Logs) com GenAI: A Nova Metodologia de Engenharia de Software Orientada por Logs e Inteligência Artificial Generativa</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-4na5r wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-4na5r "><div class="eb-toc-container eb-toc-4na5r  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;Introdu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Apresenta\u00e7\u00e3o da Metodologia PDCL&quot;,&quot;text&quot;:&quot;Apresenta\u00e7\u00e3o da Metodologia PDCL&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Exemplo Pr\u00e1tico da Metodologia PDCL&quot;,&quot;text&quot;:&quot;Exemplo Pr\u00e1tico da Metodologia PDCL&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Conclus\u00e3o e An\u00e1lise Cr\u00edtica da Metodologia PDCL&quot;,&quot;text&quot;:&quot;Conclus\u00e3o e An\u00e1lise Cr\u00edtica da Metodologia PDCL&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:1,&quot;content&quot;:&quot;Refer\u00eancias&quot;,&quot;text&quot;:&quot;Refer\u00eancias&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;introdu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Apresenta\u00e7\u00e3o da Metodologia PDCL&quot;,&quot;value&quot;:&quot;apresenta\u00e7\u00e3o-da-metodologia-pdcl&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo Pr\u00e1tico da Metodologia PDCL&quot;,&quot;value&quot;:&quot;exemplo-pr\u00e1tico-da-metodologia-pdcl&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o e An\u00e1lise Cr\u00edtica da Metodologia PDCL&quot;,&quot;value&quot;:&quot;conclus\u00e3o-e-an\u00e1lise-cr\u00edtica-da-metodologia-pdcl&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Refer\u00eancias&quot;,&quot;value&quot;:&quot;refer\u00eancias&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Introdução</a><li><a href="#eb-table-content-1">Apresentação da Metodologia PDCL</a><li><a href="#eb-table-content-2">Exemplo Prático da Metodologia PDCL</a><li><a href="#eb-table-content-3">Conclusão e Análise Crítica da Metodologia PDCL</a><li><a href="#eb-table-content-4">Referências</a></ul></div></div></div></div></div>


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



<h1 class="wp-block-heading"><strong>Introdução</strong></h1>



<p class="wp-block-paragraph">A engenharia de software tem evoluído continuamente na tentativa de equilibrar três forças fundamentais: previsibilidade, produtividade e qualidade. Desde abordagens clássicas como o modelo em cascata, passando por frameworks estruturados como o RUP (Rational Unified Process), até metodologias ágeis modernas, o objetivo permanece o mesmo: transformar requisitos em sistemas funcionais de forma confiável e eficiente.</p>



<p class="wp-block-paragraph">No entanto, uma mudança significativa vem ocorrendo com o avanço da Inteligência Artificial Generativa aplicada ao desenvolvimento de software. Modelos como OpenAI Codex, Claude Opus e sistemas especializados como SWE-agent não apenas auxiliam na escrita de código, mas passam a atuar como agentes ativos no ciclo de desenvolvimento, participando da interpretação de requisitos, análise de comportamento e validação de sistemas.</p>



<p class="wp-block-paragraph">Esse novo cenário exige uma revisão das metodologias tradicionais. Enquanto modelos como o PDCA (Plan, Do, Check, Act) e processos como o RUP estruturam o desenvolvimento em ciclos iterativos, eles não foram concebidos considerando a presença de agentes inteligentes capazes de gerar, testar, analisar e corrigir código de forma autônoma e contínua. Surge então a necessidade de uma abordagem que integre explicitamente a IA como parte do processo, não apenas como ferramenta auxiliar.</p>



<p class="wp-block-paragraph">É nesse contexto que se propõe a metodologia <strong>PDCL (Plan, Do, Check Logs)</strong>. Inspirada nos princípios clássicos de melhoria contínua, mas adaptada à realidade da engenharia assistida por IA, essa abordagem introduz um elemento central: o uso estruturado de logs como meio de comunicação, validação e realimentação entre o sistema em execução e a inteligência artificial responsável por sua evolução.</p>



<p class="wp-block-paragraph">Diferentemente das metodologias tradicionais, onde a validação depende majoritariamente de testes explícitos e inspeção humana, o PDCL estabelece um ciclo automatizado no qual a aplicação é continuamente executada, seus logs analisados, e o código refinado com base na comparação entre comportamento observado e requisitos definidos. Esse processo cria um loop fechado de desenvolvimento, onde a IA atua como agente de execução, análise e correção.</p>



<p class="wp-block-paragraph">Essa proposta dialoga diretamente com conceitos consolidados da engenharia de software. Assim como os padrões de projeto são utilizados para otimizar atributos de qualidade — como desempenho, confiabilidade e manutenibilidade —, o PDCL pode ser entendido como um padrão de processo, voltado à otimização da interação entre humanos e sistemas inteligentes no ciclo de desenvolvimento.</p>



<p class="wp-block-paragraph">Nos próximos tópicos, será apresentada a estrutura formal da metodologia PDCL, detalhando seus componentes, fluxo de execução e mecanismos de integração com IA generativa, seguida de um exemplo prático e uma análise crítica de suas implicações.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/metodologia/pdcl-plan-do-check-logs-com-genai-a-nova-metodologia-de-engenharia-de-software-orientada-por-logs-e-inteligencia-artificial-generativa/">PDCL (Plan, Do, Check Logs) com GenAI: A Nova Metodologia de Engenharia de Software Orientada por Logs e Inteligência Artificial Generativa</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1421</post-id>	</item>
		<item>
		<title>Zephyr e Integração Avançada: Interrupções + Soft Timers + Workqueues</title>
		<link>https://mcu.tec.br/geral/zephyr-e-integracao-avancada-interrupcoes-soft-timers-workqueues/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zephyr-e-integracao-avancada-interrupcoes-soft-timers-workqueues</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 14:49:36 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[RTOS]]></category>
		<category><![CDATA[arquitetura de firmware]]></category>
		<category><![CDATA[boas práticas Zephyr]]></category>
		<category><![CDATA[event driven firmware]]></category>
		<category><![CDATA[firmware escalável]]></category>
		<category><![CDATA[firmware industrial]]></category>
		<category><![CDATA[firmware robusto]]></category>
		<category><![CDATA[interrupções Zephyr]]></category>
		<category><![CDATA[IoT de produção]]></category>
		<category><![CDATA[pipelines de eventos]]></category>
		<category><![CDATA[rtos para iot]]></category>
		<category><![CDATA[sistemas embarcados industriais]]></category>
		<category><![CDATA[soft timers zephyr]]></category>
		<category><![CDATA[workqueues Zephyr]]></category>
		<category><![CDATA[Zephyr k_timer]]></category>
		<category><![CDATA[Zephyr k_work]]></category>
		<category><![CDATA[Zephyr RTOS]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1247</guid>

					<description><![CDATA[<p>O Zephyr RTOS oferece mecanismos poderosos para o desenvolvimento de firmware industrial e IoT de produção. Neste artigo, apresentamos de forma didática e aprofundada como integrar interrupções, soft timers (k_timer) e workqueues (k_work) para projetar pipelines de eventos robustos, escaláveis e previsíveis. O conteúdo explora boas práticas arquiteturais, anti-padrões comuns, controle de prioridade, backpressure e estratégias de recuperação de falhas, com exemplos reais em C. Ideal para engenheiros de sistemas embarcados que desejam evoluir de firmwares reativos simples para arquiteturas industriais confiáveis baseadas em eventos.</p>
<p>The post <a href="https://mcu.tec.br/geral/zephyr-e-integracao-avancada-interrupcoes-soft-timers-workqueues/">Zephyr e Integração Avançada: Interrupções + Soft Timers + Workqueues</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-f87wq wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-f87wq "><div class="eb-toc-container eb-toc-f87wq  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;:2,&quot;content&quot;:&quot;2 \u2014 Interrup\u00e7\u00f5es no Zephyr&quot;,&quot;text&quot;:&quot;2 \u2014 Interrup\u00e7\u00f5es no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O papel correto das ISRs em pipelines de eventos robustos&quot;,&quot;text&quot;:&quot;O papel correto das ISRs em pipelines de eventos robustos&quot;,&quot;link&quot;:&quot;o-papel-correto-das-isrs-em-pipelines-de-eventos-robustos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.1 O erro cl\u00e1ssico: ISR como \u201cmini-thread\u201d&quot;,&quot;text&quot;:&quot;2.1 O erro cl\u00e1ssico: ISR como \u201cmini-thread\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.2 O que uma ISR pode fazer no Zephyr&quot;,&quot;text&quot;:&quot;2.2 O que uma ISR pode fazer no Zephyr&quot;,&quot;link&quot;:&quot;22-o-que-uma-isr-pode-fazer-no-zephyr&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.3 Exemplo 1 \u2014 Interrup\u00e7\u00e3o de GPIO bem projetada&quot;,&quot;text&quot;:&quot;2.3 Exemplo 1 \u2014 Interrup\u00e7\u00e3o de GPIO bem projetada&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Configura\u00e7\u00e3o do callback de interrup\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Configura\u00e7\u00e3o do callback de interrup\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Inicializa\u00e7\u00e3o do GPIO&quot;,&quot;text&quot;:&quot;Inicializa\u00e7\u00e3o do GPIO&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.4 A thread consumidora do evento&quot;,&quot;text&quot;:&quot;2.4 A thread consumidora do evento&quot;,&quot;link&quot;:&quot;24-a-thread-consumidora-do-evento&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2.5 Regra de ouro para ISRs em firmware industrial&quot;,&quot;text&quot;:&quot;2.5 Regra de ouro para ISRs em firmware industrial&quot;,&quot;link&quot;:&quot;25-regra-de-ouro-para-isrs-em-firmware-industrial&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;3 \u2014 Soft Timers no Zephyr&quot;,&quot;text&quot;:&quot;3 \u2014 Soft Timers no Zephyr&quot;,&quot;link&quot;:&quot;3-soft-timers-no-zephyr&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Tempo como evento, n\u00e3o como delay&quot;,&quot;text&quot;:&quot;Tempo como evento, n\u00e3o como delay&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.1 O erro comum: k_sleep() como l\u00f3gica&quot;,&quot;text&quot;:&quot;3.1 O erro comum: k_sleep() como l\u00f3gica&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.2 Conceito de Soft Timer no Zephyr&quot;,&quot;text&quot;:&quot;3.2 Conceito de Soft Timer no Zephyr&quot;,&quot;link&quot;:&quot;32-conceito-de-soft-timer-no-zephyr&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.3 Exemplo 2 \u2014 Timer como fonte de eventos&quot;,&quot;text&quot;:&quot;3.3 Exemplo 2 \u2014 Timer como fonte de eventos&quot;,&quot;link&quot;:&quot;33-exemplo-2-timer-como-fonte-de-eventos&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Defini\u00e7\u00e3o do timer&quot;,&quot;text&quot;:&quot;Defini\u00e7\u00e3o do timer&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Inicializa\u00e7\u00e3o do timer&quot;,&quot;text&quot;:&quot;Inicializa\u00e7\u00e3o do timer&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.4 Consumindo eventos temporais&quot;,&quot;text&quot;:&quot;3.4 Consumindo eventos temporais&quot;,&quot;link&quot;:&quot;34-consumindo-eventos-temporais&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.5 Soft Timer como etapa do pipeline&quot;,&quot;text&quot;:&quot;3.5 Soft Timer como etapa do pipeline&quot;,&quot;link&quot;:&quot;35-soft-timer-como-etapa-do-pipeline&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3.6 Regra de ouro dos Soft Timers&quot;,&quot;text&quot;:&quot;3.6 Regra de ouro dos Soft Timers&quot;,&quot;link&quot;:&quot;36-regra-de-ouro-dos-soft-timers&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;4 \u2014 Workqueues no Zephyr&quot;,&quot;text&quot;:&quot;4 \u2014 Workqueues no Zephyr&quot;,&quot;link&quot;:&quot;4-workqueues-no-zephyr&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Processamento desacoplado, escal\u00e1vel e seguro&quot;,&quot;text&quot;:&quot;Processamento desacoplado, escal\u00e1vel e seguro&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.1 O que \u00e9 uma Workqueue, de fato&quot;,&quot;text&quot;:&quot;4.1 O que \u00e9 uma Workqueue, de fato&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.2 O erro comum: jogar tudo na system workqueue&quot;,&quot;text&quot;:&quot;4.2 O erro comum: jogar tudo na system workqueue&quot;,&quot;link&quot;:&quot;42-o-erro-comum-jogar-tudo-na-system-workqueue&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.3 Criando uma Workqueue dedicada&quot;,&quot;text&quot;:&quot;4.3 Criando uma Workqueue dedicada&quot;,&quot;link&quot;:&quot;43-criando-uma-workqueue-dedicada&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Defini\u00e7\u00e3o da workqueue&quot;,&quot;text&quot;:&quot;Defini\u00e7\u00e3o da workqueue&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Inicializa\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Inicializa\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.4 Criando um work item&quot;,&quot;text&quot;:&quot;4.4 Criando um work item&quot;,&quot;link&quot;:&quot;44-criando-um-work-item&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.5 Integrando eventos \u2192 workqueues&quot;,&quot;text&quot;:&quot;4.5 Integrando eventos \u2192 workqueues&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;ISR \u2192 Timer \u2192 Workqueue&quot;,&quot;text&quot;:&quot;ISR \u2192 Timer \u2192 Workqueue&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.6 Workqueues como est\u00e1gios de pipeline&quot;,&quot;text&quot;:&quot;4.6 Workqueues como est\u00e1gios de pipeline&quot;,&quot;link&quot;:&quot;eb-table-content-29&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4.7 Regra de ouro das Workqueues&quot;,&quot;text&quot;:&quot;4.7 Regra de ouro das Workqueues&quot;,&quot;link&quot;:&quot;47-regra-de-ouro-das-workqueues&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2014 Desenhando pipelines completos de eventos no Zephyr&quot;,&quot;text&quot;:&quot;5 \u2014 Desenhando pipelines completos de eventos no Zephyr&quot;,&quot;link&quot;:&quot;5-desenhando-pipelines-completos-de-eventos-no-zephyr&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Do evento f\u00edsico ao processamento industrial robusto&quot;,&quot;text&quot;:&quot;Do evento f\u00edsico ao processamento industrial robusto&quot;,&quot;link&quot;:&quot;eb-table-content-32&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.1 O modelo mental correto: firmware como fluxo de eventos&quot;,&quot;text&quot;:&quot;5.1 O modelo mental correto: firmware como fluxo de eventos&quot;,&quot;link&quot;:&quot;51-o-modelo-mental-correto-firmware-como-fluxo-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.2 Pipeline can\u00f4nico no Zephyr&quot;,&quot;text&quot;:&quot;5.2 Pipeline can\u00f4nico no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.3 Implementa\u00e7\u00e3o passo a passo&quot;,&quot;text&quot;:&quot;5.3 Implementa\u00e7\u00e3o passo a passo&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;1\ufe0f\u20e3 Interrup\u00e7\u00e3o: entrada do pipeline&quot;,&quot;text&quot;:&quot;1\ufe0f\u20e3 Interrup\u00e7\u00e3o: entrada do pipeline&quot;,&quot;link&quot;:&quot;eb-table-content-36&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;2\ufe0f\u20e3 Soft Timer: debounce e normaliza\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;2\ufe0f\u20e3 Soft Timer: debounce e normaliza\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-37&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;3\ufe0f\u20e3 Workqueue: processamento real&quot;,&quot;text&quot;:&quot;3\ufe0f\u20e3 Workqueue: processamento real&quot;,&quot;link&quot;:&quot;eb-table-content-38&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;4\ufe0f\u20e3 Workqueue de comunica\u00e7\u00e3o (opcional, mas comum)&quot;,&quot;text&quot;:&quot;4\ufe0f\u20e3 Workqueue de comunica\u00e7\u00e3o (opcional, mas comum)&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.4 Por que esse pipeline \u00e9 robusto&quot;,&quot;text&quot;:&quot;5.4 Por que esse pipeline \u00e9 robusto&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.5 Anti-padr\u00f5es comuns (e perigosos)&quot;,&quot;text&quot;:&quot;5.5 Anti-padr\u00f5es comuns (e perigosos)&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.6 Regra de ouro do pipeline no Zephyr&quot;,&quot;text&quot;:&quot;5.6 Regra de ouro do pipeline no Zephyr&quot;,&quot;link&quot;:&quot;56-regra-de-ouro-do-pipeline-no-zephyr&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;6 \u2014 Boas pr\u00e1ticas industriais&quot;,&quot;text&quot;:&quot;6 \u2014 Boas pr\u00e1ticas industriais&quot;,&quot;link&quot;:&quot;eb-table-content-43&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Prioridades, backpressure e recupera\u00e7\u00e3o de falhas&quot;,&quot;text&quot;:&quot;Prioridades, backpressure e recupera\u00e7\u00e3o de falhas&quot;,&quot;link&quot;:&quot;eb-table-content-44&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.1 Prioriza\u00e7\u00e3o correta: tempo \u00e9 um recurso finito&quot;,&quot;text&quot;:&quot;6.1 Prioriza\u00e7\u00e3o correta: tempo \u00e9 um recurso finito&quot;,&quot;link&quot;:&quot;eb-table-content-45&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Regra pr\u00e1tica de prioridade&quot;,&quot;text&quot;:&quot;Regra pr\u00e1tica de prioridade&quot;,&quot;link&quot;:&quot;eb-table-content-46&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.2 Exemplo \u2014 Workqueues com prioridades distintas&quot;,&quot;text&quot;:&quot;6.2 Exemplo \u2014 Workqueues com prioridades distintas&quot;,&quot;link&quot;:&quot;62-exemplo-workqueues-com-prioridades-distintas&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.3 Backpressure: quando eventos chegam r\u00e1pido demais&quot;,&quot;text&quot;:&quot;6.3 Backpressure: quando eventos chegam r\u00e1pido demais&quot;,&quot;link&quot;:&quot;eb-table-content-48&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Estrat\u00e9gias de backpressure no Zephyr&quot;,&quot;text&quot;:&quot;Estrat\u00e9gias de backpressure no Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-49&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.4 Exemplo \u2014 Limitando eventos com k_msgq&quot;,&quot;text&quot;:&quot;6.4 Exemplo \u2014 Limitando eventos com k_msgq&quot;,&quot;link&quot;:&quot;64-exemplo-limitando-eventos-com-k_msgq&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.5 Eventos colaps\u00e1veis (coalescing)&quot;,&quot;text&quot;:&quot;6.5 Eventos colaps\u00e1veis (coalescing)&quot;,&quot;link&quot;:&quot;eb-table-content-51&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.6 Recupera\u00e7\u00e3o de falhas no pipeline&quot;,&quot;text&quot;:&quot;6.6 Recupera\u00e7\u00e3o de falhas no pipeline&quot;,&quot;link&quot;:&quot;eb-table-content-52&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Exemplo \u2014 Timeout l\u00f3gico com timer&quot;,&quot;text&quot;:&quot;Exemplo \u2014 Timeout l\u00f3gico com timer&quot;,&quot;link&quot;:&quot;eb-table-content-53&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;6.7 Checklist industrial de robustez&quot;,&quot;text&quot;:&quot;6.7 Checklist industrial de robustez&quot;,&quot;link&quot;:&quot;67-checklist-industrial-de-robustez&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;7 \u2014 Estudo de caso completo&quot;,&quot;text&quot;:&quot;7 \u2014 Estudo de caso completo&quot;,&quot;link&quot;:&quot;7-estudo-de-caso-completo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Pipeline Zephyr em um dispositivo IoT industrial (sensor \u2192 processamento \u2192 nuvem)&quot;,&quot;text&quot;:&quot;Pipeline Zephyr em um dispositivo IoT industrial (sensor \u2192 processamento \u2192 nuvem)&quot;,&quot;link&quot;:&quot;eb-table-content-56&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.1 Cen\u00e1rio do sistema&quot;,&quot;text&quot;:&quot;7.1 Cen\u00e1rio do sistema&quot;,&quot;link&quot;:&quot;eb-table-content-57&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.2 Arquitetura do pipeline&quot;,&quot;text&quot;:&quot;7.2 Arquitetura do pipeline&quot;,&quot;link&quot;:&quot;72-arquitetura-do-pipeline&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.3 Est\u00e1gio 1 \u2014 ISR (evento f\u00edsico)&quot;,&quot;text&quot;:&quot;7.3 Est\u00e1gio 1 \u2014 ISR (evento f\u00edsico)&quot;,&quot;link&quot;:&quot;eb-table-content-59&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.4 Est\u00e1gio 2 \u2014 Soft Timer (normaliza\u00e7\u00e3o temporal)&quot;,&quot;text&quot;:&quot;7.4 Est\u00e1gio 2 \u2014 Soft Timer (normaliza\u00e7\u00e3o temporal)&quot;,&quot;link&quot;:&quot;eb-table-content-60&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.5 Est\u00e1gio 3 \u2014 Workqueue de aquisi\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;7.5 Est\u00e1gio 3 \u2014 Workqueue de aquisi\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-61&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.6 Est\u00e1gio 4 \u2014 Workqueue de processamento&quot;,&quot;text&quot;:&quot;7.6 Est\u00e1gio 4 \u2014 Workqueue de processamento&quot;,&quot;link&quot;:&quot;eb-table-content-62&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.7 Est\u00e1gio 5 \u2014 Workqueue de comunica\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;7.7 Est\u00e1gio 5 \u2014 Workqueue de comunica\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-63&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.8 Controle de carga (backpressure)&quot;,&quot;text&quot;:&quot;7.8 Controle de carga (backpressure)&quot;,&quot;link&quot;:&quot;78-controle-de-carga-backpressure&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.9 Recupera\u00e7\u00e3o e robustez&quot;,&quot;text&quot;:&quot;7.9 Recupera\u00e7\u00e3o e robustez&quot;,&quot;link&quot;:&quot;eb-table-content-65&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;7.10 O que esse estudo de caso demonstra&quot;,&quot;text&quot;:&quot;7.10 O que esse estudo de caso demonstra&quot;,&quot;link&quot;:&quot;710-o-que-esse-estudo-de-caso-demonstra&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;8 \u2014 Conclus\u00e3o&quot;,&quot;text&quot;:&quot;8 \u2014 Conclus\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-67&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00f5es mentais e checklist para firmware industrial com Zephyr&quot;,&quot;text&quot;:&quot;Padr\u00f5es mentais e checklist para firmware industrial com Zephyr&quot;,&quot;link&quot;:&quot;eb-table-content-68&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.1 O modelo mental correto (o que levar deste artigo)&quot;,&quot;text&quot;:&quot;8.1 O modelo mental correto (o que levar deste artigo)&quot;,&quot;link&quot;:&quot;81-o-modelo-mental-correto-o-que-levar-deste-artigo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.2 Anti-padr\u00f5es finais a evitar&quot;,&quot;text&quot;:&quot;8.2 Anti-padr\u00f5es finais a evitar&quot;,&quot;link&quot;:&quot;eb-table-content-70&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.3 Checklist pr\u00e1tico de revis\u00e3o arquitetural&quot;,&quot;text&quot;:&quot;8.3 Checklist pr\u00e1tico de revis\u00e3o arquitetural&quot;,&quot;link&quot;:&quot;eb-table-content-71&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.4 Onde esse padr\u00e3o \u00e9 usado na pr\u00e1tica&quot;,&quot;text&quot;:&quot;8.4 Onde esse padr\u00e3o \u00e9 usado na pr\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-72&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.5 Encerramento&quot;,&quot;text&quot;:&quot;8.5 Encerramento&quot;,&quot;link&quot;:&quot;85-encerramento&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;2 \u2014 Interrup\u00e7\u00f5es no Zephyr&quot;,&quot;value&quot;:&quot;2-interrup\u00e7\u00f5es-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O papel correto das ISRs em pipelines de eventos robustos&quot;,&quot;value&quot;:&quot;o-papel-correto-das-isrs-em-pipelines-de-eventos-robustos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.1 O erro cl\u00e1ssico: ISR como \u201cmini-thread\u201d&quot;,&quot;value&quot;:&quot;21-o-erro-cl\u00e1ssico-isr-como-mini-thread&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.2 O que uma ISR pode fazer no Zephyr&quot;,&quot;value&quot;:&quot;22-o-que-uma-isr-pode-fazer-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.3 Exemplo 1 \u2014 Interrup\u00e7\u00e3o de GPIO bem projetada&quot;,&quot;value&quot;:&quot;23-exemplo-1-interrup\u00e7\u00e3o-de-gpio-bem-projetada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Configura\u00e7\u00e3o do callback de interrup\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;configura\u00e7\u00e3o-do-callback-de-interrup\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Inicializa\u00e7\u00e3o do GPIO&quot;,&quot;value&quot;:&quot;inicializa\u00e7\u00e3o-do-gpio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.4 A thread consumidora do evento&quot;,&quot;value&quot;:&quot;24-a-thread-consumidora-do-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2.5 Regra de ouro para ISRs em firmware industrial&quot;,&quot;value&quot;:&quot;25-regra-de-ouro-para-isrs-em-firmware-industrial&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2014 Soft Timers no Zephyr&quot;,&quot;value&quot;:&quot;3-soft-timers-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tempo como evento, n\u00e3o como delay&quot;,&quot;value&quot;:&quot;tempo-como-evento-n\u00e3o-como-delay&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.1 O erro comum: k_sleep() como l\u00f3gica&quot;,&quot;value&quot;:&quot;31-o-erro-comum-k_sleep-como-l\u00f3gica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.2 Conceito de Soft Timer no Zephyr&quot;,&quot;value&quot;:&quot;32-conceito-de-soft-timer-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.3 Exemplo 2 \u2014 Timer como fonte de eventos&quot;,&quot;value&quot;:&quot;33-exemplo-2-timer-como-fonte-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Defini\u00e7\u00e3o do timer&quot;,&quot;value&quot;:&quot;defini\u00e7\u00e3o-do-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Inicializa\u00e7\u00e3o do timer&quot;,&quot;value&quot;:&quot;inicializa\u00e7\u00e3o-do-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.4 Consumindo eventos temporais&quot;,&quot;value&quot;:&quot;34-consumindo-eventos-temporais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.5 Soft Timer como etapa do pipeline&quot;,&quot;value&quot;:&quot;35-soft-timer-como-etapa-do-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3.6 Regra de ouro dos Soft Timers&quot;,&quot;value&quot;:&quot;36-regra-de-ouro-dos-soft-timers&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4 \u2014 Workqueues no Zephyr&quot;,&quot;value&quot;:&quot;4-workqueues-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Processamento desacoplado, escal\u00e1vel e seguro&quot;,&quot;value&quot;:&quot;processamento-desacoplado-escal\u00e1vel-e-seguro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.1 O que \u00e9 uma Workqueue, de fato&quot;,&quot;value&quot;:&quot;41-o-que-\u00e9-uma-workqueue-de-fato&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.2 O erro comum: jogar tudo na system workqueue&quot;,&quot;value&quot;:&quot;42-o-erro-comum-jogar-tudo-na-system-workqueue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.3 Criando uma Workqueue dedicada&quot;,&quot;value&quot;:&quot;43-criando-uma-workqueue-dedicada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Defini\u00e7\u00e3o da workqueue&quot;,&quot;value&quot;:&quot;defini\u00e7\u00e3o-da-workqueue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Inicializa\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;inicializa\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.4 Criando um work item&quot;,&quot;value&quot;:&quot;44-criando-um-work-item&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.5 Integrando eventos \u2192 workqueues&quot;,&quot;value&quot;:&quot;45-integrando-eventos-\u2192-workqueues&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ISR \u2192 Timer \u2192 Workqueue&quot;,&quot;value&quot;:&quot;isr-\u2192-timer-\u2192-workqueue&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.6 Workqueues como est\u00e1gios de pipeline&quot;,&quot;value&quot;:&quot;46-workqueues-como-est\u00e1gios-de-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4.7 Regra de ouro das Workqueues&quot;,&quot;value&quot;:&quot;47-regra-de-ouro-das-workqueues&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2014 Desenhando pipelines completos de eventos no Zephyr&quot;,&quot;value&quot;:&quot;5-desenhando-pipelines-completos-de-eventos-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Do evento f\u00edsico ao processamento industrial robusto&quot;,&quot;value&quot;:&quot;do-evento-f\u00edsico-ao-processamento-industrial-robusto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1 O modelo mental correto: firmware como fluxo de eventos&quot;,&quot;value&quot;:&quot;51-o-modelo-mental-correto-firmware-como-fluxo-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2 Pipeline can\u00f4nico no Zephyr&quot;,&quot;value&quot;:&quot;52-pipeline-can\u00f4nico-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.3 Implementa\u00e7\u00e3o passo a passo&quot;,&quot;value&quot;:&quot;53-implementa\u00e7\u00e3o-passo-a-passo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;1\ufe0f\u20e3 Interrup\u00e7\u00e3o: entrada do pipeline&quot;,&quot;value&quot;:&quot;1\ufe0f\u20e3-interrup\u00e7\u00e3o-entrada-do-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2\ufe0f\u20e3 Soft Timer: debounce e normaliza\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;2\ufe0f\u20e3-soft-timer-debounce-e-normaliza\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3\ufe0f\u20e3 Workqueue: processamento real&quot;,&quot;value&quot;:&quot;3\ufe0f\u20e3-workqueue-processamento-real&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4\ufe0f\u20e3 Workqueue de comunica\u00e7\u00e3o (opcional, mas comum)&quot;,&quot;value&quot;:&quot;4\ufe0f\u20e3-workqueue-de-comunica\u00e7\u00e3o-opcional-mas-comum&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.4 Por que esse pipeline \u00e9 robusto&quot;,&quot;value&quot;:&quot;54-por-que-esse-pipeline-\u00e9-robusto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.5 Anti-padr\u00f5es comuns (e perigosos)&quot;,&quot;value&quot;:&quot;55-anti-padr\u00f5es-comuns-e-perigosos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.6 Regra de ouro do pipeline no Zephyr&quot;,&quot;value&quot;:&quot;56-regra-de-ouro-do-pipeline-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6 \u2014 Boas pr\u00e1ticas industriais&quot;,&quot;value&quot;:&quot;6-boas-pr\u00e1ticas-industriais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Prioridades, backpressure e recupera\u00e7\u00e3o de falhas&quot;,&quot;value&quot;:&quot;prioridades-backpressure-e-recupera\u00e7\u00e3o-de-falhas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.1 Prioriza\u00e7\u00e3o correta: tempo \u00e9 um recurso finito&quot;,&quot;value&quot;:&quot;61-prioriza\u00e7\u00e3o-correta-tempo-\u00e9-um-recurso-finito&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Regra pr\u00e1tica de prioridade&quot;,&quot;value&quot;:&quot;regra-pr\u00e1tica-de-prioridade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.2 Exemplo \u2014 Workqueues com prioridades distintas&quot;,&quot;value&quot;:&quot;62-exemplo-workqueues-com-prioridades-distintas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.3 Backpressure: quando eventos chegam r\u00e1pido demais&quot;,&quot;value&quot;:&quot;63-backpressure-quando-eventos-chegam-r\u00e1pido-demais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrat\u00e9gias de backpressure no Zephyr&quot;,&quot;value&quot;:&quot;estrat\u00e9gias-de-backpressure-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.4 Exemplo \u2014 Limitando eventos com k_msgq&quot;,&quot;value&quot;:&quot;64-exemplo-limitando-eventos-com-k_msgq&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.5 Eventos colaps\u00e1veis (coalescing)&quot;,&quot;value&quot;:&quot;65-eventos-colaps\u00e1veis-coalescing&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.6 Recupera\u00e7\u00e3o de falhas no pipeline&quot;,&quot;value&quot;:&quot;66-recupera\u00e7\u00e3o-de-falhas-no-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo \u2014 Timeout l\u00f3gico com timer&quot;,&quot;value&quot;:&quot;exemplo-timeout-l\u00f3gico-com-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;6.7 Checklist industrial de robustez&quot;,&quot;value&quot;:&quot;67-checklist-industrial-de-robustez&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7 \u2014 Estudo de caso completo&quot;,&quot;value&quot;:&quot;7-estudo-de-caso-completo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Pipeline Zephyr em um dispositivo IoT industrial (sensor \u2192 processamento \u2192 nuvem)&quot;,&quot;value&quot;:&quot;pipeline-zephyr-em-um-dispositivo-iot-industrial-sensor-\u2192-processamento-\u2192-nuvem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.1 Cen\u00e1rio do sistema&quot;,&quot;value&quot;:&quot;71-cen\u00e1rio-do-sistema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.2 Arquitetura do pipeline&quot;,&quot;value&quot;:&quot;72-arquitetura-do-pipeline&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.3 Est\u00e1gio 1 \u2014 ISR (evento f\u00edsico)&quot;,&quot;value&quot;:&quot;73-est\u00e1gio-1-isr-evento-f\u00edsico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.4 Est\u00e1gio 2 \u2014 Soft Timer (normaliza\u00e7\u00e3o temporal)&quot;,&quot;value&quot;:&quot;74-est\u00e1gio-2-soft-timer-normaliza\u00e7\u00e3o-temporal&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.5 Est\u00e1gio 3 \u2014 Workqueue de aquisi\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;75-est\u00e1gio-3-workqueue-de-aquisi\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.6 Est\u00e1gio 4 \u2014 Workqueue de processamento&quot;,&quot;value&quot;:&quot;76-est\u00e1gio-4-workqueue-de-processamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.7 Est\u00e1gio 5 \u2014 Workqueue de comunica\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;77-est\u00e1gio-5-workqueue-de-comunica\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.8 Controle de carga (backpressure)&quot;,&quot;value&quot;:&quot;78-controle-de-carga-backpressure&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.9 Recupera\u00e7\u00e3o e robustez&quot;,&quot;value&quot;:&quot;79-recupera\u00e7\u00e3o-e-robustez&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;7.10 O que esse estudo de caso demonstra&quot;,&quot;value&quot;:&quot;710-o-que-esse-estudo-de-caso-demonstra&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8 \u2014 Conclus\u00e3o&quot;,&quot;value&quot;:&quot;8-conclus\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00f5es mentais e checklist para firmware industrial com Zephyr&quot;,&quot;value&quot;:&quot;padr\u00f5es-mentais-e-checklist-para-firmware-industrial-com-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.1 O modelo mental correto (o que levar deste artigo)&quot;,&quot;value&quot;:&quot;81-o-modelo-mental-correto-o-que-levar-deste-artigo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.2 Anti-padr\u00f5es finais a evitar&quot;,&quot;value&quot;:&quot;82-anti-padr\u00f5es-finais-a-evitar&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.3 Checklist pr\u00e1tico de revis\u00e3o arquitetural&quot;,&quot;value&quot;:&quot;83-checklist-pr\u00e1tico-de-revis\u00e3o-arquitetural&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.4 Onde esse padr\u00e3o \u00e9 usado na pr\u00e1tica&quot;,&quot;value&quot;:&quot;84-onde-esse-padr\u00e3o-\u00e9-usado-na-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.5 Encerramento&quot;,&quot;value&quot;:&quot;85-encerramento&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">2 — Interrupções no Zephyr</a><ul class="eb-toc__list"><li><a href="#o-papel-correto-das-isrs-em-pipelines-de-eventos-robustos">O papel correto das ISRs em pipelines de eventos robustos</a><li><a href="#eb-table-content-2">2.1 O erro clássico: ISR como “mini-thread”</a><li><a href="#22-o-que-uma-isr-pode-fazer-no-zephyr">2.2 O que uma ISR pode fazer no Zephyr</a><li><a href="#eb-table-content-4">2.3 Exemplo 1 — Interrupção de GPIO bem projetada</a><ul class="eb-toc__list"><li><a href="#eb-table-content-5">Configuração do callback de interrupção</a><li><a href="#eb-table-content-6">Inicialização do GPIO</a></li></ul><li><a href="#24-a-thread-consumidora-do-evento">2.4 A thread consumidora do evento</a><li><a href="#25-regra-de-ouro-para-isrs-em-firmware-industrial">2.5 Regra de ouro para ISRs em firmware industrial</a></li></ul><li><a href="#3-soft-timers-no-zephyr">3 — Soft Timers no Zephyr</a><ul class="eb-toc__list"><li><a href="#eb-table-content-10">Tempo como evento, não como delay</a><li><a href="#eb-table-content-11">3.1 O erro comum: k_sleep() como lógica</a><li><a href="#32-conceito-de-soft-timer-no-zephyr">3.2 Conceito de Soft Timer no Zephyr</a><li><a href="#33-exemplo-2-timer-como-fonte-de-eventos">3.3 Exemplo 2 — Timer como fonte de eventos</a><ul class="eb-toc__list"><li><a href="#eb-table-content-14">Definição do timer</a><li><a href="#eb-table-content-15">Inicialização do timer</a></li></ul><li><a href="#34-consumindo-eventos-temporais">3.4 Consumindo eventos temporais</a><li><a href="#35-soft-timer-como-etapa-do-pipeline">3.5 Soft Timer como etapa do pipeline</a><li><a href="#36-regra-de-ouro-dos-soft-timers">3.6 Regra de ouro dos Soft Timers</a></li></ul><li><a href="#4-workqueues-no-zephyr">4 — Workqueues no Zephyr</a><ul class="eb-toc__list"><li><a href="#eb-table-content-20">Processamento desacoplado, escalável e seguro</a><li><a href="#eb-table-content-21">4.1 O que é uma Workqueue, de fato</a><li><a href="#42-o-erro-comum-jogar-tudo-na-system-workqueue">4.2 O erro comum: jogar tudo na system workqueue</a><li><a href="#43-criando-uma-workqueue-dedicada">4.3 Criando uma Workqueue dedicada</a><ul class="eb-toc__list"><li><a href="#eb-table-content-24">Definição da workqueue</a><li><a href="#eb-table-content-25">Inicialização</a></li></ul><li><a href="#44-criando-um-work-item">4.4 Criando um work item</a><li><a href="#eb-table-content-27">4.5 Integrando eventos → workqueues</a><ul class="eb-toc__list"><li><a href="#eb-table-content-28">ISR → Timer → Workqueue</a></li></ul><li><a href="#eb-table-content-29">4.6 Workqueues como estágios de pipeline</a><li><a href="#47-regra-de-ouro-das-workqueues">4.7 Regra de ouro das Workqueues</a></li></ul><li><a href="#5-desenhando-pipelines-completos-de-eventos-no-zephyr">5 — Desenhando pipelines completos de eventos no Zephyr</a><ul class="eb-toc__list"><li><a href="#eb-table-content-32">Do evento físico ao processamento industrial robusto</a><li><a href="#51-o-modelo-mental-correto-firmware-como-fluxo-de-eventos">5.1 O modelo mental correto: firmware como fluxo de eventos</a><li><a href="#eb-table-content-34">5.2 Pipeline canônico no Zephyr</a><li><a href="#eb-table-content-35">5.3 Implementação passo a passo</a><ul class="eb-toc__list"><li><a href="#eb-table-content-36">1&#xfe0f;&#x20e3; Interrupção: entrada do pipeline</a><li><a href="#eb-table-content-37">2&#xfe0f;&#x20e3; Soft Timer: debounce e normalização</a><li><a href="#eb-table-content-38">3&#xfe0f;&#x20e3; Workqueue: processamento real</a><li><a href="#eb-table-content-39">4&#xfe0f;&#x20e3; Workqueue de comunicação (opcional, mas comum)</a></li></ul><li><a href="#eb-table-content-40">5.4 Por que esse pipeline é robusto</a><li><a href="#eb-table-content-41">5.5 Anti-padrões comuns (e perigosos)</a><li><a href="#56-regra-de-ouro-do-pipeline-no-zephyr">5.6 Regra de ouro do pipeline no Zephyr</a></li></ul><li><a href="#eb-table-content-43">6 — Boas práticas industriais</a><ul class="eb-toc__list"><li><a href="#eb-table-content-44">Prioridades, backpressure e recuperação de falhas</a><li><a href="#eb-table-content-45">6.1 Priorização correta: tempo é um recurso finito</a><ul class="eb-toc__list"><li><a href="#eb-table-content-46">Regra prática de prioridade</a></li></ul><li><a href="#62-exemplo-workqueues-com-prioridades-distintas">6.2 Exemplo — Workqueues com prioridades distintas</a><li><a href="#eb-table-content-48">6.3 Backpressure: quando eventos chegam rápido demais</a><ul class="eb-toc__list"><li><a href="#eb-table-content-49">Estratégias de backpressure no Zephyr</a></li></ul><li><a href="#64-exemplo-limitando-eventos-com-k_msgq">6.4 Exemplo — Limitando eventos com k_msgq</a><li><a href="#eb-table-content-51">6.5 Eventos colapsáveis (coalescing)</a><li><a href="#eb-table-content-52">6.6 Recuperação de falhas no pipeline</a><ul class="eb-toc__list"><li><a href="#eb-table-content-53">Exemplo — Timeout lógico com timer</a></li></ul><li><a href="#67-checklist-industrial-de-robustez">6.7 Checklist industrial de robustez</a></li></ul><li><a href="#7-estudo-de-caso-completo">7 — Estudo de caso completo</a><ul class="eb-toc__list"><li><a href="#eb-table-content-56">Pipeline Zephyr em um dispositivo IoT industrial (sensor → processamento → nuvem)</a><li><a href="#eb-table-content-57">7.1 Cenário do sistema</a><li><a href="#72-arquitetura-do-pipeline">7.2 Arquitetura do pipeline</a><li><a href="#eb-table-content-59">7.3 Estágio 1 — ISR (evento físico)</a><li><a href="#eb-table-content-60">7.4 Estágio 2 — Soft Timer (normalização temporal)</a><li><a href="#eb-table-content-61">7.5 Estágio 3 — Workqueue de aquisição</a><li><a href="#eb-table-content-62">7.6 Estágio 4 — Workqueue de processamento</a><li><a href="#eb-table-content-63">7.7 Estágio 5 — Workqueue de comunicação</a><li><a href="#78-controle-de-carga-backpressure">7.8 Controle de carga (backpressure)</a><li><a href="#eb-table-content-65">7.9 Recuperação e robustez</a><li><a href="#710-o-que-esse-estudo-de-caso-demonstra">7.10 O que esse estudo de caso demonstra</a></li></ul><li><a href="#eb-table-content-67">8 — Conclusão</a><ul class="eb-toc__list"><li><a href="#eb-table-content-68">Padrões mentais e checklist para firmware industrial com Zephyr</a><li><a href="#81-o-modelo-mental-correto-o-que-levar-deste-artigo">8.1 O modelo mental correto (o que levar deste artigo)</a><li><a href="#eb-table-content-70">8.2 Anti-padrões finais a evitar</a><li><a href="#eb-table-content-71">8.3 Checklist prático de revisão arquitetural</a><li><a href="#eb-table-content-72">8.4 Onde esse padrão é usado na prática</a><li><a href="#85-encerramento">8.5 Encerramento</a></li></ul></ul></div></div></div></div></div>


<p class="wp-block-paragraph">Em firmware <strong>industrial</strong> e <strong>IoT de produção</strong>, o problema raramente é “como ler um sensor” ou “como reagir a uma interrupção”. O desafio real está em <strong>como transformar eventos assíncronos e imprevisíveis</strong> (interrupções de hardware, timeouts, pacotes de rede, watchdogs) em <strong>fluxos determinísticos, observáveis e recuperáveis</strong> — sem violar latência, sem bloquear ISRs, sem explodir prioridade e sem criar acoplamentos frágeis entre camadas.</p>



<p class="wp-block-paragraph">O <strong>Zephyr RTOS</strong> se destaca exatamente por oferecer <strong>primitivas complementares</strong> — <em>Interrupções</em>, <em>Soft Timers</em> (<code>k_timer</code>) e <em>Workqueues</em> (<code>k_work</code>) — que, quando <strong>combinadas corretamente</strong>, permitem desenhar <strong>pipelines de eventos robustos</strong>, usados em produtos reais: gateways industriais, sensores remotos, equipamentos médicos, automação predial e dispositivos conectados operando por anos no campo.</p>



<p class="wp-block-paragraph">Este artigo não trata essas primitivas de forma isolada. O foco é <strong>arquitetural</strong>:<br>como <strong>compor</strong> essas ferramentas para criar <strong>fluxos de processamento desacoplados</strong>, previsíveis e testáveis, respeitando as regras fundamentais de sistemas embarcados modernos:</p>



<ul class="wp-block-list">
<li><strong>ISR mínima</strong>: interrupção apenas sinaliza, nunca processa.</li>



<li><strong>Tempo como evento</strong>: temporização explícita, não “sleep espalhado”.</li>



<li><strong>Processamento fora de ISR</strong>: trabalho pesado sempre em contexto de thread.</li>



<li><strong>Backpressure e ordenação</strong>: eventos fluem por etapas bem definidas.</li>



<li><strong>Escalabilidade</strong>: o desenho deve sobreviver ao crescimento do sistema.</li>
</ul>



<p class="wp-block-paragraph">Ao longo das próximas seções, vamos evoluir de um <strong>modelo mental</strong> até <strong>códigos concretos em C</strong>, mostrando:</p>



<ol class="wp-block-list">
<li>O papel correto de <strong>Interrupções</strong> no Zephyr.</li>



<li>Como <strong>Soft Timers</strong> viram fontes de eventos temporais confiáveis.</li>



<li>Como <strong>Workqueues</strong> funcionam como estágios de processamento.</li>



<li>Como integrar tudo isso em <strong>pipelines de eventos industriais</strong>, com exemplos reais de firmware.</li>
</ol>



<p class="wp-block-paragraph">A ideia é que, ao final, você não apenas “saiba usar” essas APIs, mas <strong>consiga enxergar a arquitetura</strong> por trás de um firmware profissional — aquele que não depende de sorte, nem de atrasos mágicos, nem de lógica escondida em ISR.</p><p>The post <a href="https://mcu.tec.br/geral/zephyr-e-integracao-avancada-interrupcoes-soft-timers-workqueues/">Zephyr e Integração Avançada: Interrupções + Soft Timers + Workqueues</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1247</post-id>	</item>
		<item>
		<title>Interrupções e Soft Timers no Zephyr OS</title>
		<link>https://mcu.tec.br/rtos/interrupcoes-e-soft-timers-no-zephyr-os/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=interrupcoes-e-soft-timers-no-zephyr-os</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 03 Apr 2026 14:04:49 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[firmware em tempo real]]></category>
		<category><![CDATA[gpio interrupt zephyr]]></category>
		<category><![CDATA[interrupções no zephyr]]></category>
		<category><![CDATA[isr zephyr]]></category>
		<category><![CDATA[k_timer zephyr]]></category>
		<category><![CDATA[programação embarcada com zephyr]]></category>
		<category><![CDATA[rtos para iot]]></category>
		<category><![CDATA[sistemas embarcados modernos]]></category>
		<category><![CDATA[soft timers zephyr]]></category>
		<category><![CDATA[zephyr kernel]]></category>
		<category><![CDATA[Zephyr OS]]></category>
		<category><![CDATA[Zephyr RTOS]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1244</guid>

					<description><![CDATA[<p>Este artigo apresenta um guia técnico e didático sobre o uso de interrupções de hardware e soft timers no Zephyr OS, um sistema operacional de tempo real amplamente utilizado em projetos de IoT e sistemas embarcados modernos. O conteúdo explora a filosofia do Zephyr para tratamento de eventos assíncronos, detalhando como funcionam as ISRs (Interrupt Service Routines), a integração com GPIOs, a sinalização correta de threads e o uso seguro de semáforos. Em seguida, o artigo aprofunda o uso de soft timers (k_timer), explicando sua arquitetura interna, diferenças em relação aos timers de hardware, modos de operação periódicos e one-shot, além de padrões recomendados para firmware escalável. Com exemplos práticos em C, o texto mostra como combinar interrupções, timers e threads para criar sistemas previsíveis, portáveis e robustos, alinhados às boas práticas de desenvolvimento profissional com Zephyr RTOS.</p>
<p>The post <a href="https://mcu.tec.br/rtos/interrupcoes-e-soft-timers-no-zephyr-os/">Interrupções e Soft Timers no Zephyr OS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Interrupções e Soft Timers no Zephyr OS: Guia Completo para Firmware em RTOS</p>



<p class="wp-block-paragraph"><strong>Frase-chave foco</strong></p>


<div class="root-eb-toc-iu744 wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-iu744 "><div class="eb-toc-container eb-toc-iu744  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:3,&quot;content&quot;:&quot;1 \u2013 Introdu\u00e7\u00e3o: o papel de Interrup\u00e7\u00f5es e Soft Timers em um RTOS moderno&quot;,&quot;text&quot;:&quot;1 \u2013 Introdu\u00e7\u00e3o: o papel de Interrup\u00e7\u00f5es e Soft Timers em um RTOS moderno&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;2 \u2013 Modelo de Interrup\u00e7\u00f5es no Zephyr: conceitos fundamentais&quot;,&quot;text&quot;:&quot;2 \u2013 Modelo de Interrup\u00e7\u00f5es no Zephyr: conceitos fundamentais&quot;,&quot;link&quot;:&quot;eb-table-content-1&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;O que \u00e9 uma ISR no Zephyr?&quot;,&quot;text&quot;:&quot;O que \u00e9 uma ISR no Zephyr?&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;3 \u2013 Conectando uma interrup\u00e7\u00e3o no Zephyr (exemplo com GPIO)&quot;,&quot;text&quot;:&quot;3 \u2013 Conectando uma interrup\u00e7\u00e3o no Zephyr (exemplo com GPIO)&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Passo 1 \u2013 Defini\u00e7\u00e3o no Devicetree (conceito)&quot;,&quot;text&quot;:&quot;Passo 1 \u2013 Defini\u00e7\u00e3o no Devicetree (conceito)&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Passo 2 \u2013 Estrutura de callback de GPIO&quot;,&quot;text&quot;:&quot;Passo 2 \u2013 Estrutura de callback de GPIO&quot;,&quot;link&quot;:&quot;passo-2-estrutura-de-callback-de-gpio&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Passo 3 \u2013 Implementa\u00e7\u00e3o da ISR&quot;,&quot;text&quot;:&quot;Passo 3 \u2013 Implementa\u00e7\u00e3o da ISR&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Passo 4 \u2013 Configura\u00e7\u00e3o do GPIO e da interrup\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Passo 4 \u2013 Configura\u00e7\u00e3o do GPIO e da interrup\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;4 \u2013 Arquitetura correta: ISR + sinaliza\u00e7\u00e3o de thread&quot;,&quot;text&quot;:&quot;4 \u2013 Arquitetura correta: ISR + sinaliza\u00e7\u00e3o de thread&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;1 \u2013 Introdu\u00e7\u00e3o: o papel de Interrup\u00e7\u00f5es e Soft Timers em um RTOS moderno&quot;,&quot;value&quot;:&quot;1-introdu\u00e7\u00e3o-o-papel-de-interrup\u00e7\u00f5es-e-soft-timers-em-um-rtos-moderno&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2013 Modelo de Interrup\u00e7\u00f5es no Zephyr: conceitos fundamentais&quot;,&quot;value&quot;:&quot;2-modelo-de-interrup\u00e7\u00f5es-no-zephyr-conceitos-fundamentais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que \u00e9 uma ISR no Zephyr?&quot;,&quot;value&quot;:&quot;o-que-\u00e9-uma-isr-no-zephyr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;3 \u2013 Conectando uma interrup\u00e7\u00e3o no Zephyr (exemplo com GPIO)&quot;,&quot;value&quot;:&quot;3-conectando-uma-interrup\u00e7\u00e3o-no-zephyr-exemplo-com-gpio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Passo 1 \u2013 Defini\u00e7\u00e3o no Devicetree (conceito)&quot;,&quot;value&quot;:&quot;passo-1-defini\u00e7\u00e3o-no-devicetree-conceito&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Passo 2 \u2013 Estrutura de callback de GPIO&quot;,&quot;value&quot;:&quot;passo-2-estrutura-de-callback-de-gpio&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Passo 3 \u2013 Implementa\u00e7\u00e3o da ISR&quot;,&quot;value&quot;:&quot;passo-3-implementa\u00e7\u00e3o-da-isr&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Passo 4 \u2013 Configura\u00e7\u00e3o do GPIO e da interrup\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;passo-4-configura\u00e7\u00e3o-do-gpio-e-da-interrup\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;4 \u2013 Arquitetura correta: ISR + sinaliza\u00e7\u00e3o de thread&quot;,&quot;value&quot;:&quot;4-arquitetura-correta-isr-sinaliza\u00e7\u00e3o-de-thread&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">1 – Introdução: o papel de Interrupções e Soft Timers em um RTOS moderno</a><li><a href="#eb-table-content-1">2 – Modelo de Interrupções no Zephyr: conceitos fundamentais</a><ul class="eb-toc__list"><li><a href="#eb-table-content-2">O que é uma ISR no Zephyr?</a></li></ul><li><a href="#eb-table-content-3">3 – Conectando uma interrupção no Zephyr (exemplo com GPIO)</a><ul class="eb-toc__list"><li><a href="#eb-table-content-4">Passo 1 – Definição no Devicetree (conceito)</a><li><a href="#passo-2-estrutura-de-callback-de-gpio">Passo 2 – Estrutura de callback de GPIO</a><li><a href="#eb-table-content-6">Passo 3 – Implementação da ISR</a><li><a href="#eb-table-content-7">Passo 4 – Configuração do GPIO e da interrupção</a></li></ul><li><a href="#eb-table-content-8">4 – Arquitetura correta: ISR + sinalização de thread</a></ul></div></div></div></div></div>


<h3 class="wp-block-heading"><strong>1 – Introdução: o papel de Interrupções e Soft Timers em um RTOS moderno</strong></h3>



<p class="wp-block-paragraph">Em sistemas embarcados modernos, especialmente aqueles baseados em um <strong>RTOS (Real-Time Operating System)</strong> como o <strong>Zephyr OS</strong>, a forma como lidamos com eventos assíncronos define diretamente a robustez, a previsibilidade temporal e a escalabilidade do firmware. Dois mecanismos são absolutamente centrais nesse contexto: <strong>interrupções de hardware</strong> e <strong>soft timers</strong>. Embora ambos sejam usados para reagir a eventos no tempo ou no mundo físico, eles possuem naturezas, custos e implicações arquiteturais bastante distintas.</p>



<p class="wp-block-paragraph">As <strong>interrupções</strong> permitem que o hardware “interrompa” a execução normal da CPU para tratar eventos críticos e de baixa latência, como mudanças em GPIOs, chegada de dados em periféricos ou estouros de contadores. Já os <strong>soft timers</strong> do Zephyr são abstrações de alto nível baseadas no kernel, que permitem executar callbacks temporizados sem recorrer a timers de hardware dedicados ou lógica de polling. Essa separação clara entre o que é <em>tempo crítico</em> e o que é <em>tempo gerenciado pelo kernel</em> é uma das grandes virtudes do Zephyr.</p>



<p class="wp-block-paragraph">Um erro comum de quem vem de arquiteturas bare-metal ou de RTOS mais simples é tentar resolver tudo com interrupções. No Zephyr, isso é um <strong>anti-padrão arquitetural</strong>. O sistema foi projetado para que interrupções sejam <strong>curtas, determinísticas e não bloqueantes</strong>, delegando o processamento mais pesado para threads, workqueues ou timers. Entender essa filosofia é essencial para escrever firmware escalável e seguro.</p>



<p class="wp-block-paragraph">Ao longo deste artigo, vamos explorar:</p>



<ul class="wp-block-list">
<li>Como o Zephyr trata <strong>interrupções</strong> de forma portável e segura</li>



<li>Como configurar e usar <strong>ISRs (Interrupt Service Routines)</strong> corretamente</li>



<li>Como funcionam os <strong>Soft Timers (<code>k_timer</code>)</strong></li>



<li>Quando usar interrupção, timer ou thread</li>



<li>Padrões e armadilhas comuns em projetos reais</li>
</ul>



<p class="wp-block-paragraph">Sempre com exemplos em C, comentados e aplicáveis a placas reais como STM32, nRF e RP2040.</p>



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



<h3 class="wp-block-heading"><strong>2 – Modelo de Interrupções no Zephyr: conceitos fundamentais</strong></h3>



<p class="wp-block-paragraph">Antes de escrever qualquer ISR no Zephyr, é fundamental entender que o sistema adota um <strong>modelo de interrupções abstraído</strong>, desacoplado do hardware específico, mas ainda permitindo acesso direto quando necessário. O Zephyr se apoia em três pilares principais:</p>



<ol class="wp-block-list">
<li><strong>Árvore de dispositivos (Devicetree)</strong></li>



<li><strong>API genérica de IRQ do kernel</strong></li>



<li><strong>Separação rígida entre contexto de interrupção e contexto de thread</strong></li>
</ol>



<p class="wp-block-paragraph">No Zephyr, interrupções <strong>não são configuradas diretamente em registradores</strong> no código da aplicação (como em bare-metal). Em vez disso, elas são declaradas e conectadas por meio do <strong>Devicetree</strong>, que descreve o hardware de forma declarativa. Isso permite que o mesmo código rode, sem modificações, em arquiteturas distintas.</p>



<h4 class="wp-block-heading"><strong>O que é uma ISR no Zephyr?</strong></h4>



<p class="wp-block-paragraph">Uma <strong>ISR (Interrupt Service Routine)</strong> no Zephyr é uma função C comum, mas com restrições severas:</p>



<ul class="wp-block-list">
<li>Não pode bloquear</li>



<li>Não pode usar <code>k_sleep()</code></li>



<li>Não pode alocar memória dinâmica</li>



<li>Não pode chamar APIs que dependem do escalonador</li>
</ul>



<p class="wp-block-paragraph">Ela deve apenas:</p>



<ul class="wp-block-list">
<li>Reconhecer o evento</li>



<li>Capturar dados mínimos</li>



<li>Sinalizar uma thread, timer ou workqueue</li>
</ul>



<p class="wp-block-paragraph">Esse modelo força uma arquitetura mais limpa e previsível.</p>



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



<h3 class="wp-block-heading"><strong>3 – Conectando uma interrupção no Zephyr (exemplo com GPIO)</strong></h3>



<p class="wp-block-paragraph">Vamos começar com um exemplo clássico: <strong>interrupção por mudança de nível em um pino GPIO</strong>, algo extremamente comum em botões, sensores e sinais externos.</p>



<h4 class="wp-block-heading"><strong>Passo 1 – Definição no Devicetree (conceito)</strong></h4>



<p class="wp-block-paragraph">O Zephyr já fornece nós de GPIO prontos no Devicetree. Em geral, você não precisa criar nada manualmente, apenas referenciar o pino correto.</p>



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



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



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



<h4 class="wp-block-heading"><strong>Passo 2 – Estrutura de callback de GPIO</strong></h4>



<p class="wp-block-paragraph">No Zephyr, interrupções de GPIO usam a estrutura <code>gpio_callback</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/drivers/gpio.h>

/* Callback associado à interrupção */
static struct gpio_callback button_cb_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: #D8DEE9FF">#include &lt;zephyr/kernel.h&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#include &lt;zephyr/drivers/gpio.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">/* Callback associado à interrupção */</span></span>
<span class="line"><span style="color: #D8DEE9FF">static struct gpio_callback button_cb_data;</span></span>
<span class="line"></span></code></pre></div>



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



<h4 class="wp-block-heading"><strong>Passo 3 – Implementação da ISR</strong></h4>



<p class="wp-block-paragraph">A função de callback será executada <strong>em contexto de interrupção</strong>:</p>



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

    /* ISR deve ser curta e não bloqueante */
    printk("Botão pressionado!\n");
}
</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">void button_pressed_isr(const struct device *dev,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                        struct gpio_callback *cb,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                        uint32_t pins)</span></span>
<span class="line"><span style="color: #D8DEE9FF">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ARG_UNUSED(dev);</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ARG_UNUSED(cb);</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ARG_UNUSED(pins);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    /* ISR deve ser curta e não bloqueante */</span></span>
<span class="line"><span style="color: #D8DEE9FF">    printk(&quot;Botão pressionado!\n&quot;);</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</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>Observação importante</strong>:<br>Mesmo o <code>printk()</code> não é ideal dentro de ISR em sistemas críticos. Ele é usado aqui apenas para fins didáticos. Em projetos reais, o correto é sinalizar uma thread.</p>



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



<h4 class="wp-block-heading"><strong>Passo 4 – Configuração do GPIO e da interrupção</strong></h4>



<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>const struct device *button_dev;

button_dev = DEVICE_DT_GET(DT_NODELABEL(gpioa));

gpio_pin_configure(button_dev, 0, GPIO_INPUT | GPIO_PULL_UP);

gpio_pin_interrupt_configure(button_dev,
                              0,
                              GPIO_INT_EDGE_FALLING);

gpio_init_callback(&amp;button_cb_data,
                   button_pressed_isr,
                   BIT(0));

gpio_add_callback(button_dev, &amp;button_cb_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: #D8DEE9FF">const struct device *button_dev;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">button_dev = DEVICE_DT_GET(DT_NODELABEL(gpioa));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">gpio_pin_configure(button_dev, 0, GPIO_INPUT | GPIO_PULL_UP);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">gpio_pin_interrupt_configure(button_dev,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                              0,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                              GPIO_INT_EDGE_FALLING);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">gpio_init_callback(&amp;button_cb_data,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                   button_pressed_isr,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                   BIT(0));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">gpio_add_callback(button_dev, &amp;button_cb_data);</span></span>
<span class="line"></span></code></pre></div>



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



<ul class="wp-block-list">
<li>O hardware gera a interrupção</li>



<li>O driver de GPIO chama a ISR</li>



<li>O kernel garante isolamento e segurança</li>
</ul>



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



<h3 class="wp-block-heading"><strong>4 – Arquitetura correta: ISR + sinalização de thread</strong></h3>



<p class="wp-block-paragraph">A forma correta de usar interrupções no Zephyr é <strong>acordar ou sinalizar uma thread</strong>, e não executar lógica pesada na ISR.</p>



<p class="wp-block-paragraph">Exemplo usando <strong>semaforos</strong>:</p>



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

void button_pressed_isr(const struct device *dev,
                        struct gpio_callback *cb,
                        uint32_t pins)
{
    k_sem_give(&amp;button_sem);
}
</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">K_SEM_DEFINE(button_sem, 0, 1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">void button_pressed_isr(const struct device *dev,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                        struct gpio_callback *cb,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                        uint32_t pins)</span></span>
<span class="line"><span style="color: #D8DEE9FF">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    k_sem_give(&amp;button_sem);</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span>
<span class="line"></span></code></pre></div>



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



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



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



<ul class="wp-block-list">
<li>Mantém ISRs determinísticas</li>



<li>Evita jitter</li>



<li>Escala melhor com múltiplos eventos</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/rtos/interrupcoes-e-soft-timers-no-zephyr-os/">Interrupções e Soft Timers 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">1244</post-id>	</item>
	</channel>
</rss>
