<?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>FSM embarcado - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/fsm-embarcado/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 14 Jan 2026 13:57:43 +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>FSM embarcado - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Máquina de Estados em Sistemas Embarcados com FreeRTOS: Projeto Cíclico, Recuperável e Orientado a Eventos</title>
		<link>https://mcu.tec.br/algoritimos/maquina-de-estados-em-sistemas-embarcados-com-freertos-projeto-ciclico-recuperavel-e-orientado-a-eventos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=maquina-de-estados-em-sistemas-embarcados-com-freertos-projeto-ciclico-recuperavel-e-orientado-a-eventos</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 14 Jan 2026 13:51:20 +0000</pubDate>
				<category><![CDATA[Algoritimos]]></category>
		<category><![CDATA[Active Object]]></category>
		<category><![CDATA[arquitetura de firmware]]></category>
		<category><![CDATA[firmware robusto]]></category>
		<category><![CDATA[freertos]]></category>
		<category><![CDATA[FSM embarcado]]></category>
		<category><![CDATA[Gatekeeper]]></category>
		<category><![CDATA[máquina de estados]]></category>
		<category><![CDATA[padrões de projeto embarcados]]></category>
		<category><![CDATA[programação em C embarcado]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1194</guid>

					<description><![CDATA[<p>Aprenda como projetar Máquinas de Estados robustas para sistemas embarcados usando FreeRTOS. Este artigo apresenta uma abordagem prática e profissional para construir firmware cíclico e recuperável, utilizando duas threads cooperativas, filas de mensagens e eventos tipados. São explorados padrões de projeto clássicos para sistemas embarcados, como Active Object, Gatekeeper, State Pattern, Supervisor e Error Containment, com exemplos completos em C, incluindo tratamento de timeouts, retentativas com backoff, correlação de requisições e estados seguros. O conteúdo é voltado a desenvolvedores que desejam sair do superloop tradicional e construir sistemas previsíveis, escaláveis e fáceis de manter em ambientes reais de produção.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/maquina-de-estados-em-sistemas-embarcados-com-freertos-projeto-ciclico-recuperavel-e-orientado-a-eventos/">Máquina de Estados em Sistemas Embarcados com FreeRTOS: Projeto Cíclico, Recuperável e Orientado a Eventos</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-y4egp wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-y4egp "><div class="eb-toc-container eb-toc-y4egp  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;Vis\u00e3o Geral: por que M\u00e1quina de Estados em Firmware \u201cde verdade\u201d&quot;,&quot;text&quot;:&quot;Vis\u00e3o Geral: por que M\u00e1quina de Estados em Firmware \u201cde verdade\u201d&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Estrutura do projeto FreeRTOS: tipos, filas e as duas tasks&quot;,&quot;text&quot;:&quot;Estrutura do projeto FreeRTOS: tipos, filas e as duas tasks&quot;,&quot;link&quot;:&quot;estrutura-do-projeto-freertos-tipos-filas-e-as-duas-tasks&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Motor da FSM: transi\u00e7\u00f5es, deadlines, retentativas e estado seguro&quot;,&quot;text&quot;:&quot;Motor da FSM: transi\u00e7\u00f5es, deadlines, retentativas e estado seguro&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que foi garantido aqui (na pr\u00e1tica)&quot;,&quot;text&quot;:&quot;O que foi garantido aqui (na pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Tornando \u201cprodu\u00e7\u00e3o\u201d: entry-actions, correla\u00e7\u00e3o request\/response e boas vs m\u00e1s escolhas&quot;,&quot;text&quot;:&quot;Tornando \u201cprodu\u00e7\u00e3o\u201d: entry-actions, correla\u00e7\u00e3o request\/response e boas vs m\u00e1s escolhas&quot;,&quot;link&quot;:&quot;eb-table-content-4&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.1 Entry-actions: rodar \u201cuma vez\u201d ao entrar no estado&quot;,&quot;text&quot;:&quot;5.1 Entry-actions: rodar \u201cuma vez\u201d ao entrar no estado&quot;,&quot;link&quot;:&quot;51-entry-actions-rodar-uma-vez-ao-entrar-no-estado&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.2 Correla\u00e7\u00e3o por req_id: evitando consumir resposta errada&quot;,&quot;text&quot;:&quot;5.2 Correla\u00e7\u00e3o por req_id: evitando consumir resposta errada&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.3 Boa escolha vs m\u00e1 escolha (na pr\u00e1tica)&quot;,&quot;text&quot;:&quot;5.3 Boa escolha vs m\u00e1 escolha (na pr\u00e1tica)&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;5.4 Padr\u00f5es expl\u00edcitos que estamos aplicando aqui&quot;,&quot;text&quot;:&quot;5.4 Padr\u00f5es expl\u00edcitos que estamos aplicando aqui&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Exemplo consolidado (mais \u201creal\u201d): correla\u00e7\u00e3o req_id, entry-actions, e ISR \u2192 fila&quot;,&quot;text&quot;:&quot;Exemplo consolidado (mais \u201creal\u201d): correla\u00e7\u00e3o req_id, entry-actions, e ISR \u2192 fila&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que esse \u201cconsolidado\u201d resolve que o exemplo anterior n\u00e3o garantia t\u00e3o bem&quot;,&quot;text&quot;:&quot;O que esse \u201cconsolidado\u201d resolve que o exemplo anterior n\u00e3o garantia t\u00e3o bem&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Padr\u00f5es de projeto embarcados aplicados: nomes, pap\u00e9is e como encaixar no seu firmware&quot;,&quot;text&quot;:&quot;Padr\u00f5es de projeto embarcados aplicados: nomes, pap\u00e9is e como encaixar no seu firmware&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Active Object (Objeto Ativo)&quot;,&quot;text&quot;:&quot;Active Object (Objeto Ativo)&quot;,&quot;link&quot;:&quot;active-object-objeto-ativo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Message Queue \/ Event-Driven Boundary (Fronteira por Mensagens)&quot;,&quot;text&quot;:&quot;Message Queue \/ Event-Driven Boundary (Fronteira por Mensagens)&quot;,&quot;link&quot;:&quot;message-queue-event-driven-boundary-fronteira-por-mensagens&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Gatekeeper (Dono do Perif\u00e9rico)&quot;,&quot;text&quot;:&quot;Gatekeeper (Dono do Perif\u00e9rico)&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;State Pattern (varia\u00e7\u00e3o em C) e disciplina de entry\/actions&quot;,&quot;text&quot;:&quot;State Pattern (varia\u00e7\u00e3o em C) e disciplina de entry\/actions&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Supervisor (FSM acima de FSMs)&quot;,&quot;text&quot;:&quot;Supervisor (FSM acima de FSMs)&quot;,&quot;link&quot;:&quot;supervisor-fsm-acima-de-fsms&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Watchdog l\u00f3gico (mais \u00fatil que s\u00f3 \u201cchutar o c\u00e3o\u201d)&quot;,&quot;text&quot;:&quot;Watchdog l\u00f3gico (mais \u00fatil que s\u00f3 \u201cchutar o c\u00e3o\u201d)&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Error Containment \/ Recovery Block&quot;,&quot;text&quot;:&quot;Error Containment \/ Recovery Block&quot;,&quot;link&quot;:&quot;error-containment-recovery-block&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Como isso vira uma arquitetura real (sem \u201cexplodir\u201d em complexidade)&quot;,&quot;text&quot;:&quot;Como isso vira uma arquitetura real (sem \u201cexplodir\u201d em complexidade)&quot;,&quot;link&quot;:&quot;como-isso-vira-uma-arquitetura-real-sem-explodir-em-complexidade&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Checklist pr\u00e1tico, m\u00e9tricas de campo e extens\u00f5es naturais da FSM&quot;,&quot;text&quot;:&quot;Checklist pr\u00e1tico, m\u00e9tricas de campo e extens\u00f5es naturais da FSM&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.1 Checklist de boas pr\u00e1ticas (FSM + FreeRTOS)&quot;,&quot;text&quot;:&quot;8.1 Checklist de boas pr\u00e1ticas (FSM + FreeRTOS)&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.2 O que medir e logar (para depura\u00e7\u00e3o em campo)&quot;,&quot;text&quot;:&quot;8.2 O que medir e logar (para depura\u00e7\u00e3o em campo)&quot;,&quot;link&quot;:&quot;eb-table-content-22&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.3 Watchdog l\u00f3gico: como integrar de forma correta&quot;,&quot;text&quot;:&quot;8.3 Watchdog l\u00f3gico: como integrar de forma correta&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.4 Extens\u00f5es naturais (quando o sistema crescer)&quot;,&quot;text&quot;:&quot;8.4 Extens\u00f5es naturais (quando o sistema crescer)&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;8.5 Ideia-chave para levar consigo&quot;,&quot;text&quot;:&quot;8.5 Ideia-chave para levar consigo&quot;,&quot;link&quot;:&quot;85-ideia-chave-para-levar-consigo&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;S\u00edntese t\u00e9cnica do artigo&quot;,&quot;text&quot;:&quot;S\u00edntese t\u00e9cnica do artigo&quot;,&quot;link&quot;:&quot;eb-table-content-26&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Vis\u00e3o Geral: por que M\u00e1quina de Estados em Firmware \u201cde verdade\u201d&quot;,&quot;value&quot;:&quot;vis\u00e3o-geral-por-que-m\u00e1quina-de-estados-em-firmware-de-verdade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estrutura do projeto FreeRTOS: tipos, filas e as duas tasks&quot;,&quot;value&quot;:&quot;estrutura-do-projeto-freertos-tipos-filas-e-as-duas-tasks&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Motor da FSM: transi\u00e7\u00f5es, deadlines, retentativas e estado seguro&quot;,&quot;value&quot;:&quot;motor-da-fsm-transi\u00e7\u00f5es-deadlines-retentativas-e-estado-seguro&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que foi garantido aqui (na pr\u00e1tica)&quot;,&quot;value&quot;:&quot;o-que-foi-garantido-aqui-na-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tornando \u201cprodu\u00e7\u00e3o\u201d: entry-actions, correla\u00e7\u00e3o request\/response e boas vs m\u00e1s escolhas&quot;,&quot;value&quot;:&quot;tornando-produ\u00e7\u00e3o-entry-actions-correla\u00e7\u00e3o-requestresponse-e-boas-vs-m\u00e1s-escolhas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.1 Entry-actions: rodar \u201cuma vez\u201d ao entrar no estado&quot;,&quot;value&quot;:&quot;51-entry-actions-rodar-uma-vez-ao-entrar-no-estado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.2 Correla\u00e7\u00e3o por req_id: evitando consumir resposta errada&quot;,&quot;value&quot;:&quot;52-correla\u00e7\u00e3o-por-req_id-evitando-consumir-resposta-errada&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.3 Boa escolha vs m\u00e1 escolha (na pr\u00e1tica)&quot;,&quot;value&quot;:&quot;53-boa-escolha-vs-m\u00e1-escolha-na-pr\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5.4 Padr\u00f5es expl\u00edcitos que estamos aplicando aqui&quot;,&quot;value&quot;:&quot;54-padr\u00f5es-expl\u00edcitos-que-estamos-aplicando-aqui&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo consolidado (mais \u201creal\u201d): correla\u00e7\u00e3o req_id, entry-actions, e ISR \u2192 fila&quot;,&quot;value&quot;:&quot;exemplo-consolidado-mais-real-correla\u00e7\u00e3o-req_id-entry-actions-e-isr-\u2192-fila&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que esse \u201cconsolidado\u201d resolve que o exemplo anterior n\u00e3o garantia t\u00e3o bem&quot;,&quot;value&quot;:&quot;o-que-esse-consolidado-resolve-que-o-exemplo-anterior-n\u00e3o-garantia-t\u00e3o-bem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00f5es de projeto embarcados aplicados: nomes, pap\u00e9is e como encaixar no seu firmware&quot;,&quot;value&quot;:&quot;padr\u00f5es-de-projeto-embarcados-aplicados-nomes-pap\u00e9is-e-como-encaixar-no-seu-firmware&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Active Object (Objeto Ativo)&quot;,&quot;value&quot;:&quot;active-object-objeto-ativo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Message Queue \/ Event-Driven Boundary (Fronteira por Mensagens)&quot;,&quot;value&quot;:&quot;message-queue-event-driven-boundary-fronteira-por-mensagens&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Gatekeeper (Dono do Perif\u00e9rico)&quot;,&quot;value&quot;:&quot;gatekeeper-dono-do-perif\u00e9rico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;State Pattern (varia\u00e7\u00e3o em C) e disciplina de entry\/actions&quot;,&quot;value&quot;:&quot;state-pattern-varia\u00e7\u00e3o-em-c-e-disciplina-de-entryactions&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Supervisor (FSM acima de FSMs)&quot;,&quot;value&quot;:&quot;supervisor-fsm-acima-de-fsms&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Watchdog l\u00f3gico (mais \u00fatil que s\u00f3 \u201cchutar o c\u00e3o\u201d)&quot;,&quot;value&quot;:&quot;watchdog-l\u00f3gico-mais-\u00fatil-que-s\u00f3-chutar-o-c\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Error Containment \/ Recovery Block&quot;,&quot;value&quot;:&quot;error-containment-recovery-block&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Como isso vira uma arquitetura real (sem \u201cexplodir\u201d em complexidade)&quot;,&quot;value&quot;:&quot;como-isso-vira-uma-arquitetura-real-sem-explodir-em-complexidade&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Checklist pr\u00e1tico, m\u00e9tricas de campo e extens\u00f5es naturais da FSM&quot;,&quot;value&quot;:&quot;checklist-pr\u00e1tico-m\u00e9tricas-de-campo-e-extens\u00f5es-naturais-da-fsm&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.1 Checklist de boas pr\u00e1ticas (FSM + FreeRTOS)&quot;,&quot;value&quot;:&quot;81-checklist-de-boas-pr\u00e1ticas-fsm-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.2 O que medir e logar (para depura\u00e7\u00e3o em campo)&quot;,&quot;value&quot;:&quot;82-o-que-medir-e-logar-para-depura\u00e7\u00e3o-em-campo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.3 Watchdog l\u00f3gico: como integrar de forma correta&quot;,&quot;value&quot;:&quot;83-watchdog-l\u00f3gico-como-integrar-de-forma-correta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.4 Extens\u00f5es naturais (quando o sistema crescer)&quot;,&quot;value&quot;:&quot;84-extens\u00f5es-naturais-quando-o-sistema-crescer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;8.5 Ideia-chave para levar consigo&quot;,&quot;value&quot;:&quot;85-ideia-chave-para-levar-consigo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;S\u00edntese t\u00e9cnica do artigo&quot;,&quot;value&quot;:&quot;s\u00edntese-t\u00e9cnica-do-artigo&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Visão Geral: por que Máquina de Estados em Firmware “de verdade”</a><li><a href="#estrutura-do-projeto-freertos-tipos-filas-e-as-duas-tasks">Estrutura do projeto FreeRTOS: tipos, filas e as duas tasks</a><li><a href="#eb-table-content-2">Motor da FSM: transições, deadlines, retentativas e estado seguro</a><ul class="eb-toc__list"><li><a href="#eb-table-content-3">O que foi garantido aqui (na prática)</a></li></ul><li><a href="#eb-table-content-4">Tornando “produção”: entry-actions, correlação request/response e boas vs más escolhas</a><ul class="eb-toc__list"><li><a href="#51-entry-actions-rodar-uma-vez-ao-entrar-no-estado">5.1 Entry-actions: rodar “uma vez” ao entrar no estado</a><li><a href="#eb-table-content-6">5.2 Correlação por req_id: evitando consumir resposta errada</a><li><a href="#eb-table-content-7">5.3 Boa escolha vs má escolha (na prática)</a><li><a href="#eb-table-content-8">5.4 Padrões explícitos que estamos aplicando aqui</a></li></ul><li><a href="#eb-table-content-9">Exemplo consolidado (mais “real”): correlação req_id, entry-actions, e ISR → fila</a><ul class="eb-toc__list"><li><a href="#eb-table-content-10">O que esse “consolidado” resolve que o exemplo anterior não garantia tão bem</a></li></ul><li><a href="#eb-table-content-11">Padrões de projeto embarcados aplicados: nomes, papéis e como encaixar no seu firmware</a><ul class="eb-toc__list"><li><a href="#active-object-objeto-ativo">Active Object (Objeto Ativo)</a><li><a href="#message-queue-event-driven-boundary-fronteira-por-mensagens">Message Queue / Event-Driven Boundary (Fronteira por Mensagens)</a><li><a href="#eb-table-content-14">Gatekeeper (Dono do Periférico)</a><li><a href="#eb-table-content-15">State Pattern (variação em C) e disciplina de entry/actions</a><li><a href="#supervisor-fsm-acima-de-fsms">Supervisor (FSM acima de FSMs)</a><li><a href="#eb-table-content-17">Watchdog lógico (mais útil que só “chutar o cão”)</a><li><a href="#error-containment-recovery-block">Error Containment / Recovery Block</a><li><a href="#como-isso-vira-uma-arquitetura-real-sem-explodir-em-complexidade">Como isso vira uma arquitetura real (sem “explodir” em complexidade)</a></li></ul><li><a href="#eb-table-content-20">Checklist prático, métricas de campo e extensões naturais da FSM</a><ul class="eb-toc__list"><li><a href="#eb-table-content-21">8.1 Checklist de boas práticas (FSM + FreeRTOS)</a><li><a href="#eb-table-content-22">8.2 O que medir e logar (para depuração em campo)</a><li><a href="#eb-table-content-23">8.3 Watchdog lógico: como integrar de forma correta</a><li><a href="#eb-table-content-24">8.4 Extensões naturais (quando o sistema crescer)</a><li><a href="#85-ideia-chave-para-levar-consigo">8.5 Ideia-chave para levar consigo</a><li><a href="#eb-table-content-26">Síntese técnica do artigo</a></li></ul></ul></div></div></div></div></div>


<h2 class="wp-block-heading">Visão Geral: por que Máquina de Estados em Firmware “de verdade”</h2>



<p class="wp-block-paragraph">Em sistemas embarcados, a Máquina de Estados (Finite State Machine, FSM) não é só uma técnica de organização: ela é uma forma de <strong>tornar o comportamento previsível</strong>, rastreável e recuperável. Quando você está lidando com periféricos reais (UART, ADC, rádio, motores), o sistema não é “sequencial”; ele é <strong>reativo</strong>. Eventos chegam fora de hora, dados vêm incompletos, sensores falham, o usuário aperta botão no pior momento possível. A FSM é o mecanismo mais direto para modelar isso sem cair em “if-else infinito” ou em código que parece funcionar só em bancada.</p>



<p class="wp-block-paragraph">O problema típico que vamos resolver neste artigo é este: <strong>como projetar um fluxo de controle cíclico</strong> (rodando continuamente) <strong>e recuperável</strong> (capaz de detectar falhas e voltar a um estado seguro) <strong>usando FreeRTOS</strong>, com <strong>duas threads</strong> cooperando: uma thread dona da lógica (controle por estados) e outra thread provedora de eventos/dados (E/S, aquisição, comunicação). A ideia é evitar dois extremos comuns: (1) uma thread monolítica que faz tudo e trava o sistema; (2) várias threads competindo por dados sem governança clara.</p>



<p class="wp-block-paragraph">Para construir isso com rigor arquitetural, vamos “encaixar” a FSM dentro de padrões de projeto clássicos de tempo real: <strong>Active Object</strong> (um objeto/tarefa dona do seu próprio loop e fila), <strong>Message Queuing</strong> (fila de mensagens como fronteira limpa entre threads), e uma estratégia de <strong>ciclo + timeouts</strong> inspirada no raciocínio de padrões de concorrência e arquitetura para sistemas de tempo real (como discutido em catálogos de padrões para RTE systems). Na parte de robustez, vamos adicionar mecanismos de “recuperação” que não são mágicos: <strong>Watchdog lógico</strong>, <strong>Sanity Check</strong> (checagens de coerência), e uma política de <strong>degradação controlada</strong> (fallback para estado seguro).</p>



<p class="wp-block-paragraph">No final, você terá um exemplo que dá para copiar para um projeto real: duas tasks do FreeRTOS, uma FSM explícita com transições bem definidas, eventos chegando por fila, timeouts, retentativas, e recuperação após erro — sem “gambiarras” como delays espalhados ou variáveis globais sem proteção.</p><p>The post <a href="https://mcu.tec.br/algoritimos/maquina-de-estados-em-sistemas-embarcados-com-freertos-projeto-ciclico-recuperavel-e-orientado-a-eventos/">Máquina de Estados em Sistemas Embarcados com FreeRTOS: Projeto Cíclico, Recuperável e Orientado a Eventos</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1194</post-id>	</item>
	</channel>
</rss>
