<?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>filas FreeRTOS - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/filas-freertos/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 07 Jan 2026 00:43:30 +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>filas FreeRTOS - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Arquitetura Orientada a Eventos no FreeRTOS</title>
		<link>https://mcu.tec.br/rtos/arquitetura-orientada-a-eventos-no-freertos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arquitetura-orientada-a-eventos-no-freertos</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 17:44:13 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[arquitetura orientada a eventos]]></category>
		<category><![CDATA[event groups]]></category>
		<category><![CDATA[filas FreeRTOS]]></category>
		<category><![CDATA[firmware reativo]]></category>
		<category><![CDATA[freertos]]></category>
		<category><![CDATA[message buffers]]></category>
		<category><![CDATA[programação em tempo real]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[sistemas determinísticos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[software timers]]></category>
		<category><![CDATA[stream buffers]]></category>
		<category><![CDATA[task notifications]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1057</guid>

					<description><![CDATA[<p>Meta descrição (≥ 600 caracteres):<br />
Este artigo apresenta uma abordagem técnica e didática sobre arquitetura orientada a eventos no FreeRTOS, explicando como projetar firmwares reativos, determinísticos e eficientes para sistemas embarcados. São analisados em profundidade os principais mecanismos do FreeRTOS, como Task Notifications, Event Groups, Queues, Stream Buffers, Message Buffers e Software Timers, sempre sob a ótica de engenharia de software embarcado. O texto demonstra como combinar corretamente esses mecanismos para evitar polling, reduzir consumo de CPU e energia, minimizar latência e melhorar a manutenção do código. Com exemplos práticos em C, análise de padrões arquiteturais e discussão dos erros mais comuns, o artigo serve como guia completo para desenvolvedores que desejam construir sistemas escaláveis, previsíveis e alinhados às melhores práticas de tempo real.</p>
<p>The post <a href="https://mcu.tec.br/rtos/arquitetura-orientada-a-eventos-no-freertos/">Arquitetura Orientada a Eventos no FreeRTOS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-zyou1 wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-zyou1 "><div class="eb-toc-container eb-toc-zyou1  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;Introdu\u00e7\u00e3o e Motiva\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Introdu\u00e7\u00e3o e Motiva\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que vem a seguir&quot;,&quot;text&quot;:&quot;O que vem a seguir&quot;,&quot;link&quot;:&quot;o-que-vem-a-seguir&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo Conceitual da Arquitetura Orientada a Eventos&quot;,&quot;text&quot;:&quot;Modelo Conceitual da Arquitetura Orientada a Eventos&quot;,&quot;link&quot;:&quot;modelo-conceitual-da-arquitetura-orientada-a-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Fluxo t\u00edpico de eventos no FreeRTOS&quot;,&quot;text&quot;:&quot;Fluxo t\u00edpico de eventos no FreeRTOS&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo conceitual simplificado&quot;,&quot;text&quot;:&quot;Exemplo conceitual simplificado&quot;,&quot;link&quot;:&quot;exemplo-conceitual-simplificado&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implica\u00e7\u00f5es arquiteturais importantes&quot;,&quot;text&quot;:&quot;Implica\u00e7\u00f5es arquiteturais importantes&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Task Notifications como Mecanismo Central de Eventos&quot;,&quot;text&quot;:&quot;Task Notifications como Mecanismo Central de Eventos&quot;,&quot;link&quot;:&quot;task-notifications-como-mecanismo-central-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo mental correto para Task Notifications&quot;,&quot;text&quot;:&quot;Modelo mental correto para Task Notifications&quot;,&quot;link&quot;:&quot;modelo-mental-correto-para-task-notifications&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 1 \u2014 Evento simples (sinaliza\u00e7\u00e3o pura)&quot;,&quot;text&quot;:&quot;Exemplo 1 \u2014 Evento simples (sinaliza\u00e7\u00e3o pura)&quot;,&quot;link&quot;:&quot;eb-table-content-8&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 2 \u2014 Contador de eventos acumulados&quot;,&quot;text&quot;:&quot;Exemplo 2 \u2014 Contador de eventos acumulados&quot;,&quot;link&quot;:&quot;exemplo-2-contador-de-eventos-acumulados&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 3 \u2014 Task Notification como bitmap de eventos&quot;,&quot;text&quot;:&quot;Exemplo 3 \u2014 Task Notification como bitmap de eventos&quot;,&quot;link&quot;:&quot;exemplo-3-task-notification-como-bitmap-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Vantagens arquiteturais das Task Notifications&quot;,&quot;text&quot;:&quot;Vantagens arquiteturais das Task Notifications&quot;,&quot;link&quot;:&quot;vantagens-arquiteturais-das-task-notifications&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Event Groups: Coordena\u00e7\u00e3o de M\u00faltiplos Eventos&quot;,&quot;text&quot;:&quot;Event Groups: Coordena\u00e7\u00e3o de M\u00faltiplos Eventos&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo de uso correto para Event Groups&quot;,&quot;text&quot;:&quot;Modelo de uso correto para Event Groups&quot;,&quot;link&quot;:&quot;modelo-de-uso-correto-para-event-groups&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 1 \u2014 Aguardando m\u00faltiplos eventos simult\u00e2neos&quot;,&quot;text&quot;:&quot;Exemplo 1 \u2014 Aguardando m\u00faltiplos eventos simult\u00e2neos&quot;,&quot;link&quot;:&quot;eb-table-content-14&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 2 \u2014 Sinaliza\u00e7\u00e3o parcial e limpeza autom\u00e1tica&quot;,&quot;text&quot;:&quot;Exemplo 2 \u2014 Sinaliza\u00e7\u00e3o parcial e limpeza autom\u00e1tica&quot;,&quot;link&quot;:&quot;eb-table-content-15&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Uso em ISRs&quot;,&quot;text&quot;:&quot;Uso em ISRs&quot;,&quot;link&quot;:&quot;uso-em-isrs&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Armadilhas comuns no uso de Event Groups&quot;,&quot;text&quot;:&quot;Armadilhas comuns no uso de Event Groups&quot;,&quot;link&quot;:&quot;armadilhas-comuns-no-uso-de-event-groups&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Queues e Message Passing em Arquiteturas Orientadas a Eventos&quot;,&quot;text&quot;:&quot;Queues e Message Passing em Arquiteturas Orientadas a Eventos&quot;,&quot;link&quot;:&quot;queues-e-message-passing-em-arquiteturas-orientadas-a-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo conceitual de filas orientadas a eventos&quot;,&quot;text&quot;:&quot;Modelo conceitual de filas orientadas a eventos&quot;,&quot;link&quot;:&quot;modelo-conceitual-de-filas-orientadas-a-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 1 \u2014 Evento com payload (ISR \u2192 Task)&quot;,&quot;text&quot;:&quot;Exemplo 1 \u2014 Evento com payload (ISR \u2192 Task)&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 2 \u2014 Fila como buffer de desacoplamento&quot;,&quot;text&quot;:&quot;Exemplo 2 \u2014 Fila como buffer de desacoplamento&quot;,&quot;link&quot;:&quot;exemplo-2-fila-como-buffer-de-desacoplamento&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Uso combinado: Queue + Task Notification&quot;,&quot;text&quot;:&quot;Uso combinado: Queue + Task Notification&quot;,&quot;link&quot;:&quot;uso-combinado-queue-task-notification&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Implica\u00e7\u00f5es de projeto e dimensionamento&quot;,&quot;text&quot;:&quot;Implica\u00e7\u00f5es de projeto e dimensionamento&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Stream Buffers e Message Buffers para Fluxos de Eventos&quot;,&quot;text&quot;:&quot;Stream Buffers e Message Buffers para Fluxos de Eventos&quot;,&quot;link&quot;:&quot;stream-buffers-e-message-buffers-para-fluxos-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Stream Buffers \u2014 Eventos como fluxo cont\u00ednuo&quot;,&quot;text&quot;:&quot;Stream Buffers \u2014 Eventos como fluxo cont\u00ednuo&quot;,&quot;link&quot;:&quot;eb-table-content-25&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 1 \u2014 Stream Buffer com UART&quot;,&quot;text&quot;:&quot;Exemplo 1 \u2014 Stream Buffer com UART&quot;,&quot;link&quot;:&quot;exemplo-1-stream-buffer-com-uart&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Thresholds e controle de lat\u00eancia&quot;,&quot;text&quot;:&quot;Thresholds e controle de lat\u00eancia&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Message Buffers \u2014 Eventos com mensagens vari\u00e1veis&quot;,&quot;text&quot;:&quot;Message Buffers \u2014 Eventos com mensagens vari\u00e1veis&quot;,&quot;link&quot;:&quot;eb-table-content-28&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 2 \u2014 Message Buffer para comandos&quot;,&quot;text&quot;:&quot;Exemplo 2 \u2014 Message Buffer para comandos&quot;,&quot;link&quot;:&quot;exemplo-2-message-buffer-para-comandos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o arquitetural&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o arquitetural&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Armadilhas comuns&quot;,&quot;text&quot;:&quot;Armadilhas comuns&quot;,&quot;link&quot;:&quot;armadilhas-comuns&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Software Timers como Geradores de Eventos Temporais&quot;,&quot;text&quot;:&quot;Software Timers como Geradores de Eventos Temporais&quot;,&quot;link&quot;:&quot;software-timers-como-geradores-de-eventos-temporais&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Modelo conceitual correto para Software Timers&quot;,&quot;text&quot;:&quot;Modelo conceitual correto para Software Timers&quot;,&quot;link&quot;:&quot;modelo-conceitual-correto-para-software-timers&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 1 \u2014 Timer gerando evento simples&quot;,&quot;text&quot;:&quot;Exemplo 1 \u2014 Timer gerando evento simples&quot;,&quot;link&quot;:&quot;exemplo-1-timer-gerando-evento-simples&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 2 \u2014 Timer peri\u00f3dico como evento de sistema&quot;,&quot;text&quot;:&quot;Exemplo 2 \u2014 Timer peri\u00f3dico como evento de sistema&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo 3 \u2014 Timer como agendador leve de eventos&quot;,&quot;text&quot;:&quot;Exemplo 3 \u2014 Timer como agendador leve de eventos&quot;,&quot;link&quot;:&quot;exemplo-3-timer-como-agendador-leve-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Prioridade da Timer Service Task&quot;,&quot;text&quot;:&quot;Prioridade da Timer Service Task&quot;,&quot;link&quot;:&quot;prioridade-da-timer-service-task&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Integra\u00e7\u00e3o com arquiteturas orientadas a eventos&quot;,&quot;text&quot;:&quot;Integra\u00e7\u00e3o com arquiteturas orientadas a eventos&quot;,&quot;link&quot;:&quot;eb-table-content-38&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Composi\u00e7\u00e3o Arquitetural de Eventos no FreeRTOS&quot;,&quot;text&quot;:&quot;Composi\u00e7\u00e3o Arquitetural de Eventos no FreeRTOS&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00e3o 1 \u2014 ISR m\u00ednima + Evento Direcionado&quot;,&quot;text&quot;:&quot;Padr\u00e3o 1 \u2014 ISR m\u00ednima + Evento Direcionado&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00e3o 2 \u2014 Evento acorda, fila transporta&quot;,&quot;text&quot;:&quot;Padr\u00e3o 2 \u2014 Evento acorda, fila transporta&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00e3o 3 \u2014 Event Group como estado global, n\u00e3o evento&quot;,&quot;text&quot;:&quot;Padr\u00e3o 3 \u2014 Event Group como estado global, n\u00e3o evento&quot;,&quot;link&quot;:&quot;eb-table-content-42&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00e3o 4 \u2014 Timer \u2192 Evento \u2192 Task&quot;,&quot;text&quot;:&quot;Padr\u00e3o 4 \u2014 Timer \u2192 Evento \u2192 Task&quot;,&quot;link&quot;:&quot;eb-table-content-43&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00e3o 5 \u2014 M\u00e1quina de estados orientada a eventos&quot;,&quot;text&quot;:&quot;Padr\u00e3o 5 \u2014 M\u00e1quina de estados orientada a eventos&quot;,&quot;link&quot;:&quot;eb-table-content-44&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Princ\u00edpios arquiteturais que emergem&quot;,&quot;text&quot;:&quot;Princ\u00edpios arquiteturais que emergem&quot;,&quot;link&quot;:&quot;eb-table-content-45&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erros Arquiteturais Comuns e Como Evit\u00e1-los&quot;,&quot;text&quot;:&quot;Erros Arquiteturais Comuns e Como Evit\u00e1-los&quot;,&quot;link&quot;:&quot;eb-table-content-46&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 1 \u2014 Polling disfar\u00e7ado de arquitetura orientada a eventos&quot;,&quot;text&quot;:&quot;Erro 1 \u2014 Polling disfar\u00e7ado de arquitetura orientada a eventos&quot;,&quot;link&quot;:&quot;eb-table-content-47&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 2 \u2014 L\u00f3gica pesada dentro de ISRs&quot;,&quot;text&quot;:&quot;Erro 2 \u2014 L\u00f3gica pesada dentro de ISRs&quot;,&quot;link&quot;:&quot;eb-table-content-48&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 3 \u2014 Uso excessivo de Event Groups como fila de eventos&quot;,&quot;text&quot;:&quot;Erro 3 \u2014 Uso excessivo de Event Groups como fila de eventos&quot;,&quot;link&quot;:&quot;erro-3-uso-excessivo-de-event-groups-como-fila-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 4 \u2014 Fila gen\u00e9rica para tudo&quot;,&quot;text&quot;:&quot;Erro 4 \u2014 Fila gen\u00e9rica para tudo&quot;,&quot;link&quot;:&quot;eb-table-content-50&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 5 \u2014 Tasks que nunca bloqueiam&quot;,&quot;text&quot;:&quot;Erro 5 \u2014 Tasks que nunca bloqueiam&quot;,&quot;link&quot;:&quot;erro-5-tasks-que-nunca-bloqueiam&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 6 \u2014 Misturar estado e evento&quot;,&quot;text&quot;:&quot;Erro 6 \u2014 Misturar estado e evento&quot;,&quot;link&quot;:&quot;erro-6-misturar-estado-e-evento&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Erro 7 \u2014 Overengineering de eventos&quot;,&quot;text&quot;:&quot;Erro 7 \u2014 Overengineering de eventos&quot;,&quot;link&quot;:&quot;erro-7-overengineering-de-eventos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Checklist arquitetural pr\u00e1tico&quot;,&quot;text&quot;:&quot;Checklist arquitetural pr\u00e1tico&quot;,&quot;link&quot;:&quot;eb-table-content-54&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Conclus\u00e3o T\u00e9cnica, Boas Pr\u00e1ticas e Impacto no Projeto&quot;,&quot;text&quot;:&quot;Conclus\u00e3o T\u00e9cnica, Boas Pr\u00e1ticas e Impacto no Projeto&quot;,&quot;link&quot;:&quot;eb-table-content-55&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boas pr\u00e1ticas consolidadas&quot;,&quot;text&quot;:&quot;Boas pr\u00e1ticas consolidadas&quot;,&quot;link&quot;:&quot;eb-table-content-56&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Arquitetura orientada a eventos como base para escalabilidade&quot;,&quot;text&quot;:&quot;Arquitetura orientada a eventos como base para escalabilidade&quot;,&quot;link&quot;:&quot;arquitetura-orientada-a-eventos-como-base-para-escalabilidade&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Introdu\u00e7\u00e3o e Motiva\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;introdu\u00e7\u00e3o-e-motiva\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que vem a seguir&quot;,&quot;value&quot;:&quot;o-que-vem-a-seguir&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo Conceitual da Arquitetura Orientada a Eventos&quot;,&quot;value&quot;:&quot;modelo-conceitual-da-arquitetura-orientada-a-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Fluxo t\u00edpico de eventos no FreeRTOS&quot;,&quot;value&quot;:&quot;fluxo-t\u00edpico-de-eventos-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo conceitual simplificado&quot;,&quot;value&quot;:&quot;exemplo-conceitual-simplificado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implica\u00e7\u00f5es arquiteturais importantes&quot;,&quot;value&quot;:&quot;implica\u00e7\u00f5es-arquiteturais-importantes&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Task Notifications como Mecanismo Central de Eventos&quot;,&quot;value&quot;:&quot;task-notifications-como-mecanismo-central-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo mental correto para Task Notifications&quot;,&quot;value&quot;:&quot;modelo-mental-correto-para-task-notifications&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 1 \u2014 Evento simples (sinaliza\u00e7\u00e3o pura)&quot;,&quot;value&quot;:&quot;exemplo-1-evento-simples-sinaliza\u00e7\u00e3o-pura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 2 \u2014 Contador de eventos acumulados&quot;,&quot;value&quot;:&quot;exemplo-2-contador-de-eventos-acumulados&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 3 \u2014 Task Notification como bitmap de eventos&quot;,&quot;value&quot;:&quot;exemplo-3-task-notification-como-bitmap-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Vantagens arquiteturais das Task Notifications&quot;,&quot;value&quot;:&quot;vantagens-arquiteturais-das-task-notifications&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Event Groups: Coordena\u00e7\u00e3o de M\u00faltiplos Eventos&quot;,&quot;value&quot;:&quot;event-groups-coordena\u00e7\u00e3o-de-m\u00faltiplos-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo de uso correto para Event Groups&quot;,&quot;value&quot;:&quot;modelo-de-uso-correto-para-event-groups&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 1 \u2014 Aguardando m\u00faltiplos eventos simult\u00e2neos&quot;,&quot;value&quot;:&quot;exemplo-1-aguardando-m\u00faltiplos-eventos-simult\u00e2neos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 2 \u2014 Sinaliza\u00e7\u00e3o parcial e limpeza autom\u00e1tica&quot;,&quot;value&quot;:&quot;exemplo-2-sinaliza\u00e7\u00e3o-parcial-e-limpeza-autom\u00e1tica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Uso em ISRs&quot;,&quot;value&quot;:&quot;uso-em-isrs&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Armadilhas comuns no uso de Event Groups&quot;,&quot;value&quot;:&quot;armadilhas-comuns-no-uso-de-event-groups&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Queues e Message Passing em Arquiteturas Orientadas a Eventos&quot;,&quot;value&quot;:&quot;queues-e-message-passing-em-arquiteturas-orientadas-a-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo conceitual de filas orientadas a eventos&quot;,&quot;value&quot;:&quot;modelo-conceitual-de-filas-orientadas-a-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 1 \u2014 Evento com payload (ISR \u2192 Task)&quot;,&quot;value&quot;:&quot;exemplo-1-evento-com-payload-isr-\u2192-task&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 2 \u2014 Fila como buffer de desacoplamento&quot;,&quot;value&quot;:&quot;exemplo-2-fila-como-buffer-de-desacoplamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Uso combinado: Queue + Task Notification&quot;,&quot;value&quot;:&quot;uso-combinado-queue-task-notification&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Implica\u00e7\u00f5es de projeto e dimensionamento&quot;,&quot;value&quot;:&quot;implica\u00e7\u00f5es-de-projeto-e-dimensionamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Stream Buffers e Message Buffers para Fluxos de Eventos&quot;,&quot;value&quot;:&quot;stream-buffers-e-message-buffers-para-fluxos-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Stream Buffers \u2014 Eventos como fluxo cont\u00ednuo&quot;,&quot;value&quot;:&quot;stream-buffers-eventos-como-fluxo-cont\u00ednuo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 1 \u2014 Stream Buffer com UART&quot;,&quot;value&quot;:&quot;exemplo-1-stream-buffer-com-uart&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Thresholds e controle de lat\u00eancia&quot;,&quot;value&quot;:&quot;thresholds-e-controle-de-lat\u00eancia&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Message Buffers \u2014 Eventos com mensagens vari\u00e1veis&quot;,&quot;value&quot;:&quot;message-buffers-eventos-com-mensagens-vari\u00e1veis&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 2 \u2014 Message Buffer para comandos&quot;,&quot;value&quot;:&quot;exemplo-2-message-buffer-para-comandos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o arquitetural&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-arquitetural&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Armadilhas comuns&quot;,&quot;value&quot;:&quot;armadilhas-comuns&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Software Timers como Geradores de Eventos Temporais&quot;,&quot;value&quot;:&quot;software-timers-como-geradores-de-eventos-temporais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Modelo conceitual correto para Software Timers&quot;,&quot;value&quot;:&quot;modelo-conceitual-correto-para-software-timers&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 1 \u2014 Timer gerando evento simples&quot;,&quot;value&quot;:&quot;exemplo-1-timer-gerando-evento-simples&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 2 \u2014 Timer peri\u00f3dico como evento de sistema&quot;,&quot;value&quot;:&quot;exemplo-2-timer-peri\u00f3dico-como-evento-de-sistema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo 3 \u2014 Timer como agendador leve de eventos&quot;,&quot;value&quot;:&quot;exemplo-3-timer-como-agendador-leve-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Prioridade da Timer Service Task&quot;,&quot;value&quot;:&quot;prioridade-da-timer-service-task&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Integra\u00e7\u00e3o com arquiteturas orientadas a eventos&quot;,&quot;value&quot;:&quot;integra\u00e7\u00e3o-com-arquiteturas-orientadas-a-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Composi\u00e7\u00e3o Arquitetural de Eventos no FreeRTOS&quot;,&quot;value&quot;:&quot;composi\u00e7\u00e3o-arquitetural-de-eventos-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00e3o 1 \u2014 ISR m\u00ednima + Evento Direcionado&quot;,&quot;value&quot;:&quot;padr\u00e3o-1-isr-m\u00ednima-evento-direcionado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00e3o 2 \u2014 Evento acorda, fila transporta&quot;,&quot;value&quot;:&quot;padr\u00e3o-2-evento-acorda-fila-transporta&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00e3o 3 \u2014 Event Group como estado global, n\u00e3o evento&quot;,&quot;value&quot;:&quot;padr\u00e3o-3-event-group-como-estado-global-n\u00e3o-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00e3o 4 \u2014 Timer \u2192 Evento \u2192 Task&quot;,&quot;value&quot;:&quot;padr\u00e3o-4-timer-\u2192-evento-\u2192-task&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00e3o 5 \u2014 M\u00e1quina de estados orientada a eventos&quot;,&quot;value&quot;:&quot;padr\u00e3o-5-m\u00e1quina-de-estados-orientada-a-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Princ\u00edpios arquiteturais que emergem&quot;,&quot;value&quot;:&quot;princ\u00edpios-arquiteturais-que-emergem&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erros Arquiteturais Comuns e Como Evit\u00e1-los&quot;,&quot;value&quot;:&quot;erros-arquiteturais-comuns-e-como-evit\u00e1-los&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 1 \u2014 Polling disfar\u00e7ado de arquitetura orientada a eventos&quot;,&quot;value&quot;:&quot;erro-1-polling-disfar\u00e7ado-de-arquitetura-orientada-a-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 2 \u2014 L\u00f3gica pesada dentro de ISRs&quot;,&quot;value&quot;:&quot;erro-2-l\u00f3gica-pesada-dentro-de-isrs&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 3 \u2014 Uso excessivo de Event Groups como fila de eventos&quot;,&quot;value&quot;:&quot;erro-3-uso-excessivo-de-event-groups-como-fila-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 4 \u2014 Fila gen\u00e9rica para tudo&quot;,&quot;value&quot;:&quot;erro-4-fila-gen\u00e9rica-para-tudo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 5 \u2014 Tasks que nunca bloqueiam&quot;,&quot;value&quot;:&quot;erro-5-tasks-que-nunca-bloqueiam&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 6 \u2014 Misturar estado e evento&quot;,&quot;value&quot;:&quot;erro-6-misturar-estado-e-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Erro 7 \u2014 Overengineering de eventos&quot;,&quot;value&quot;:&quot;erro-7-overengineering-de-eventos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Checklist arquitetural pr\u00e1tico&quot;,&quot;value&quot;:&quot;checklist-arquitetural-pr\u00e1tico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Conclus\u00e3o T\u00e9cnica, Boas Pr\u00e1ticas e Impacto no Projeto&quot;,&quot;value&quot;:&quot;conclus\u00e3o-t\u00e9cnica-boas-pr\u00e1ticas-e-impacto-no-projeto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas pr\u00e1ticas consolidadas&quot;,&quot;value&quot;:&quot;boas-pr\u00e1ticas-consolidadas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arquitetura orientada a eventos como base para escalabilidade&quot;,&quot;value&quot;:&quot;arquitetura-orientada-a-eventos-como-base-para-escalabilidade&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 e Motivação</a><li><a href="#o-que-vem-a-seguir">O que vem a seguir</a><li><a href="#modelo-conceitual-da-arquitetura-orientada-a-eventos">Modelo Conceitual da Arquitetura Orientada a Eventos</a><li><a href="#eb-table-content-3">Fluxo típico de eventos no FreeRTOS</a><li><a href="#exemplo-conceitual-simplificado">Exemplo conceitual simplificado</a><li><a href="#eb-table-content-5">Implicações arquiteturais importantes</a><li><a href="#task-notifications-como-mecanismo-central-de-eventos">Task Notifications como Mecanismo Central de Eventos</a><li><a href="#modelo-mental-correto-para-task-notifications">Modelo mental correto para Task Notifications</a><li><a href="#eb-table-content-8">Exemplo 1 — Evento simples (sinalização pura)</a><li><a href="#exemplo-2-contador-de-eventos-acumulados">Exemplo 2 — Contador de eventos acumulados</a><li><a href="#exemplo-3-task-notification-como-bitmap-de-eventos">Exemplo 3 — Task Notification como bitmap de eventos</a><li><a href="#vantagens-arquiteturais-das-task-notifications">Vantagens arquiteturais das Task Notifications</a><li><a href="#eb-table-content-12">Event Groups: Coordenação de Múltiplos Eventos</a><li><a href="#modelo-de-uso-correto-para-event-groups">Modelo de uso correto para Event Groups</a><li><a href="#eb-table-content-14">Exemplo 1 — Aguardando múltiplos eventos simultâneos</a><li><a href="#eb-table-content-15">Exemplo 2 — Sinalização parcial e limpeza automática</a><li><a href="#uso-em-isrs">Uso em ISRs</a><li><a href="#armadilhas-comuns-no-uso-de-event-groups">Armadilhas comuns no uso de Event Groups</a><li><a href="#queues-e-message-passing-em-arquiteturas-orientadas-a-eventos">Queues e Message Passing em Arquiteturas Orientadas a Eventos</a><li><a href="#modelo-conceitual-de-filas-orientadas-a-eventos">Modelo conceitual de filas orientadas a eventos</a><li><a href="#eb-table-content-20">Exemplo 1 — Evento com payload (ISR → Task)</a><li><a href="#exemplo-2-fila-como-buffer-de-desacoplamento">Exemplo 2 — Fila como buffer de desacoplamento</a><li><a href="#uso-combinado-queue-task-notification">Uso combinado: Queue + Task Notification</a><li><a href="#eb-table-content-23">Implicações de projeto e dimensionamento</a><li><a href="#stream-buffers-e-message-buffers-para-fluxos-de-eventos">Stream Buffers e Message Buffers para Fluxos de Eventos</a><li><a href="#eb-table-content-25">Stream Buffers — Eventos como fluxo contínuo</a><li><a href="#exemplo-1-stream-buffer-com-uart">Exemplo 1 — Stream Buffer com UART</a><li><a href="#eb-table-content-27">Thresholds e controle de latência</a><li><a href="#eb-table-content-28">Message Buffers — Eventos com mensagens variáveis</a><li><a href="#exemplo-2-message-buffer-para-comandos">Exemplo 2 — Message Buffer para comandos</a><li><a href="#eb-table-content-30">Comparação arquitetural</a><li><a href="#armadilhas-comuns">Armadilhas comuns</a><li><a href="#software-timers-como-geradores-de-eventos-temporais">Software Timers como Geradores de Eventos Temporais</a><li><a href="#modelo-conceitual-correto-para-software-timers">Modelo conceitual correto para Software Timers</a><li><a href="#exemplo-1-timer-gerando-evento-simples">Exemplo 1 — Timer gerando evento simples</a><li><a href="#eb-table-content-35">Exemplo 2 — Timer periódico como evento de sistema</a><li><a href="#exemplo-3-timer-como-agendador-leve-de-eventos">Exemplo 3 — Timer como agendador leve de eventos</a><li><a href="#prioridade-da-timer-service-task">Prioridade da Timer Service Task</a><li><a href="#eb-table-content-38">Integração com arquiteturas orientadas a eventos</a><li><a href="#eb-table-content-39">Composição Arquitetural de Eventos no FreeRTOS</a><li><a href="#eb-table-content-40">Padrão 1 — ISR mínima + Evento Direcionado</a><li><a href="#eb-table-content-41">Padrão 2 — Evento acorda, fila transporta</a><li><a href="#eb-table-content-42">Padrão 3 — Event Group como estado global, não evento</a><li><a href="#eb-table-content-43">Padrão 4 — Timer → Evento → Task</a><li><a href="#eb-table-content-44">Padrão 5 — Máquina de estados orientada a eventos</a><li><a href="#eb-table-content-45">Princípios arquiteturais que emergem</a><li><a href="#eb-table-content-46">Erros Arquiteturais Comuns e Como Evitá-los</a><li><a href="#eb-table-content-47">Erro 1 — Polling disfarçado de arquitetura orientada a eventos</a><li><a href="#eb-table-content-48">Erro 2 — Lógica pesada dentro de ISRs</a><li><a href="#erro-3-uso-excessivo-de-event-groups-como-fila-de-eventos">Erro 3 — Uso excessivo de Event Groups como fila de eventos</a><li><a href="#eb-table-content-50">Erro 4 — Fila genérica para tudo</a><li><a href="#erro-5-tasks-que-nunca-bloqueiam">Erro 5 — Tasks que nunca bloqueiam</a><li><a href="#erro-6-misturar-estado-e-evento">Erro 6 — Misturar estado e evento</a><li><a href="#erro-7-overengineering-de-eventos">Erro 7 — Overengineering de eventos</a><li><a href="#eb-table-content-54">Checklist arquitetural prático</a><li><a href="#eb-table-content-55">Conclusão Técnica, Boas Práticas e Impacto no Projeto</a><li><a href="#eb-table-content-56">Boas práticas consolidadas</a><li><a href="#arquitetura-orientada-a-eventos-como-base-para-escalabilidade">Arquitetura orientada a eventos como base para escalabilidade</a></ul></div></div></div></div></div>


<h3 class="wp-block-heading"><strong>Introdução e Motivação</strong></h3>



<p class="wp-block-paragraph">Em sistemas embarcados modernos, especialmente aqueles baseados em <strong>FreeRTOS</strong>, a forma como o firmware reage ao mundo externo é tão importante quanto o código em si. Sensores, comunicação, interrupções, timers e pilhas de protocolo geram estímulos de forma assíncrona, e arquiteturas tradicionais baseadas apenas em <em>superloop</em> rapidamente se tornam difíceis de manter, escalar e depurar. É nesse contexto que surge a <strong>Arquitetura Orientada a Eventos (Event-Driven Architecture – EDA)</strong>.</p>



<p class="wp-block-paragraph">No FreeRTOS, uma arquitetura orientada a eventos não é um “modo especial” do sistema operacional, mas sim uma <strong>estratégia de organização do firmware</strong>, onde tarefas permanecem bloqueadas aguardando eventos específicos e acordam apenas quando algo relevante ocorre. Esses eventos podem ser sinais de interrupção, mensagens, flags, notificações, timers ou dados disponíveis em buffers. O resultado é um sistema <strong>reativo, determinístico e eficiente em consumo de CPU</strong>.</p>



<p class="wp-block-paragraph">Do ponto de vista de engenharia, essa abordagem resolve três problemas clássicos:</p>



<ol class="wp-block-list">
<li><strong>Desperdício de CPU</strong> causado por polling constante</li>



<li><strong>Acoplamento excessivo</strong> entre módulos</li>



<li><strong>Dificuldade de sincronização</strong> entre múltiplas fontes de eventos</li>
</ol>



<p class="wp-block-paragraph">Ao adotar uma arquitetura orientada a eventos, o firmware passa a se comportar como um <strong>conjunto de agentes cooperativos</strong>, cada tarefa com responsabilidade clara, reagindo apenas aos eventos que lhe dizem respeito. Isso melhora a legibilidade do código, reduz latência média de resposta e facilita testes unitários e manutenção evolutiva.</p>



<p class="wp-block-paragraph">No FreeRTOS, essa arquitetura é viabilizada por um conjunto muito poderoso de primitivas nativas: <strong>Task Notifications</strong>, <strong>Queues</strong>, <strong>Event Groups</strong>, <strong>Stream Buffers</strong>, <strong>Message Buffers</strong> e <strong>Software Timers</strong>. Cada uma delas atende a um tipo específico de evento e será explorada detalhadamente ao longo deste artigo, sempre com exemplos práticos e contextualizados.</p>



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



<h3 class="wp-block-heading"><strong>O que vem a seguir</strong></h3>



<p class="wp-block-paragraph">Na próxima seção, entraremos no <strong>modelo conceitual da Arquitetura Orientada a Eventos no FreeRTOS</strong>, explicando como eventos fluem pelo sistema, como tarefas devem ser estruturadas e como evitar armadilhas comuns, como <em>event storms</em>, inversão de prioridade e acoplamento indireto.</p>



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



<h3 class="wp-block-heading"><strong>Modelo Conceitual da Arquitetura Orientada a Eventos</strong></h3>



<p class="wp-block-paragraph">Em uma arquitetura orientada a eventos no FreeRTOS, o sistema deixa de ser centrado em fluxo sequencial de execução e passa a ser organizado em torno de <strong>eventos que representam fatos relevantes do sistema</strong>. Um evento pode significar “um dado chegou”, “um tempo expirou”, “um periférico terminou uma operação” ou “uma condição de estado foi satisfeita”. O papel central do RTOS é <strong>suspender tarefas até que esses eventos ocorram</strong>, garantindo previsibilidade temporal e uso eficiente do processador.</p>



<p class="wp-block-paragraph">Do ponto de vista conceitual, essa arquitetura pode ser dividida em três elementos fundamentais: <strong>produtores de eventos</strong>, <strong>mecanismos de transporte de eventos</strong> e <strong>consumidores de eventos</strong>. Produtores normalmente são ISRs, timers de software, drivers ou tarefas de baixo nível. O transporte é feito pelas primitivas do FreeRTOS, enquanto os consumidores são tarefas que encapsulam lógica de negócio ou processamento de dados. Esse desacoplamento é essencial para sistemas escaláveis.</p>



<p class="wp-block-paragraph">Um princípio importante é que <strong>tarefas orientadas a eventos devem permanecer bloqueadas na maior parte do tempo</strong>. Em FreeRTOS, isso significa usar chamadas bloqueantes como <code>xQueueReceive()</code>, <code>xEventGroupWaitBits()</code> ou <code>ulTaskNotifyTake()</code>, sempre com <code>portMAX_DELAY</code> ou tempos bem definidos. Dessa forma, não há polling ativo, e o escalonador pode dedicar CPU apenas às tarefas que realmente precisam executar naquele instante.</p>



<p class="wp-block-paragraph">Outro ponto crítico do modelo é que <strong>eventos não devem carregar lógica</strong>, apenas sinalização e dados mínimos. A decisão do que fazer em resposta a um evento pertence à tarefa consumidora. Isso evita que ISRs fiquem complexas e garante que decisões de alto nível ocorram sempre em contexto de tarefa, onde mutexes, alocação de memória e chamadas de API são seguras.</p>



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



<h3 class="wp-block-heading"><strong>Fluxo típico de eventos no FreeRTOS</strong></h3>



<p class="wp-block-paragraph">Um fluxo clássico em arquitetura orientada a eventos segue o seguinte encadeamento lógico:</p>



<ol class="wp-block-list">
<li>Um periférico gera uma interrupção (por exemplo, UART RX completa).</li>



<li>A ISR sinaliza o evento usando uma primitiva segura para interrupções.</li>



<li>O kernel do FreeRTOS desbloqueia a tarefa interessada.</li>



<li>A tarefa acorda, processa o evento e retorna ao estado bloqueado.</li>
</ol>



<p class="wp-block-paragraph">Esse modelo cria um sistema <strong>reativo e previsível</strong>, onde a latência entre o evento e o processamento é controlada diretamente pela prioridade da tarefa e pela duração das ISRs. Em projetos bem arquitetados, o tempo gasto dentro da interrupção é mínimo, e todo o processamento ocorre em nível de tarefa.</p>



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



<h3 class="wp-block-heading"><strong>Exemplo conceitual simplificado</strong></h3>



<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 vUartTask(void *pvParameters)
{
    uint8_t rxByte;

    for (;;)
    {
        if (xQueueReceive(uartRxQueue, &amp;rxByte, portMAX_DELAY) == pdPASS)
        {
            processUartByte(rxByte);
        }
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vUartTask</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rxByte</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">;;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #88C0D0">xQueueReceive</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">uartRxQueue</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">rxByte</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">portMAX_DELAY</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pdPASS</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">processUartByte</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">rxByte</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Neste exemplo, a tarefa <code>vUartTask</code> não executa continuamente. Ela permanece bloqueada até que um byte seja colocado na fila por uma ISR ou outra tarefa. Isso caracteriza perfeitamente o modelo orientado a eventos: <strong>o evento é a chegada de um dado</strong>, e a tarefa existe apenas para reagir a ele.</p>



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



<h3 class="wp-block-heading"><strong>Implicações arquiteturais importantes</strong></h3>



<p class="wp-block-paragraph">Ao adotar esse modelo, algumas decisões de projeto tornam-se fundamentais. A granularidade dos eventos deve ser cuidadosamente escolhida: eventos muito genéricos levam a tarefas complexas e difíceis de testar; eventos excessivamente específicos geram sobrecarga e fragmentação. Além disso, o uso correto de prioridades é crucial para garantir que eventos críticos sejam tratados com menor latência.</p>



<p class="wp-block-paragraph">Outro aspecto frequentemente negligenciado é o tratamento de <strong>eventos concorrentes</strong>. O FreeRTOS permite que múltiplos eventos acordem a mesma tarefa, mas o firmware deve ser capaz de lidar com isso de forma determinística, normalmente utilizando estruturas de estado bem definidas ou <em>state machines</em> orientadas a eventos.</p>



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



<p class="wp-block-paragraph">Na <strong>próxima seção</strong>, entraremos nos <strong>mecanismos de eventos disponíveis no FreeRTOS</strong>, começando pelo mais eficiente e subutilizado deles: <strong>Task Notifications</strong>, analisando seu funcionamento interno, vantagens, limitações e padrões de uso.</p>



<p class="wp-block-paragraph">Excelente, seguimos.</p>



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



<h3 class="wp-block-heading"><strong>Task Notifications como Mecanismo Central de Eventos</strong></h3>



<p class="wp-block-paragraph">Entre todos os mecanismos oferecidos pelo FreeRTOS, as <strong>Task Notifications</strong> são, do ponto de vista arquitetural, a forma mais eficiente de implementar uma arquitetura orientada a eventos. Elas funcionam como um <strong>canal direto ponto-a-ponto entre o kernel e uma tarefa</strong>, sem a sobrecarga de filas, sem alocação dinâmica e com latência mínima.</p>



<p class="wp-block-paragraph">Cada tarefa no FreeRTOS possui internamente um <strong>array de notificações</strong> (desde o FreeRTOS 10), onde cada entrada contém um valor de 32 bits e um estado. Isso transforma a task notification em algo conceitualmente próximo a um <strong>registrador de eventos privado da tarefa</strong>. Esse detalhe é fundamental para entender por que esse mecanismo é tão eficiente e, ao mesmo tempo, tão poderoso.</p>



<p class="wp-block-paragraph">Diferente de filas ou event groups, <strong>uma task notification não é compartilhada</strong>. Ela pertence a uma única tarefa. Isso força uma arquitetura mais limpa, onde existe um mapeamento explícito entre <em>quem produz</em> e <em>quem consome</em> o evento. Em arquiteturas bem desenhadas, isso reduz drasticamente o acoplamento implícito e elimina ambiguidades.</p>



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



<h3 class="wp-block-heading"><strong>Modelo mental correto para Task Notifications</strong></h3>



<p class="wp-block-paragraph">É comum iniciantes tratarem task notifications como “um semáforo mais rápido”. Embora isso seja parcialmente verdadeiro, essa visão é limitada. O modelo correto é pensar nelas como:</p>



<ul class="wp-block-list">
<li>Um <strong>evento binário</strong> (acordar ou não acordar a task)</li>



<li>Um <strong>contador</strong> (quantidade de eventos acumulados)</li>



<li>Um <strong>bitmap de flags</strong></li>



<li>Um <strong>payload de 32 bits</strong></li>
</ul>



<p class="wp-block-paragraph">Tudo isso usando a <strong>mesma infraestrutura</strong>, dependendo apenas da API utilizada.</p>



<p class="wp-block-paragraph">Essa flexibilidade permite criar arquiteturas orientadas a eventos extremamente compactas, onde um único mecanismo substitui filas, semáforos e flags em muitos cenários.</p>



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



<h3 class="wp-block-heading"><strong>Exemplo 1 — Evento simples (sinalização pura)</strong></h3>



<p class="wp-block-paragraph">Neste primeiro exemplo, uma ISR sinaliza que um evento ocorreu, e a tarefa apenas reage.</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 vEventTask(void *pvParameters)
{
    for (;;)
    {
        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);

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



<p class="wp-block-paragraph">A função <code>ulTaskNotifyTake()</code> bloqueia a tarefa até que uma notificação seja recebida. O parâmetro <code>pdTRUE</code> indica que o contador interno será limpo ao acordar, garantindo comportamento de evento simples.</p>



<p class="wp-block-paragraph">A ISR responsável pelo evento:</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 EXTI_IRQHandler(void)
{
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;

    vTaskNotifyGiveFromISR(eventTaskHandle, &amp;xHigherPriorityTaskWoken);

    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">EXTI_IRQHandler</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">BaseType_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xHigherPriorityTaskWoken</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pdFALSE</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskNotifyGiveFromISR</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">eventTaskHandle</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">xHigherPriorityTaskWoken</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">portYIELD_FROM_ISR</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">xHigherPriorityTaskWoken</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Aqui, o evento é produzido de forma segura em contexto de interrupção, e o kernel pode realizar <em>context switch</em> imediato se a prioridade justificar. Esse padrão é ideal para eventos como botão pressionado, fim de conversão ADC ou término de DMA.</p>



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



<h3 class="wp-block-heading"><strong>Exemplo 2 — Contador de eventos acumulados</strong></h3>



<p class="wp-block-paragraph">Em cenários onde múltiplos eventos podem ocorrer antes da tarefa acordar, a task notification pode atuar como <strong>contador</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 vLoggerTask(void *pvParameters)
{
    uint32_t events;

    for (;;)
    {
        events = ulTaskNotifyTake(pdFALSE, portMAX_DELAY);

        while (events--)
        {
            logEvent();
        }
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vLoggerTask</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">;;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">ulTaskNotifyTake</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">pdFALSE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">portMAX_DELAY</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">events</span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">logEvent</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Ao usar <code>pdFALSE</code>, o contador não é automaticamente zerado. O valor retornado indica quantos eventos ocorreram desde a última leitura. Isso é extremamente útil em sistemas com bursts de eventos, como recepção de pacotes ou amostras rápidas de sensores.</p>



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



<h3 class="wp-block-heading"><strong>Exemplo 3 — Task Notification como bitmap de eventos</strong></h3>



<p class="wp-block-paragraph">Outra aplicação avançada é usar o valor de 32 bits como <strong>mapa de bits de eventos</strong>, substituindo completamente os Event Groups quando o evento é destinado a uma única tarefa.</p>



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

void vCommTask(void *pvParameters)
{
    uint32_t events;

    for (;;)
    {
        xTaskNotifyWait(0x00, 0xFFFFFFFF, &amp;events, portMAX_DELAY);

        if (events &amp; EVT_RX_READY)
            handleRx();

        if (events &amp; EVT_TX_DONE)
            handleTxDone();

        if (events &amp; EVT_ERROR)
            handleError();
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">EVT_RX_READY</span><span style="color: #D8DEE9FF">   (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">EVT_TX_DONE</span><span style="color: #D8DEE9FF">   (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">EVT_ERROR</span><span style="color: #D8DEE9FF">     (</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vCommTask</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">events</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">;;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">xTaskNotifyWait</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">0x00</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0xFFFFFFFF</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">events</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">portMAX_DELAY</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">EVT_RX_READY</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">handleRx</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">EVT_TX_DONE</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">handleTxDone</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">events</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">EVT_ERROR</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">handleError</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse padrão cria uma <strong>máquina de eventos compacta</strong>, extremamente eficiente e fácil de analisar em termos de latência e consumo de recursos.</p>



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



<h3 class="wp-block-heading"><strong>Vantagens arquiteturais das Task Notifications</strong></h3>



<p class="wp-block-paragraph">Do ponto de vista de engenharia de sistemas, as task notifications oferecem:</p>



<ul class="wp-block-list">
<li>Menor latência entre evento e execução</li>



<li>Zero uso de heap</li>



<li>Menor footprint de memória</li>



<li>Determinismo temporal elevado</li>



<li>Código mais explícito e fácil de rastrear</li>
</ul>



<p class="wp-block-paragraph">Por esse motivo, em arquiteturas orientadas a eventos bem projetadas, <strong>task notifications devem ser a primeira opção</strong>, e não a última.</p>



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



<p class="wp-block-paragraph">Na <strong>próxima seção</strong>, vamos tratar de <strong>Event Groups</strong>, explicando quando eles são necessários, como evitá-los em excesso e como integrá-los corretamente em uma arquitetura orientada a eventos sem criar dependências implícitas.</p>



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



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/rtos/arquitetura-orientada-a-eventos-no-freertos/">Arquitetura Orientada a Eventos no FreeRTOS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1057</post-id>	</item>
		<item>
		<title>Como Criar Tarefas e Soft Timers no FreeRTOS: Guia Prático e Didático para Sistemas Embarcados</title>
		<link>https://mcu.tec.br/rtos/como-criar-tarefas-e-soft-timers-no-freertos-guia-pratico-e-didatico-para-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-criar-tarefas-e-soft-timers-no-freertos-guia-pratico-e-didatico-para-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 09 Jan 2026 18:45:24 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[arquitetura embarcada]]></category>
		<category><![CDATA[escalonador FreeRTOS]]></category>
		<category><![CDATA[event groups]]></category>
		<category><![CDATA[filas FreeRTOS]]></category>
		<category><![CDATA[freertos]]></category>
		<category><![CDATA[heap FreeRTOS]]></category>
		<category><![CDATA[prioridades de tarefas]]></category>
		<category><![CDATA[programação em tempo real]]></category>
		<category><![CDATA[RTOS embarcado]]></category>
		<category><![CDATA[soft timers FreeRTOS]]></category>
		<category><![CDATA[stack no FreeRTOS]]></category>
		<category><![CDATA[tarefas no FreeRTOS]]></category>
		<category><![CDATA[task notification]]></category>
		<category><![CDATA[Timer Service Task]]></category>
		<category><![CDATA[timers de software]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1016</guid>

					<description><![CDATA[<p>Este artigo apresenta um guia completo e didático sobre como criar e gerenciar tarefas e soft timers no FreeRTOS, explicando conceitos fundamentais de escalonamento, prioridades, dimensionamento de stack e comunicação entre timers e tarefas. Com exemplos práticos em C para microcontroladores, o conteúdo mostra como estruturar arquiteturas embarcadas reais, eficientes e escaláveis, utilizando boas práticas de projeto para evitar bloqueios, reduzir consumo de CPU e aumentar a previsibilidade temporal. Ideal para estudantes, desenvolvedores de firmware e profissionais que desejam dominar o uso do FreeRTOS em aplicações embarcadas modernas.</p>
<p>The post <a href="https://mcu.tec.br/rtos/como-criar-tarefas-e-soft-timers-no-freertos-guia-pratico-e-didatico-para-sistemas-embarcados/">Como Criar Tarefas e Soft Timers no FreeRTOS: Guia Prático e Didático para Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-8ti67 wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-8ti67 "><div class="eb-toc-container eb-toc-8ti67  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;Conceito de Tarefas no FreeRTOS e Estrutura B\u00e1sica&quot;,&quot;text&quot;:&quot;Conceito de Tarefas no FreeRTOS e Estrutura B\u00e1sica&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Assinatura de uma tarefa no FreeRTOS&quot;,&quot;text&quot;:&quot;Assinatura de uma tarefa no FreeRTOS&quot;,&quot;link&quot;:&quot;assinatura-de-uma-tarefa-no-freertos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Cria\u00e7\u00e3o de tarefas com xTaskCreate()&quot;,&quot;text&quot;:&quot;Cria\u00e7\u00e3o de tarefas com xTaskCreate()&quot;,&quot;link&quot;:&quot;eb-table-content-2&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo pr\u00e1tico: tarefa de LED&quot;,&quot;text&quot;:&quot;Exemplo pr\u00e1tico: tarefa de LED&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Estados de uma tarefa no FreeRTOS&quot;,&quot;text&quot;:&quot;Estados de uma tarefa no FreeRTOS&quot;,&quot;link&quot;:&quot;estados-de-uma-tarefa-no-freertos&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;2 \u2013 Prioridades, Stack e Boas Pr\u00e1ticas na Cria\u00e7\u00e3o de Tarefas&quot;,&quot;text&quot;:&quot;2 \u2013 Prioridades, Stack e Boas Pr\u00e1ticas na Cria\u00e7\u00e3o de Tarefas&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Prioridades de tarefas&quot;,&quot;text&quot;:&quot;Prioridades de tarefas&quot;,&quot;link&quot;:&quot;prioridades-de-tarefas&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Stack de tarefas: como dimensionar corretamente&quot;,&quot;text&quot;:&quot;Stack de tarefas: como dimensionar corretamente&quot;,&quot;link&quot;:&quot;stack-de-tarefas-como-dimensionar-corretamente&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Como estimar o tamanho da stack&quot;,&quot;text&quot;:&quot;Como estimar o tamanho da stack&quot;,&quot;link&quot;:&quot;como-estimar-o-tamanho-da-stack&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Stack overflow e mecanismos de prote\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Stack overflow e mecanismos de prote\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-9&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Heap e cria\u00e7\u00e3o din\u00e2mica de tarefas&quot;,&quot;text&quot;:&quot;Heap e cria\u00e7\u00e3o din\u00e2mica de tarefas&quot;,&quot;link&quot;:&quot;eb-table-content-10&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Boas pr\u00e1ticas fundamentais&quot;,&quot;text&quot;:&quot;Boas pr\u00e1ticas fundamentais&quot;,&quot;link&quot;:&quot;eb-table-content-11&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Soft Timers no FreeRTOS: Conceito, Arquitetura e Diferen\u00e7as para Tarefas&quot;,&quot;text&quot;:&quot;Soft Timers no FreeRTOS: Conceito, Arquitetura e Diferen\u00e7as para Tarefas&quot;,&quot;link&quot;:&quot;eb-table-content-12&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que \u00e9 um Soft Timer&quot;,&quot;text&quot;:&quot;O que \u00e9 um Soft Timer&quot;,&quot;link&quot;:&quot;eb-table-content-13&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Timer Service Task&quot;,&quot;text&quot;:&quot;Timer Service Task&quot;,&quot;link&quot;:&quot;timer-service-task&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Tipos de Soft Timers&quot;,&quot;text&quot;:&quot;Tipos de Soft Timers&quot;,&quot;link&quot;:&quot;tipos-de-soft-timers&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Cria\u00e7\u00e3o de um Soft Timer&quot;,&quot;text&quot;:&quot;Cria\u00e7\u00e3o de um Soft Timer&quot;,&quot;link&quot;:&quot;eb-table-content-16&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Exemplo pr\u00e1tico: Soft Timer peri\u00f3dico&quot;,&quot;text&quot;:&quot;Exemplo pr\u00e1tico: Soft Timer peri\u00f3dico&quot;,&quot;link&quot;:&quot;eb-table-content-17&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;O que N\u00c3O fazer em callbacks de Soft Timer&quot;,&quot;text&quot;:&quot;O que N\u00c3O fazer em callbacks de Soft Timer&quot;,&quot;link&quot;:&quot;eb-table-content-18&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o: Tarefa vs Soft Timer&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o: Tarefa vs Soft Timer&quot;,&quot;link&quot;:&quot;eb-table-content-19&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Comunica\u00e7\u00e3o entre Soft Timers e Tarefas no FreeRTOS&quot;,&quot;text&quot;:&quot;Comunica\u00e7\u00e3o entre Soft Timers e Tarefas no FreeRTOS&quot;,&quot;link&quot;:&quot;eb-table-content-20&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Comunica\u00e7\u00e3o usando Task Notifications&quot;,&quot;text&quot;:&quot;Comunica\u00e7\u00e3o usando Task Notifications&quot;,&quot;link&quot;:&quot;eb-table-content-21&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Callback do timer notificando uma tarefa&quot;,&quot;text&quot;:&quot;Callback do timer notificando uma tarefa&quot;,&quot;link&quot;:&quot;callback-do-timer-notificando-uma-tarefa&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Tarefa aguardando a notifica\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Tarefa aguardando a notifica\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-23&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Comunica\u00e7\u00e3o usando Filas (Queues)&quot;,&quot;text&quot;:&quot;Comunica\u00e7\u00e3o usando Filas (Queues)&quot;,&quot;link&quot;:&quot;eb-table-content-24&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Callback enviando dados para a fila&quot;,&quot;text&quot;:&quot;Callback enviando dados para a fila&quot;,&quot;link&quot;:&quot;callback-enviando-dados-para-a-fila&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Tarefa consumindo a fila&quot;,&quot;text&quot;:&quot;Tarefa consumindo a fila&quot;,&quot;link&quot;:&quot;tarefa-consumindo-a-fila&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Comunica\u00e7\u00e3o usando Event Groups&quot;,&quot;text&quot;:&quot;Comunica\u00e7\u00e3o usando Event Groups&quot;,&quot;link&quot;:&quot;eb-table-content-27&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Callback setando um evento&quot;,&quot;text&quot;:&quot;Callback setando um evento&quot;,&quot;link&quot;:&quot;callback-setando-um-evento&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Tarefa aguardando o evento&quot;,&quot;text&quot;:&quot;Tarefa aguardando o evento&quot;,&quot;link&quot;:&quot;tarefa-aguardando-o-evento&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Compara\u00e7\u00e3o entre mecanismos&quot;,&quot;text&quot;:&quot;Compara\u00e7\u00e3o entre mecanismos&quot;,&quot;link&quot;:&quot;eb-table-content-30&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Padr\u00e3o arquitetural recomendado&quot;,&quot;text&quot;:&quot;Padr\u00e3o arquitetural recomendado&quot;,&quot;link&quot;:&quot;eb-table-content-31&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;5 \u2013 Exemplo Completo: Arquitetura Real com Tarefas e Soft Timers no FreeRTOS&quot;,&quot;text&quot;:&quot;5 \u2013 Exemplo Completo: Arquitetura Real com Tarefas e Soft Timers no FreeRTOS&quot;,&quot;link&quot;:&quot;5-exemplo-completo-arquitetura-real-com-tarefas-e-soft-timers-no-freertos&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Cen\u00e1rio proposto&quot;,&quot;text&quot;:&quot;Cen\u00e1rio proposto&quot;,&quot;link&quot;:&quot;eb-table-content-33&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Diagrama l\u00f3gico da arquitetura&quot;,&quot;text&quot;:&quot;Diagrama l\u00f3gico da arquitetura&quot;,&quot;link&quot;:&quot;eb-table-content-34&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;C\u00f3digo completo do exemplo&quot;,&quot;text&quot;:&quot;C\u00f3digo completo do exemplo&quot;,&quot;link&quot;:&quot;eb-table-content-35&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Handles globais&quot;,&quot;text&quot;:&quot;Handles globais&quot;,&quot;link&quot;:&quot;handles-globais&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Callback do Soft Timer&quot;,&quot;text&quot;:&quot;Callback do Soft Timer&quot;,&quot;link&quot;:&quot;callback-do-soft-timer&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Tarefa de processamento&quot;,&quot;text&quot;:&quot;Tarefa de processamento&quot;,&quot;link&quot;:&quot;tarefa-de-processamento&quot;},{&quot;level&quot;:4,&quot;content&quot;:&quot;Inicializa\u00e7\u00e3o do sistema&quot;,&quot;text&quot;:&quot;Inicializa\u00e7\u00e3o do sistema&quot;,&quot;link&quot;:&quot;eb-table-content-39&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;An\u00e1lise t\u00e9cnica da solu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;An\u00e1lise t\u00e9cnica da solu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-40&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Quando N\u00c3O usar Soft Timers&quot;,&quot;text&quot;:&quot;Quando N\u00c3O usar Soft Timers&quot;,&quot;link&quot;:&quot;eb-table-content-41&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Conceito de Tarefas no FreeRTOS e Estrutura B\u00e1sica&quot;,&quot;value&quot;:&quot;conceito-de-tarefas-no-freertos-e-estrutura-b\u00e1sica&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Assinatura de uma tarefa no FreeRTOS&quot;,&quot;value&quot;:&quot;assinatura-de-uma-tarefa-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Cria\u00e7\u00e3o de tarefas com xTaskCreate()&quot;,&quot;value&quot;:&quot;cria\u00e7\u00e3o-de-tarefas-com-xtaskcreate&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo pr\u00e1tico: tarefa de LED&quot;,&quot;value&quot;:&quot;exemplo-pr\u00e1tico-tarefa-de-led&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Estados de uma tarefa no FreeRTOS&quot;,&quot;value&quot;:&quot;estados-de-uma-tarefa-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;2 \u2013 Prioridades, Stack e Boas Pr\u00e1ticas na Cria\u00e7\u00e3o de Tarefas&quot;,&quot;value&quot;:&quot;2-prioridades-stack-e-boas-pr\u00e1ticas-na-cria\u00e7\u00e3o-de-tarefas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Prioridades de tarefas&quot;,&quot;value&quot;:&quot;prioridades-de-tarefas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Stack de tarefas: como dimensionar corretamente&quot;,&quot;value&quot;:&quot;stack-de-tarefas-como-dimensionar-corretamente&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Como estimar o tamanho da stack&quot;,&quot;value&quot;:&quot;como-estimar-o-tamanho-da-stack&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Stack overflow e mecanismos de prote\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;stack-overflow-e-mecanismos-de-prote\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Heap e cria\u00e7\u00e3o din\u00e2mica de tarefas&quot;,&quot;value&quot;:&quot;heap-e-cria\u00e7\u00e3o-din\u00e2mica-de-tarefas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Boas pr\u00e1ticas fundamentais&quot;,&quot;value&quot;:&quot;boas-pr\u00e1ticas-fundamentais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Soft Timers no FreeRTOS: Conceito, Arquitetura e Diferen\u00e7as para Tarefas&quot;,&quot;value&quot;:&quot;soft-timers-no-freertos-conceito-arquitetura-e-diferen\u00e7as-para-tarefas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que \u00e9 um Soft Timer&quot;,&quot;value&quot;:&quot;o-que-\u00e9-um-soft-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Timer Service Task&quot;,&quot;value&quot;:&quot;timer-service-task&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tipos de Soft Timers&quot;,&quot;value&quot;:&quot;tipos-de-soft-timers&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Cria\u00e7\u00e3o de um Soft Timer&quot;,&quot;value&quot;:&quot;cria\u00e7\u00e3o-de-um-soft-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Exemplo pr\u00e1tico: Soft Timer peri\u00f3dico&quot;,&quot;value&quot;:&quot;exemplo-pr\u00e1tico-soft-timer-peri\u00f3dico&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;O que N\u00c3O fazer em callbacks de Soft Timer&quot;,&quot;value&quot;:&quot;o-que-n\u00e3o-fazer-em-callbacks-de-soft-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o: Tarefa vs Soft Timer&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-tarefa-vs-soft-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Comunica\u00e7\u00e3o entre Soft Timers e Tarefas no FreeRTOS&quot;,&quot;value&quot;:&quot;comunica\u00e7\u00e3o-entre-soft-timers-e-tarefas-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Comunica\u00e7\u00e3o usando Task Notifications&quot;,&quot;value&quot;:&quot;comunica\u00e7\u00e3o-usando-task-notifications&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Callback do timer notificando uma tarefa&quot;,&quot;value&quot;:&quot;callback-do-timer-notificando-uma-tarefa&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tarefa aguardando a notifica\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;tarefa-aguardando-a-notifica\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Comunica\u00e7\u00e3o usando Filas (Queues)&quot;,&quot;value&quot;:&quot;comunica\u00e7\u00e3o-usando-filas-queues&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Callback enviando dados para a fila&quot;,&quot;value&quot;:&quot;callback-enviando-dados-para-a-fila&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tarefa consumindo a fila&quot;,&quot;value&quot;:&quot;tarefa-consumindo-a-fila&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Comunica\u00e7\u00e3o usando Event Groups&quot;,&quot;value&quot;:&quot;comunica\u00e7\u00e3o-usando-event-groups&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Callback setando um evento&quot;,&quot;value&quot;:&quot;callback-setando-um-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tarefa aguardando o evento&quot;,&quot;value&quot;:&quot;tarefa-aguardando-o-evento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Compara\u00e7\u00e3o entre mecanismos&quot;,&quot;value&quot;:&quot;compara\u00e7\u00e3o-entre-mecanismos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Padr\u00e3o arquitetural recomendado&quot;,&quot;value&quot;:&quot;padr\u00e3o-arquitetural-recomendado&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;5 \u2013 Exemplo Completo: Arquitetura Real com Tarefas e Soft Timers no FreeRTOS&quot;,&quot;value&quot;:&quot;5-exemplo-completo-arquitetura-real-com-tarefas-e-soft-timers-no-freertos&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Cen\u00e1rio proposto&quot;,&quot;value&quot;:&quot;cen\u00e1rio-proposto&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Diagrama l\u00f3gico da arquitetura&quot;,&quot;value&quot;:&quot;diagrama-l\u00f3gico-da-arquitetura&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;C\u00f3digo completo do exemplo&quot;,&quot;value&quot;:&quot;c\u00f3digo-completo-do-exemplo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Handles globais&quot;,&quot;value&quot;:&quot;handles-globais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Callback do Soft Timer&quot;,&quot;value&quot;:&quot;callback-do-soft-timer&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tarefa de processamento&quot;,&quot;value&quot;:&quot;tarefa-de-processamento&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Inicializa\u00e7\u00e3o do sistema&quot;,&quot;value&quot;:&quot;inicializa\u00e7\u00e3o-do-sistema&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;An\u00e1lise t\u00e9cnica da solu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;an\u00e1lise-t\u00e9cnica-da-solu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Quando N\u00c3O usar Soft Timers&quot;,&quot;value&quot;:&quot;quando-n\u00e3o-usar-soft-timers&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">Conceito de Tarefas no FreeRTOS e Estrutura Básica</a><ul class="eb-toc__list"><li><a href="#assinatura-de-uma-tarefa-no-freertos">Assinatura de uma tarefa no FreeRTOS</a><li><a href="#eb-table-content-2">Criação de tarefas com xTaskCreate()</a><li><a href="#eb-table-content-3">Exemplo prático: tarefa de LED</a><li><a href="#estados-de-uma-tarefa-no-freertos">Estados de uma tarefa no FreeRTOS</a></li></ul><li><a href="#eb-table-content-5">2 – Prioridades, Stack e Boas Práticas na Criação de Tarefas</a><ul class="eb-toc__list"><li><a href="#prioridades-de-tarefas">Prioridades de tarefas</a><li><a href="#stack-de-tarefas-como-dimensionar-corretamente">Stack de tarefas: como dimensionar corretamente</a><ul class="eb-toc__list"><li><a href="#como-estimar-o-tamanho-da-stack">Como estimar o tamanho da stack</a></li></ul><li><a href="#eb-table-content-9">Stack overflow e mecanismos de proteção</a><li><a href="#eb-table-content-10">Heap e criação dinâmica de tarefas</a><li><a href="#eb-table-content-11">Boas práticas fundamentais</a></li></ul><li><a href="#eb-table-content-12">Soft Timers no FreeRTOS: Conceito, Arquitetura e Diferenças para Tarefas</a><ul class="eb-toc__list"><li><a href="#eb-table-content-13">O que é um Soft Timer</a><li><a href="#timer-service-task">Timer Service Task</a><li><a href="#tipos-de-soft-timers">Tipos de Soft Timers</a><li><a href="#eb-table-content-16">Criação de um Soft Timer</a><li><a href="#eb-table-content-17">Exemplo prático: Soft Timer periódico</a><li><a href="#eb-table-content-18">O que NÃO fazer em callbacks de Soft Timer</a><li><a href="#eb-table-content-19">Comparação: Tarefa vs Soft Timer</a></li></ul><li><a href="#eb-table-content-20">Comunicação entre Soft Timers e Tarefas no FreeRTOS</a><ul class="eb-toc__list"><li><a href="#eb-table-content-21">Comunicação usando Task Notifications</a><ul class="eb-toc__list"><li><a href="#callback-do-timer-notificando-uma-tarefa">Callback do timer notificando uma tarefa</a><li><a href="#eb-table-content-23">Tarefa aguardando a notificação</a></li></ul><li><a href="#eb-table-content-24">Comunicação usando Filas (Queues)</a><ul class="eb-toc__list"><li><a href="#callback-enviando-dados-para-a-fila">Callback enviando dados para a fila</a><li><a href="#tarefa-consumindo-a-fila">Tarefa consumindo a fila</a></li></ul><li><a href="#eb-table-content-27">Comunicação usando Event Groups</a><ul class="eb-toc__list"><li><a href="#callback-setando-um-evento">Callback setando um evento</a><li><a href="#tarefa-aguardando-o-evento">Tarefa aguardando o evento</a></li></ul><li><a href="#eb-table-content-30">Comparação entre mecanismos</a><li><a href="#eb-table-content-31">Padrão arquitetural recomendado</a></li></ul><li><a href="#5-exemplo-completo-arquitetura-real-com-tarefas-e-soft-timers-no-freertos">5 – Exemplo Completo: Arquitetura Real com Tarefas e Soft Timers no FreeRTOS</a><ul class="eb-toc__list"><li><a href="#eb-table-content-33">Cenário proposto</a><li><a href="#eb-table-content-34">Diagrama lógico da arquitetura</a><li><a href="#eb-table-content-35">Código completo do exemplo</a><ul class="eb-toc__list"><li><a href="#handles-globais">Handles globais</a><li><a href="#callback-do-soft-timer">Callback do Soft Timer</a><li><a href="#tarefa-de-processamento">Tarefa de processamento</a><li><a href="#eb-table-content-39">Inicialização do sistema</a></li></ul><li><a href="#eb-table-content-40">Análise técnica da solução</a><li><a href="#eb-table-content-41">Quando NÃO usar Soft Timers</a></li></ul></ul></div></div></div></div></div>


<h2 class="wp-block-heading"><strong>Conceito de Tarefas no FreeRTOS e Estrutura Básica</strong></h2>



<p class="wp-block-paragraph">Em um RTOS (Real-Time Operating System), o conceito central não é mais o <em>superloop</em>, mas sim a <strong>tarefa</strong> (<em>task</em>). Uma tarefa representa uma unidade independente de execução, com seu próprio contexto de CPU (registradores), sua própria pilha (<em>stack</em>) e um estado bem definido dentro do escalonador (<em>scheduler</em>). No FreeRTOS, tarefas são implementadas como <strong>funções C que nunca retornam</strong>, pois o controle do fluxo de execução é feito exclusivamente pelo kernel.</p>



<p class="wp-block-paragraph">Do ponto de vista conceitual, uma tarefa pode ser vista como uma <em>thread cooperativa/preemptiva</em>, dependendo da configuração do sistema. O FreeRTOS utiliza escalonamento <strong>preemptivo por prioridade</strong> (opcionalmente cooperativo), onde a tarefa de maior prioridade pronta para execução assume o processador. Isso permite modelar sistemas embarcados de forma mais determinística, separando claramente aquisição de dados, processamento, comunicação e controle.</p>



<h3 class="wp-block-heading"><strong>Assinatura de uma tarefa no FreeRTOS</strong></h3>



<p class="wp-block-paragraph">Toda tarefa no FreeRTOS segue a mesma assinatura básica:</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 vMinhaTarefa(void *pvParameters)
{
    for (;;)
    {
        /* Código da tarefa */
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vMinhaTarefa</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">;;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">/* Código da tarefa */</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Alguns pontos importantes que merecem atenção:</p>



<ul class="wp-block-list">
<li>A função <strong>não deve retornar</strong>.</li>



<li>O parâmetro <code>pvParameters</code> é um ponteiro genérico (<code>void*</code>) que permite passar dados para a tarefa no momento da criação.</li>



<li>O loop infinito não é opcional: ele garante que a tarefa continue viva enquanto o sistema estiver em execução.</li>



<li>Bloqueios devem ser feitos usando primitivas do RTOS (como <code>vTaskDelay()</code>), nunca com <em>busy wait</em>.</li>
</ul>



<h3 class="wp-block-heading"><strong>Criação de tarefas com <code>xTaskCreate()</code></strong></h3>



<p class="wp-block-paragraph">A API clássica para criação dinâmica de tarefas no FreeRTOS é a função <code>xTaskCreate()</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>BaseType_t xTaskCreate(
    TaskFunction_t pxTaskCode,
    const char * const pcName,
    const uint16_t usStackDepth,
    void * const pvParameters,
    UBaseType_t uxPriority,
    TaskHandle_t * const pxCreatedTask
);
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">BaseType_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">TaskFunction_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pxTaskCode</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pcName</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">usStackDepth</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">UBaseType_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uxPriority</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">TaskHandle_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pxCreatedTask</span></span>
<span class="line"><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Vamos detalhar cada parâmetro com precisão técnica:</p>



<ul class="wp-block-list">
<li><strong><code>pxTaskCode</code></strong><br>Ponteiro para a função que implementa a tarefa.</li>



<li><strong><code>pcName</code></strong><br>Nome simbólico da tarefa. Útil para debug, <em>trace</em> e ferramentas como FreeRTOS+Trace.</li>



<li><strong><code>usStackDepth</code></strong><br>Tamanho da pilha da tarefa <strong>em palavras</strong>, não em bytes.<br>Em arquiteturas 32 bits (como Cortex-M), 1 palavra = 4 bytes.</li>



<li><strong><code>pvParameters</code></strong><br>Ponteiro genérico para dados passados à tarefa.</li>



<li><strong><code>uxPriority</code></strong><br>Prioridade da tarefa. Quanto maior o valor, maior a prioridade.</li>



<li><strong><code>pxCreatedTask</code></strong><br>Retorna um <em>handle</em> da tarefa criada, usado para controle posterior (suspender, deletar, notificar etc.).</li>
</ul>



<h3 class="wp-block-heading"><strong>Exemplo prático: tarefa de LED</strong></h3>



<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 "FreeRTOS.h"
#include "task.h"

void vTaskBlink(void *pvParameters)
{
    (void) pvParameters;

    for (;;)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

void app_main(void)
{
    xTaskCreate(
        vTaskBlink,
        "Blink",
        128,
        NULL,
        1,
        NULL
    );

    vTaskStartScheduler();
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">FreeRTOS.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">task.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskBlink</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    (</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">pvParameters</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">;;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">HAL_GPIO_TogglePin</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">GPIOC</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GPIO_PIN_13</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">500</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">vTaskBlink</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Blink</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">128</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">NULL</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">NULL</span></span>
<span class="line"><span style="color: #D8DEE9FF">    )</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskStartScheduler</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



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



<ul class="wp-block-list">
<li>A tarefa <code>vTaskBlink</code> executa periodicamente a cada 500 ms.</li>



<li><code>vTaskDelay()</code> coloca a tarefa no estado <strong>Blocked</strong>, liberando a CPU para outras tarefas.</li>



<li><code>pdMS_TO_TICKS()</code> converte tempo em milissegundos para <em>ticks</em> do sistema, respeitando <code>configTICK_RATE_HZ</code>.</li>
</ul>



<h3 class="wp-block-heading"><strong>Estados de uma tarefa no FreeRTOS</strong></h3>



<p class="wp-block-paragraph">Internamente, o kernel gerencia cada tarefa em um dos seguintes estados principais:</p>



<ul class="wp-block-list">
<li><strong>Running</strong> – tarefa atualmente em execução.</li>



<li><strong>Ready</strong> – pronta para executar, aguardando CPU.</li>



<li><strong>Blocked</strong> – aguardando tempo, evento ou recurso.</li>



<li><strong>Suspended</strong> – explicitamente suspensa pelo usuário.</li>



<li><strong>Deleted</strong> – removida do sistema.</li>
</ul>



<p class="wp-block-paragraph">A criação correta das tarefas e o uso adequado de delays e sincronização é o que garante previsibilidade temporal, baixo consumo de CPU e bom comportamento em sistemas embarcados complexos.</p>



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



<p class="wp-block-paragraph">Perfeito, vamos avançar mantendo o mesmo rigor técnico e didático.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/rtos/como-criar-tarefas-e-soft-timers-no-freertos-guia-pratico-e-didatico-para-sistemas-embarcados/">Como Criar Tarefas e Soft Timers no FreeRTOS: Guia Prático e Didático para Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1016</post-id>	</item>
		<item>
		<title>Introdução à Nomenclatura do FreeRTOS</title>
		<link>https://mcu.tec.br/rtos/introducao-a-nomenclatura-do-freertos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introducao-a-nomenclatura-do-freertos</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 19 Mar 2025 01:01:19 +0000</pubDate>
				<category><![CDATA[RTOS]]></category>
		<category><![CDATA[boas práticas FreeRTOS]]></category>
		<category><![CDATA[código FreeRTOS]]></category>
		<category><![CDATA[convenção de nomes FreeRTOS.]]></category>
		<category><![CDATA[desenvolvimento embarcado]]></category>
		<category><![CDATA[filas FreeRTOS]]></category>
		<category><![CDATA[freertos]]></category>
		<category><![CDATA[funções FreeRTOS]]></category>
		<category><![CDATA[nomenclatura FreeRTOS]]></category>
		<category><![CDATA[organização código FreeRTOS]]></category>
		<category><![CDATA[otimização FreeRTOS]]></category>
		<category><![CDATA[prefixos FreeRTOS]]></category>
		<category><![CDATA[programação embarcada]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[semáforos FreeRTOS]]></category>
		<category><![CDATA[sufixos FreeRTOS]]></category>
		<category><![CDATA[tarefas FreeRTOS]]></category>
		<category><![CDATA[timers FreeRTOS]]></category>
		<category><![CDATA[variáveis FreeRTOS]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=131</guid>

					<description><![CDATA[<p>Aprenda a nomenclatura do FreeRTOS, incluindo prefixos, sufixos e boas práticas para funções e variáveis. Organize seu código e melhore a legibilidade no desenvolvimento embarcado.</p>
<p>The post <a href="https://mcu.tec.br/rtos/introducao-a-nomenclatura-do-freertos/">Introdução à Nomenclatura do FreeRTOS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">O <strong>FreeRTOS</strong> é um sistema operacional de tempo real amplamente utilizado em sistemas embarcados devido à sua leveza, eficiência e escalabilidade. Para facilitar o entendimento e a organização do código, o FreeRTOS segue uma nomenclatura específica para suas funções e tipos de dados. Essa nomenclatura permite uma padronização que ajuda os desenvolvedores a identificar rapidamente a finalidade de cada elemento dentro do código-fonte.</p>



<p class="wp-block-paragraph">Este artigo explora a convenção de nomenclatura do FreeRTOS, explicando a lógica por trás da escolha dos prefixos e sufixos, além de fornecer exemplos práticos e amplamente documentados para ajudar iniciantes no uso desse sistema operacional.</p>



<h2 class="wp-block-heading"><strong>1. Convenção de Nomenclatura no FreeRTOS</strong></h2>



<p class="wp-block-paragraph">O FreeRTOS segue um conjunto de regras bem definido para nomear funções, variáveis e tipos de dados. Essas regras são fundamentais para manter a legibilidade e a consistência do código. As principais características da nomenclatura são:</p>



<ol class="wp-block-list">
<li><strong>Prefixos das Funções</strong> – Indicam a categoria da função.</li>



<li><strong>Tipos de Dados e Estruturas</strong> – Usam <code>typedefs</code> com convenções específicas.</li>



<li><strong>Uso de Sufixos</strong> – Algumas funções e variáveis possuem sufixos que indicam propriedades específicas.</li>
</ol>



<p class="wp-block-paragraph">Nos tópicos seguintes, vamos explorar essas convenções com mais detalhes e exemplos práticos.</p>



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



<h2 class="wp-block-heading"><strong>2. Prefixos das Funções no FreeRTOS</strong></h2>



<p class="wp-block-paragraph">As funções do FreeRTOS seguem uma padronização de prefixos para indicar a categoria ou funcionalidade à qual pertencem. Isso facilita a organização do código e a compreensão rápida do que cada função faz. Os prefixos mais comuns são:</p>



<h3 class="wp-block-heading"><strong>2.1. Funções de Gerenciamento de Tarefas</strong></h3>



<p class="wp-block-paragraph">Essas funções lidam com a criação, suspensão, retomada e exclusão de tarefas no FreeRTOS. O prefixo usado é <code>vTask</code> ou <code>xTask</code>, dependendo do tipo de retorno. Elas são definidas no arquivo de cabeçalho <code>tasks.h</code> que deve ser incluído para seu uso.</p>



<ul class="wp-block-list">
<li><code>xTaskCreate()</code> – Cria uma nova tarefa.</li>



<li><code>vTaskDelete()</code> – Exclui uma tarefa existente.</li>



<li><code>vTaskDelay()</code> – Suspende a tarefa por um período de tempo.</li>



<li><code>xTaskGetSchedulerState()</code> – Obtém o estado atual do escalonador.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo: Criando uma tarefa no FreeRTOS</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" data-code="#include &quot;FreeRTOS.h&quot;
#include &quot;task.h&quot;

void vTaskFunction(void *pvParameters) {
    while(1) {
        // Código da tarefa
        vTaskDelay(pdMS_TO_TICKS(1000)); // Atraso de 1 segundo
    }
}

void app_main(void) {
    xTaskCreate(vTaskFunction, &quot;MinhaTarefa&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #5E81AC; font-weight: bold">#</span><span style="color: #81A1C1">include</span><span style="color: #8FBCBB"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">FreeRTOS.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #5E81AC; font-weight: bold">#</span><span style="color: #81A1C1">include</span><span style="color: #8FBCBB"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">task.h</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskFunction</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Código da tarefa</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Atraso de 1 segundo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">MinhaTarefa</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Neste exemplo, <code>xTaskCreate()</code> é usada para criar a tarefa, e <code>vTaskDelay()</code> para introduzir um atraso.</em></p>



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



<h3 class="wp-block-heading"><strong>2.2. Funções de Gerenciamento de Filas</strong></h3>



<p class="wp-block-paragraph">As filas são amplamente utilizadas no FreeRTOS para comunicação entre tarefas. As funções relacionadas a filas começam com o prefixo <code>xQueue</code>. As funções relativas ao Queue são definidas no header <code>queue.h</code> que deve ser incluído sempre que forem usadas.</p>



<ul class="wp-block-list">
<li><code>xQueueCreate()</code> – Cria uma fila.</li>



<li><code>xQueueSend()</code> – Envia um item para a fila.</li>



<li><code>xQueueReceive()</code> – Recebe um item da fila.</li>



<li><code>uxQueueMessagesWaiting()</code> – Retorna o número de itens na fila.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo: Criando e usando uma fila</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" data-code="QueueHandle_t xQueue;

void vTaskSender(void *pvParameters) {
    int valor = 42;
    while(1) {
        xQueueSend(xQueue, &amp;valor, portMAX_DELAY);
        vTaskDelay(pdMS_TO_TICKS(500)); // Envio a cada 500ms
    }
}

void vTaskReceiver(void *pvParameters) {
    int recebido;
    while(1) {
        if (xQueueReceive(xQueue, &amp;recebido, portMAX_DELAY)) {
            printf(&quot;Recebido: %d\n&quot;, recebido);
        }
    }
}

void app_main(void) {
    xQueue = xQueueCreate(10, sizeof(int)); // Cria fila com 10 posições
    xTaskCreate(vTaskSender, &quot;Sender&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    xTaskCreate(vTaskReceiver, &quot;Receiver&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">QueueHandle_t</span><span style="color: #D8DEE9FF"> xQueue</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskSender</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">int</span><span style="color: #D8DEE9FF"> valor </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">42</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">xQueueSend</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xQueue</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF">valor</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> portMAX_DELAY</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">500</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Envio a cada 500ms</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskReceiver</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">int</span><span style="color: #D8DEE9FF"> recebido</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">xQueueReceive</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xQueue</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF">recebido</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> portMAX_DELAY</span><span style="color: #ECEFF4">))</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Recebido: %d</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> recebido</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xQueue </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xQueueCreate</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">10</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">sizeof</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">int</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Cria fila com 10 posições</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskSender</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Sender</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskReceiver</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Receiver</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>xQueueCreate()</code> cria a fila, <code>xQueueSend()</code> insere valores e <code>xQueueReceive()</code> os lê.</em></p>



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



<h3 class="wp-block-heading"><strong>2.3. Funções de Semáforos e Mutexes</strong></h3>



<p class="wp-block-paragraph">Os semáforos e mutexes são usados para sincronizar tarefas e gerenciar acesso a recursos compartilhados. O prefixo para essas funções é <code>xSemaphore</code> ou <code>xMutex</code>. Estas funçõe são definidas no arquivo de cabeçalho <code>semaphore.h</code>.</p>



<ul class="wp-block-list">
<li><code>xSemaphoreCreateBinary()</code> – Cria um semáforo binário.</li>



<li><code>xSemaphoreGive()</code> – Libera um semáforo.</li>



<li><code>xSemaphoreTake()</code> – Captura um semáforo.</li>



<li><code>xSemaphoreCreateMutex()</code> – Cria um mutex.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo: Uso de mutex para evitar condições de corrida</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" data-code="SemaphoreHandle_t xMutex;

void vTask1(void *pvParameters) {
    while(1) {
        if (xSemaphoreTake(xMutex, portMAX_DELAY)) {
            printf(&quot;Tarefa 1 acessando recurso\n&quot;);
            vTaskDelay(pdMS_TO_TICKS(500));
            xSemaphoreGive(xMutex);
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

void vTask2(void *pvParameters) {
    while(1) {
        if (xSemaphoreTake(xMutex, portMAX_DELAY)) {
            printf(&quot;Tarefa 2 acessando recurso\n&quot;);
            vTaskDelay(pdMS_TO_TICKS(500));
            xSemaphoreGive(xMutex);
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

void app_main(void) {
    xMutex = xSemaphoreCreateMutex();
    xTaskCreate(vTask1, &quot;Task1&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    xTaskCreate(vTask2, &quot;Task2&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">SemaphoreHandle_t</span><span style="color: #D8DEE9FF"> xMutex</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTask1</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">xSemaphoreTake</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xMutex</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> portMAX_DELAY</span><span style="color: #ECEFF4">))</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tarefa 1 acessando recurso</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">500</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">xSemaphoreGive</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xMutex</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">100</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTask2</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">xSemaphoreTake</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xMutex</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> portMAX_DELAY</span><span style="color: #ECEFF4">))</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tarefa 2 acessando recurso</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">500</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">xSemaphoreGive</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xMutex</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">100</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xMutex </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xSemaphoreCreateMutex</span><span style="color: #ECEFF4">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTask1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTask2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>xSemaphoreCreateMutex()</code> cria um mutex, enquanto <code>xSemaphoreTake()</code> e <code>xSemaphoreGive()</code> garantem o acesso seguro ao recurso.</em></p>



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



<h3 class="wp-block-heading"><strong>2.4. Funções de Timers</strong></h3>



<p class="wp-block-paragraph">Os timers no FreeRTOS permitem a execução periódica de funções. As funções relacionadas a timers começam com <code>xTimer</code>. As funções de Timer são definidas no arquivo de cabeçalho <code>timer.h</code>.</p>



<ul class="wp-block-list">
<li><code>xTimerCreate()</code> – Cria um novo timer.</li>



<li><code>xTimerStart()</code> – Inicia um timer.</li>



<li><code>xTimerStop()</code> – Para um timer.</li>



<li><code>xTimerReset()</code> – Reinicia um timer.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo: Criando um timer no FreeRTOS</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" data-code="TimerHandle_t xTimer;

void vTimerCallback(TimerHandle_t xTimer) {
    printf(&quot;Timer expirado!\n&quot;);
}

void app_main(void) {
    xTimer = xTimerCreate(&quot;MeuTimer&quot;, pdMS_TO_TICKS(2000), pdTRUE, NULL, vTimerCallback);
    if (xTimer != NULL) {
        xTimerStart(xTimer, 0);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TimerHandle_t</span><span style="color: #D8DEE9FF"> xTimer</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTimerCallback</span><span style="color: #ECEFF4">(</span><span style="color: #8FBCBB">TimerHandle_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xTimer</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Timer expirado!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xTimer </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTimerCreate</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">MeuTimer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">2000</span><span style="color: #ECEFF4">),</span><span style="color: #D8DEE9FF"> pdTRUE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> vTimerCallback</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xTimer </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">xTimerStart</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xTimer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O timer dispara <code>vTimerCallback()</code> a cada 2 segundos.</em></p>



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



<h2 class="wp-block-heading"><strong>3. Tipos de Dados e Estruturas no FreeRTOS</strong></h2>



<p class="wp-block-paragraph">No FreeRTOS, a padronização dos tipos de dados e estruturas é essencial para garantir a portabilidade entre diferentes arquiteturas de microcontroladores. A nomenclatura segue convenções bem definidas para facilitar a leitura e evitar ambiguidades.</p>



<p class="wp-block-paragraph">Os principais tipos de dados no FreeRTOS são:</p>



<ul class="wp-block-list">
<li><strong>BaseType_t</strong> – Tipo base genérico para representar valores numéricos.</li>



<li><strong>TickType_t</strong> – Usado para armazenar valores de tempo (ticks do sistema).</li>



<li><strong>UBaseType_t</strong> – Variante sem sinal de <code>BaseType_t</code>, usada para contadores e índices.</li>



<li><strong>TaskHandle_t</strong> – Representa uma referência para uma tarefa.</li>



<li><strong>QueueHandle_t</strong> – Representa uma referência para uma fila.</li>



<li><strong>SemaphoreHandle_t</strong> – Representa um semáforo ou mutex.</li>



<li><strong>TimerHandle_t</strong> – Manipulador para um timer do FreeRTOS.</li>
</ul>



<p class="wp-block-paragraph">A seguir, exploraremos esses tipos de dados com exemplos práticos.</p>



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



<h3 class="wp-block-heading"><strong>3.1. BaseType_t e UBaseType_t</strong></h3>



<p class="wp-block-paragraph">O tipo <code>BaseType_t</code> é a base para a maioria dos tipos de retorno no FreeRTOS. Ele é definido de forma genérica para ser compatível com diferentes arquiteturas (8, 16, 32 ou 64 bits).</p>



<ul class="wp-block-list">
<li><code>BaseType_t</code> pode ser <strong>positivo, negativo ou zero</strong>.</li>



<li><code>UBaseType_t</code> é <strong>sempre positivo</strong> e é usado para índices e contadores.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo: Verificando retorno de uma função</strong></p>



<pre class="wp-block-code"><code>BaseType_t xStatus;
UBaseType_t uxCount = 0;

void app_main(void) {
    xStatus = xTaskCreatePinnedToCore(vTaskFunction, "Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL, 0);

    if (xStatus == pdPASS) {
        printf("Tarefa criada com sucesso!\n");
    } else {
        printf("Falha ao criar tarefa.\n");
    }

    uxCount++;
    printf("Número de tentativas: %u\n", (unsigned int)uxCount);
}
</code></pre>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>BaseType_t</code> verifica se a criação da tarefa foi bem-sucedida, enquanto <code>UBaseType_t</code> conta as tentativas de criação.</em></p>



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



<h3 class="wp-block-heading"><strong>3.2. TickType_t</strong></h3>



<p class="wp-block-paragraph">O tipo <code>TickType_t</code> é usado para armazenar valores de tempo no FreeRTOS. O sistema mede o tempo em &#8220;ticks&#8221;, que dependem da frequência configurada (<code>configTICK_RATE_HZ</code>).</p>



<p class="wp-block-paragraph"><strong>Exemplo: Obtendo o tempo atual do sistema</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" data-code="TickType_t xStartTime, xElapsedTime;

void app_main(void) {
    xStartTime = xTaskGetTickCount(); // Obtém o tempo atual em ticks
    vTaskDelay(pdMS_TO_TICKS(500)); // Aguarda 500ms
    xElapsedTime = xTaskGetTickCount() - xStartTime; // Calcula o tempo decorrido

    printf(&quot;Tempo decorrido: %lu ticks\n&quot;, (unsigned long)xElapsedTime);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TickType_t</span><span style="color: #D8DEE9FF"> xStartTime</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> xElapsedTime</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xStartTime </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTaskGetTickCount</span><span style="color: #ECEFF4">()</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Obtém o tempo atual em ticks</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">500</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Aguarda 500ms</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xElapsedTime </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTaskGetTickCount</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> xStartTime</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Calcula o tempo decorrido</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tempo decorrido: %lu ticks</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">unsigned</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">long</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">xElapsedTime</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>xTaskGetTickCount()</code> é usado para medir o tempo decorrido de uma operação.</em></p>



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



<h3 class="wp-block-heading"><strong>3.3. TaskHandle_t</strong></h3>



<p class="wp-block-paragraph">O tipo <code>TaskHandle_t</code> é um ponteiro que referencia uma tarefa, permitindo manipulá-la dinamicamente.</p>



<p class="wp-block-paragraph"><strong>Exemplo: Criando e suspendendo uma tarefa</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" data-code="TaskHandle_t xTaskHandle = NULL;

void vTaskFunction(void *pvParameters) {
    while (1) {
        printf(&quot;Tarefa executando...\n&quot;);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void app_main(void) {
    xTaskCreate(vTaskFunction, &quot;Task1&quot;, configMINIMAL_STACK_SIZE, NULL, 1, &amp;xTaskHandle);

    vTaskDelay(pdMS_TO_TICKS(5000)); // Espera 5 segundos antes de suspender a tarefa
    vTaskSuspend(xTaskHandle);
    printf(&quot;Tarefa suspensa!\n&quot;);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TaskHandle_t</span><span style="color: #D8DEE9FF"> xTaskHandle </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskFunction</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tarefa executando...</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF">xTaskHandle</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">5000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Espera 5 segundos antes de suspender a tarefa</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskSuspend</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xTaskHandle</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tarefa suspensa!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>xTaskHandle</code> é usado para suspender a tarefa após 5 segundos.</em></p>



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



<h3 class="wp-block-heading"><strong>3.4. QueueHandle_t</strong></h3>



<p class="wp-block-paragraph">O tipo <code>QueueHandle_t</code> armazena uma referência a uma fila, permitindo sua manipulação por diferentes tarefas.</p>



<p class="wp-block-paragraph"><strong>Exemplo: Criando e verificando uma fila</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" data-code="QueueHandle_t xQueue;

void app_main(void) {
    xQueue = xQueueCreate(5, sizeof(int)); // Cria uma fila com capacidade para 5 inteiros

    if (xQueue != NULL) {
        printf(&quot;Fila criada com sucesso!\n&quot;);
    } else {
        printf(&quot;Falha ao criar a fila.\n&quot;);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">QueueHandle_t</span><span style="color: #D8DEE9FF"> xQueue</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xQueue </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xQueueCreate</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">5</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">sizeof</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">int</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Cria uma fila com capacidade para 5 inteiros</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xQueue </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Fila criada com sucesso!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha ao criar a fila.</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>QueueHandle_t</code> é usado para armazenar a referência da fila criada.</em></p>



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



<h3 class="wp-block-heading"><strong>3.5. SemaphoreHandle_t</strong></h3>



<p class="wp-block-paragraph">O tipo <code>SemaphoreHandle_t</code> é usado para armazenar referência a semáforos e mutexes.</p>



<p class="wp-block-paragraph"><strong>Exemplo: Criando um semáforo binário</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" data-code="SemaphoreHandle_t xSemaphore;

void app_main(void) {
    xSemaphore = xSemaphoreCreateBinary();

    if (xSemaphore != NULL) {
        printf(&quot;Semáforo criado!\n&quot;);
    } else {
        printf(&quot;Falha ao criar semáforo.\n&quot;);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">SemaphoreHandle_t</span><span style="color: #D8DEE9FF"> xSemaphore</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xSemaphore </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xSemaphoreCreateBinary</span><span style="color: #ECEFF4">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xSemaphore </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Semáforo criado!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha ao criar semáforo.</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>SemaphoreHandle_t</code> armazena o manipulador do semáforo criado.</em></p>



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



<h3 class="wp-block-heading"><strong>3.6. TimerHandle_t</strong></h3>



<p class="wp-block-paragraph">O tipo <code>TimerHandle_t</code> é usado para armazenar referências a timers criados no FreeRTOS.</p>



<p class="wp-block-paragraph"><strong>Exemplo: Criando um timer que dispara a cada 2 segundos</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" data-code="TimerHandle_t xTimer;

void vTimerCallback(TimerHandle_t xTimer) {
    printf(&quot;Timer expirado!\n&quot;);
}

void app_main(void) {
    xTimer = xTimerCreate(&quot;MeuTimer&quot;, pdMS_TO_TICKS(2000), pdTRUE, NULL, vTimerCallback);

    if (xTimer != NULL) {
        xTimerStart(xTimer, 0);
        printf(&quot;Timer iniciado!\n&quot;);
    } else {
        printf(&quot;Falha ao criar o timer.\n&quot;);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TimerHandle_t</span><span style="color: #D8DEE9FF"> xTimer</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTimerCallback</span><span style="color: #ECEFF4">(</span><span style="color: #8FBCBB">TimerHandle_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xTimer</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Timer expirado!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xTimer </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTimerCreate</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">MeuTimer</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">2000</span><span style="color: #ECEFF4">),</span><span style="color: #D8DEE9FF"> pdTRUE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> vTimerCallback</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xTimer </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">xTimerStart</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xTimer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Timer iniciado!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha ao criar o timer.</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>TimerHandle_t</code> armazena a referência do timer criado.</em></p>



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



<h2 class="wp-block-heading"><strong>4. Uso de Sufixos em Funções e Variáveis do FreeRTOS</strong></h2>



<p class="wp-block-paragraph">Além dos prefixos e tipos de dados padronizados, o FreeRTOS também utiliza <strong>sufixos</strong> em funções e variáveis para indicar propriedades específicas. Esses sufixos ajudam a identificar rapidamente características como escopo, tipo de dado ou comportamento esperado da função.</p>



<p class="wp-block-paragraph">Os principais sufixos usados no FreeRTOS são:</p>



<ul class="wp-block-list">
<li><strong>FromISR</strong> – Indica que a função pode ser chamada a partir de uma interrupção.</li>



<li><strong>_t</strong> – Indica que o nome refere-se a um tipo de dado.</li>



<li><strong>Handle</strong> – Representa um manipulador para um objeto do FreeRTOS.</li>



<li><strong>Ticks</strong> – Refere-se a unidades de tempo do sistema (ticks).</li>



<li><strong>MS</strong> – Representa valores em milissegundos.</li>
</ul>



<p class="wp-block-paragraph">A seguir, exploramos cada um desses sufixos com exemplos práticos.</p>



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



<h3 class="wp-block-heading"><strong>4.1. Sufixo <code>FromISR</code></strong></h3>



<p class="wp-block-paragraph">Funções que podem ser chamadas dentro de um <strong>handler de interrupção</strong> possuem o sufixo <code>FromISR</code>. Isso é necessário porque chamadas dentro de interrupções não podem executar determinadas operações do sistema operacional, como esperar indefinidamente (<code>portMAX_DELAY</code>).</p>



<h4 class="wp-block-heading"><strong>Exemplo: Enviando um item para uma fila dentro de uma 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" data-code="QueueHandle_t xQueue;

void IRAM_ATTR vISRHandler(void *arg) {
    int valor = 10;
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;

    xQueueSendFromISR(xQueue, &amp;valor, &amp;xHigherPriorityTaskWoken);

    if (xHigherPriorityTaskWoken == pdTRUE) {
        portYIELD_FROM_ISR();
    }
}

void app_main(void) {
    xQueue = xQueueCreate(5, sizeof(int));

    gpio_install_isr_service(0);
    gpio_isr_handler_add(GPIO_NUM_4, vISRHandler, NULL);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">QueueHandle_t</span><span style="color: #D8DEE9FF"> xQueue</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> IRAM_ATTR </span><span style="color: #88C0D0">vISRHandler</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">arg</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">int</span><span style="color: #D8DEE9FF"> valor </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">BaseType_t</span><span style="color: #D8DEE9FF"> xHigherPriorityTaskWoken </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> pdFALSE</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xQueueSendFromISR</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xQueue</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF">valor</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF">xHigherPriorityTaskWoken</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xHigherPriorityTaskWoken </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> pdTRUE</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">portYIELD_FROM_ISR</span><span style="color: #ECEFF4">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xQueue </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xQueueCreate</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">5</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">sizeof</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">int</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">gpio_install_isr_service</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">gpio_isr_handler_add</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">GPIO_NUM_4</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> vISRHandler</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>xQueueSendFromISR()</code> é usado para evitar bloqueios dentro da interrupção.</em></p>



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



<h3 class="wp-block-heading"><strong>4.2. Sufixo <code>_t</code></strong></h3>



<p class="wp-block-paragraph">O sufixo <code>_t</code> indica que o nome representa um <strong>tipo de dado</strong> definido pelo FreeRTOS.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Utilizando tipos de dados do FreeRTOS</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" data-code="BaseType_t xStatus;
TickType_t xTime;
QueueHandle_t xQueue;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">BaseType_t</span><span style="color: #D8DEE9FF"> xStatus</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">TickType_t</span><span style="color: #D8DEE9FF"> xTime</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">QueueHandle_t</span><span style="color: #D8DEE9FF"> xQueue</span><span style="color: #81A1C1">;</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/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>BaseType_t</code>, <code>TickType_t</code> e <code>QueueHandle_t</code> seguem essa convenção.</em></p>



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



<h3 class="wp-block-heading"><strong>4.3. Sufixo <code>Handle</code></strong></h3>



<p class="wp-block-paragraph">O sufixo <code>Handle</code> é usado para representar <strong>manipuladores</strong> de objetos do FreeRTOS, como tarefas, filas, semáforos e timers.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Criando e manipulando uma tarefa</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" data-code="TaskHandle_t xTaskHandle = NULL;

void vTaskFunction(void *pvParameters) {
    while (1) {
        printf(&quot;Executando tarefa...\n&quot;);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void app_main(void) {
    xTaskCreate(vTaskFunction, &quot;MinhaTarefa&quot;, configMINIMAL_STACK_SIZE, NULL, 1, &amp;xTaskHandle);
    vTaskDelay(pdMS_TO_TICKS(5000));
    vTaskDelete(xTaskHandle);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TaskHandle_t</span><span style="color: #D8DEE9FF"> xTaskHandle </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskFunction</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Executando tarefa...</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">MinhaTarefa</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9FF">xTaskHandle</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">5000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskDelete</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xTaskHandle</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>TaskHandle_t</code> armazena o manipulador da tarefa para que possamos manipulá-la posteriormente.</em></p>



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



<h3 class="wp-block-heading"><strong>4.4. Sufixo <code>Ticks</code></strong></h3>



<p class="wp-block-paragraph">O sufixo <code>Ticks</code> indica que o valor da variável ou função está expresso em <strong>ticks de sistema</strong>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Calculando tempo em ticks</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" data-code="TickType_t xStartTime, xElapsedTime;

void app_main(void) {
    xStartTime = xTaskGetTickCount(); // Obtém tempo atual
    vTaskDelay(pdMS_TO_TICKS(2000)); // Aguarda 2 segundos
    xElapsedTime = xTaskGetTickCount() - xStartTime;

    printf(&quot;Tempo decorrido: %lu ticks\n&quot;, (unsigned long)xElapsedTime);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TickType_t</span><span style="color: #D8DEE9FF"> xStartTime</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> xElapsedTime</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xStartTime </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTaskGetTickCount</span><span style="color: #ECEFF4">()</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Obtém tempo atual</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">2000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Aguarda 2 segundos</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xElapsedTime </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTaskGetTickCount</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> xStartTime</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tempo decorrido: %lu ticks</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">unsigned</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">long</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">xElapsedTime</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>xStartTime</code> e <code>xElapsedTime</code> armazenam valores em ticks do sistema.</em></p>



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



<h3 class="wp-block-heading"><strong>4.5. Sufixo <code>MS</code></strong></h3>



<p class="wp-block-paragraph">O sufixo <code>MS</code> é usado para representar valores em <strong>milissegundos</strong>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Definindo tempos em milissegundos</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" data-code="#define TEMPO_DELAY_MS 500

void app_main(void) {
    vTaskDelay(pdMS_TO_TICKS(TEMPO_DELAY_MS)); // Converte para ticks
    printf(&quot;Aguardou %d ms\n&quot;, TEMPO_DELAY_MS);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #5E81AC; font-weight: bold">#</span><span style="color: #81A1C1">define</span><span style="color: #5E81AC"> </span><span style="color: #88C0D0">TEMPO_DELAY_MS</span><span style="color: #5E81AC"> </span><span style="color: #B48EAD">500</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">TEMPO_DELAY_MS</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Converte para ticks</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Aguardou %d ms</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> TEMPO_DELAY_MS</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>TEMPO_DELAY_MS</code> representa um tempo em milissegundos.</em></p>



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



<h3 class="wp-block-heading"><strong>Resumo da Seção</strong></h3>



<p class="wp-block-paragraph">Os sufixos no FreeRTOS ajudam a identificar o propósito de variáveis e funções rapidamente:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Sufixo</strong></th><th><strong>Significado</strong></th><th><strong>Exemplo</strong></th></tr></thead><tbody><tr><td><code>FromISR</code></td><td>Função segura para chamadas dentro de interrupção</td><td><code>xQueueSendFromISR()</code></td></tr><tr><td><code>_t</code></td><td>Define um tipo de dado</td><td><code>TickType_t</code>, <code>BaseType_t</code></td></tr><tr><td><code>Handle</code></td><td>Manipulador de objeto do FreeRTOS</td><td><code>TaskHandle_t</code>, <code>QueueHandle_t</code></td></tr><tr><td><code>Ticks</code></td><td>Indica tempo em ticks do sistema</td><td><code>TickType_t xTimeInTicks;</code></td></tr><tr><td><code>MS</code></td><td>Indica tempo em milissegundos</td><td><code>#define TEMPO_MS 500</code></td></tr></tbody></table></figure>



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



<h2 class="wp-block-heading"><strong>5. Prefixos de Retorno de Funções e Variáveis no FreeRTOS</strong></h2>



<p class="wp-block-paragraph">Além dos prefixos usados para categorizar funções (<code>xTask</code>, <code>vTask</code>, <code>xQueue</code> etc.), o FreeRTOS também utiliza <strong>prefixos em variáveis e valores de retorno</strong> para indicar tipos de dados específicos. Esses prefixos ajudam a identificar rapidamente a natureza da variável ou o tipo de dado que uma função retorna.</p>



<p class="wp-block-paragraph">Os principais prefixos utilizados no FreeRTOS incluem:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Prefixo</strong></th><th><strong>Significado</strong></th><th><strong>Exemplo</strong></th></tr></thead><tbody><tr><td><code>u</code></td><td>Variável <strong>inteira sem sinal</strong> (<code>unsigned</code>)</td><td><code>uint8_t uCounter;</code></td></tr><tr><td><code>x</code></td><td>Retorno de função que representa um <strong>valor de status</strong></td><td><code>BaseType_t xStatus;</code></td></tr><tr><td><code>v</code></td><td>Função que <strong>não retorna valor</strong> (<code>void</code>)</td><td><code>void vTaskDelay();</code></td></tr><tr><td><code>ux</code></td><td>Variável <strong>sem sinal e de uso geral</strong> (<code>UBaseType_t</code>)</td><td><code>UBaseType_t uxIndex;</code></td></tr><tr><td><code>e</code></td><td>Enumeração (<code>enum</code>)</td><td><code>eTaskState eState;</code></td></tr><tr><td><code>p</code></td><td>Ponteiro (<code>pointer</code>)</td><td><code>char *pBuffer;</code></td></tr><tr><td><code>s</code></td><td>String (<code>string</code>)</td><td><code>const char *sMessage;</code></td></tr><tr><td><code>pc</code></td><td>Ponteiro para constante (<code>pointer to constant</code>)</td><td><code>const char *pcMessage;</code></td></tr><tr><td><code>pu</code></td><td>Ponteiro para um valor sem sinal (<code>unsigned pointer</code>)</td><td><code>const uint8_t *puData;</code></td></tr><tr><td><code>c</code></td><td>Tipo de dado <code>char</code></td><td><code>char cCharacter;</code></td></tr><tr><td><code>pd</code></td><td>Definição interna do FreeRTOS (<code>port define</code>)</td><td><code>pdPASS</code>, <code>pdFALSE</code>, <code>pdTRUE</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A seguir, exploramos cada um desses prefixos com exemplos práticos.</p>



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



<h3 class="wp-block-heading"><strong>5.1. Prefixo <code>u</code> (Unsigned)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>u</code> indica que a variável é um número inteiro <strong>sem sinal</strong>, ou seja, não pode armazenar valores negativos.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Contador sem sinal</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" data-code="uint8_t uCounter = 0;

void app_main(void) {
    for (uCounter = 0; uCounter < 10; uCounter++) {
        printf(&quot;Contador: %u\n&quot;, uCounter);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">uint8_t</span><span style="color: #D8DEE9FF"> uCounter </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">uCounter </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> uCounter </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> uCounter</span><span style="color: #81A1C1">++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Contador: %u</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> uCounter</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>uCounter</code> é uma variável do tipo <code>uint8_t</code>, que é um inteiro sem sinal de 8 bits.</em></p>



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



<h3 class="wp-block-heading"><strong>5.2. Prefixo <code>x</code> (Retorno de Função)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>x</code> é usado em funções que retornam um <strong>valor de status</strong>, geralmente do tipo <code>BaseType_t</code>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Verificando status da criação de uma tarefa</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" data-code="BaseType_t xStatus;

void app_main(void) {
    xStatus = xTaskCreate(vTaskFunction, &quot;Task1&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    if (xStatus == pdPASS) {
        printf(&quot;Tarefa criada com sucesso!\n&quot;);
    } else {
        printf(&quot;Falha ao criar a tarefa.\n&quot;);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">BaseType_t</span><span style="color: #D8DEE9FF"> xStatus</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    xStatus </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xStatus </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> pdPASS</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tarefa criada com sucesso!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Falha ao criar a tarefa.</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O <code>xTaskCreate()</code> retorna um <code>BaseType_t</code>, e o valor de retorno <code>xStatus</code> indica se a operação foi bem-sucedida.</em></p>



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



<h3 class="wp-block-heading"><strong>5.3. Prefixo <code>v</code> (Void)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>v</code> é usado para funções que <strong>não retornam valores</strong>, ou seja, cujo tipo de retorno é <code>void</code>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Função sem retorno</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" data-code="void vTaskFunction(void *pvParameters) {
    while (1) {
        printf(&quot;Executando tarefa...\n&quot;);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskFunction</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Executando tarefa...</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>A função <code>vTaskFunction()</code> não retorna valores, então segue a convenção <code>v</code>.</em></p>



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



<h3 class="wp-block-heading"><strong>5.4. Prefixo <code>ux</code> (Unsigned BaseType_t)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>ux</code> é usado para variáveis do tipo <code>UBaseType_t</code>, que é um inteiro <strong>sem sinal</strong> usado para contadores e índices.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Usando <code>UBaseType_t</code> para armazenar um índice</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" data-code="UBaseType_t uxIndex;

void app_main(void) {
    for (uxIndex = 0; uxIndex < 5; uxIndex++) {
        printf(&quot;Índice: %u\n&quot;, (unsigned int)uxIndex);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">UBaseType_t</span><span style="color: #D8DEE9FF"> uxIndex</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">uxIndex </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> uxIndex </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> uxIndex</span><span style="color: #81A1C1">++</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Índice: %u</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">unsigned</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">int</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">uxIndex</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O <code>UBaseType_t</code> é frequentemente usado para contadores e índices em loops.</em></p>



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



<h3 class="wp-block-heading"><strong>5.5. Prefixo <code>e</code> (Enumeração)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>e</code> indica que a variável é uma <strong>enumeração</strong> (<code>enum</code>), usada para definir valores simbólicos.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Obtendo o estado de uma tarefa</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" data-code="eTaskState eState;

void app_main(void) {
    eState = eTaskGetState(NULL);
    printf(&quot;Estado da tarefa: %d\n&quot;, eState);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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">eTaskState eState</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    eState </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">eTaskGetState</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Estado da tarefa: %d</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> eState</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O <code>eTaskGetState()</code> retorna um valor do tipo <code>eTaskState</code>, que segue a convenção <code>e</code>.</em></p>



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



<h3 class="wp-block-heading"><strong>5.6. Prefixo <code>p</code> (Pointer)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>p</code> é usado para variáveis que armazenam <strong>ponteiros</strong>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Ponteiro para uma string</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" data-code="char *pMessage = &quot;Olá, FreeRTOS!&quot;;

void app_main(void) {
    printf(&quot;%s\n&quot;, pMessage);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">pMessage </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Olá, FreeRTOS!</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%s</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> pMessage</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O <code>pMessage</code> armazena um ponteiro para uma string.</em></p>



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



<h3 class="wp-block-heading"><strong>5.7. Prefixo <code>s</code> (String)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>s</code> indica que a variável é uma <strong>string</strong>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Definição de uma string</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" data-code="const char *sWelcomeMessage = &quot;Bem-vindo ao FreeRTOS!&quot;;

void app_main(void) {
    printf(&quot;%s\n&quot;, sWelcomeMessage);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">sWelcomeMessage</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Bem-vindo ao FreeRTOS!</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%s</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sWelcomeMessage</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>sWelcomeMessage</code> representa uma string constante.</em></p>



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



<h3 class="wp-block-heading"><strong>5.8. Prefixo <code>pc</code> e <code>pu</code> (Ponteiros para constantes)</strong></h3>



<p class="wp-block-paragraph">Os prefixos <code>pc</code> e <code>pu</code> são usados para indicar <strong>ponteiros para constantes</strong>, diferenciando entre <code>char</code> e <code>unsigned</code>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Ponteiro para constante</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" data-code="const char *pcMessage = &quot;Mensagem constante&quot;;
const uint8_t *puData;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">pcMessage </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Mensagem constante</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">uint8_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">puData</span><span style="color: #81A1C1">;</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/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O <code>pcMessage</code> aponta para uma string constante, enquanto <code>puData</code> pode apontar para um buffer de dados constantes.</em></p>



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



<h3 class="wp-block-heading"><strong>5.9. Prefixo <code>c</code> (Char)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>c</code> indica que a variável é do tipo <code>char</code>.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Armazenando um caractere</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" data-code="char cCharacter = 'A';

void app_main(void) {
    printf(&quot;Caractere: %c\n&quot;, cCharacter);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">char</span><span style="color: #D8DEE9FF"> cCharacter </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">A</span><span style="color: #ECEFF4">&#39;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">app_main</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Caractere: %c</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> cCharacter</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Aqui, <code>cCharacter</code> armazena um único caractere.</em></p>



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



<h3 class="wp-block-heading"><strong>5.10. Prefixo <code>pd</code> (Port Define)</strong></h3>



<p class="wp-block-paragraph">O prefixo <code>pd</code> é usado para <strong>constantes internas do FreeRTOS</strong>, geralmente definindo estados ou resultados de funções.</p>



<h4 class="wp-block-heading"><strong>Exemplo: Uso de <code>pdPASS</code> e <code>pdFALSE</code></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" data-code="if (xTaskCreate(vTaskFunction, &quot;Task&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL) == pdPASS) {
    printf(&quot;Tarefa criada com sucesso!\n&quot;);
}

if (xSemaphoreTake(xSemaphore, 0) == pdFALSE) {
    printf(&quot;Semáforo não disponível.\n&quot;);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> pdPASS</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Tarefa criada com sucesso!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">xSemaphoreTake</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">xSemaphore</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> pdFALSE</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Semáforo não disponível.</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>O <code>pdPASS</code> indica sucesso e <code>pdFALSE</code> indica falha na tentativa de captura do semáforo.</em></p>



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



<h2 class="wp-block-heading"><strong>6. Boas Práticas na Nomenclatura do FreeRTOS</strong></h2>



<p class="wp-block-paragraph">O uso correto da nomenclatura do FreeRTOS não é apenas uma questão de padronização, mas também uma prática essencial para aumentar a legibilidade, manutenibilidade e clareza do código. Aqui estão algumas <strong>boas práticas</strong> recomendadas ao trabalhar com o FreeRTOS.</p>



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



<h3 class="wp-block-heading"><strong>6.1. Use os Prefixos e Sufixos Corretamente</strong></h3>



<p class="wp-block-paragraph">O FreeRTOS adota uma convenção de nomenclatura bem estruturada para ajudar os desenvolvedores a entender rapidamente o propósito de funções e variáveis. Para manter essa clareza:</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Use os prefixos apropriados</strong> para funções:</p>



<ul class="wp-block-list">
<li>Funções que retornam um status devem começar com <code>x</code> (ex.: <code>xTaskCreate()</code>).</li>



<li>Funções que não retornam valores devem começar com <code>v</code> (ex.: <code>vTaskDelay()</code>).</li>



<li>Funções que podem ser chamadas dentro de interrupções devem terminar com <code>FromISR</code> (ex.: <code>xQueueSendFromISR()</code>).</li>
</ul>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Use os tipos de dados apropriados</strong>:</p>



<ul class="wp-block-list">
<li>Utilize <code>BaseType_t</code> e <code>UBaseType_t</code> para variáveis de controle.</li>



<li>Use <code>TickType_t</code> para valores relacionados ao tempo.</li>



<li>Manipuladores devem ser sempre declarados com seus respectivos tipos (<code>TaskHandle_t</code>, <code>QueueHandle_t</code>, etc.).</li>
</ul>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Respeite a nomenclatura dos sufixos</strong>:</p>



<ul class="wp-block-list">
<li>Para variáveis que representam tempo, use <code>Ticks</code> ou <code>MS</code>.</li>



<li>Para ponteiros, use <code>p</code>, <code>pc</code>, ou <code>pu</code>, conforme necessário.</li>



<li>Para caracteres e strings, use <code>c</code> e <code>s</code>.</li>
</ul>



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



<h3 class="wp-block-heading"><strong>6.2. Evite Modificar os Nomes das Funções do FreeRTOS</strong></h3>



<p class="wp-block-paragraph">As funções do FreeRTOS seguem uma convenção bem definida e <strong>não devem ser renomeadas</strong>. Isso pode causar confusão e dificultar a manutenção do código.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Evite fazer isso:</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" data-code="#define CriarTarefa xTaskCreate  // NÃO RECOMENDADO
CriarTarefa(vTaskFunction, &quot;Task1&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #5E81AC; font-weight: bold">#</span><span style="color: #81A1C1">define</span><span style="color: #5E81AC"> </span><span style="color: #88C0D0">CriarTarefa</span><span style="color: #5E81AC"> xTaskCreate</span><span style="color: #616E88">  // NÃO RECOMENDADO</span></span>
<span class="line"><span style="color: #88C0D0">CriarTarefa</span><span style="color: #ECEFF4">(</span><span style="color: #5E81AC">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #5E81AC"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #5E81AC"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #5E81AC"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #5E81AC"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #5E81AC"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</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/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Forma correta:</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" data-code="xTaskCreate(vTaskFunction, &quot;Task1&quot;, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">xTaskCreate</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">vTaskFunction</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Task1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> configMINIMAL_STACK_SIZE</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">NULL</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</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/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Alterar nomes de funções pode tornar o código difícil de entender para outros desenvolvedores.</em></p>



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



<h3 class="wp-block-heading"><strong>6.3. Nomeie Tarefas, Filas e Recursos de Forma Clara</strong></h3>



<p class="wp-block-paragraph">Sempre nomeie tarefas e recursos do FreeRTOS com nomes descritivos que indiquem sua função.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Evite nomes genéricos:</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" data-code="TaskHandle_t xTarefa1;
QueueHandle_t xFila;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TaskHandle_t</span><span style="color: #D8DEE9FF"> xTarefa1</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">QueueHandle_t</span><span style="color: #D8DEE9FF"> xFila</span><span style="color: #81A1C1">;</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/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Use nomes descritivos:</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" data-code="TaskHandle_t xTaskSensor;
QueueHandle_t xQueueMensagens;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #8FBCBB">TaskHandle_t</span><span style="color: #D8DEE9FF"> xTaskSensor</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">QueueHandle_t</span><span style="color: #D8DEE9FF"> xQueueMensagens</span><span style="color: #81A1C1">;</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/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Nomes descritivos tornam o código mais intuitivo e fácil de depurar.</em></p>



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



<h3 class="wp-block-heading"><strong>6.4. Utilize <code>pdMS_TO_TICKS()</code> para Conversão de Tempo</strong></h3>



<p class="wp-block-paragraph">O FreeRTOS mede o tempo em <strong>ticks</strong>, então é essencial converter corretamente valores de tempo em milissegundos para ticks.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Evite valores fixos em ticks:</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" data-code="vTaskDelay(100); // NÃO RECOMENDADO, pois depende da configuração do sistema
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">100</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // NÃO RECOMENDADO, pois depende da configuração do sistema</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/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Use <code>pdMS_TO_TICKS()</code>:</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" data-code="vTaskDelay(pdMS_TO_TICKS(100)); // Correto e portátil
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">100</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Correto e portátil</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/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Isso garante que o código funcione corretamente em diferentes configurações de <code>configTICK_RATE_HZ</code>.</em></p>



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



<h3 class="wp-block-heading"><strong>6.5. Declare Variáveis no Escopo Adequado</strong></h3>



<p class="wp-block-paragraph">Variáveis globais podem ser úteis, mas devem ser usadas com cuidado para evitar conflitos e garantir encapsulamento.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Use escopo local sempre que possível</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" data-code="void vTaskFunction(void *pvParameters) {
    uint32_t ulContador = 0; // Variável local, melhor encapsulamento
    while (1) {
        ulContador++;
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskFunction</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">uint32_t</span><span style="color: #D8DEE9FF"> ulContador </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Variável local, melhor encapsulamento</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        ulContador</span><span style="color: #81A1C1">++;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Evite variáveis globais desnecessárias</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" data-code="uint32_t ulContadorGlobal; // Pode causar conflitos e dificultar depuração

void vTaskFunction(void *pvParameters) {
    while (1) {
        ulContadorGlobal++;
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">uint32_t</span><span style="color: #D8DEE9FF"> ulContadorGlobal</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Pode causar conflitos e dificultar depuração</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskFunction</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        ulContadorGlobal</span><span style="color: #81A1C1">++;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Sempre prefira variáveis locais, a menos que seja essencial compartilhá-las entre tarefas.</em></p>



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



<h3 class="wp-block-heading"><strong>6.6. Documente Seu Código</strong></h3>



<p class="wp-block-paragraph">O FreeRTOS facilita o desenvolvimento de sistemas embarcados, mas um código mal documentado pode se tornar difícil de entender e manter.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Exemplo de código bem documentado:</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" data-code="/**
 * @brief  Função da tarefa que lê sensores periodicamente.
 * @param  pvParameters: Parâmetros da tarefa (não usados aqui).
 */
void vTaskSensor(void *pvParameters) {
    while (1) {
        printf(&quot;Lendo sensor...\n&quot;);
        vTaskDelay(pdMS_TO_TICKS(1000)); // Espera 1 segundo
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #81A1C1">@brief</span><span style="color: #616E88">  Função da tarefa que lê sensores periodicamente.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #81A1C1">@param</span><span style="color: #616E88">  </span><span style="color: #D8DEE9">pvParameters</span><span style="color: #616E88">: Parâmetros da tarefa (não usados aqui).</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">vTaskSensor</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">pvParameters</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Lendo sensor...</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">vTaskDelay</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">pdMS_TO_TICKS</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">1000</span><span style="color: #ECEFF4">))</span><span style="color: #81A1C1">;</span><span style="color: #616E88"> // Espera 1 segundo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>Uma boa documentação ajuda a equipe de desenvolvimento e facilita futuras manutenções.</em></p>



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



<h3 class="wp-block-heading"><strong>6.7. Teste e Valide o Código Com Regularidade</strong></h3>



<p class="wp-block-paragraph">Ao trabalhar com o FreeRTOS, é essencial testar o código regularmente para garantir que ele funcione corretamente e não tenha problemas de concorrência.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dicas para testes eficazes:</strong></p>



<ul class="wp-block-list">
<li>Use <code>configASSERT()</code> para verificar condições críticas.</li>



<li>Monitore o uso de memória e pilha (<code>uxTaskGetStackHighWaterMark()</code>).</li>



<li>Teste cenários de alta concorrência e preempção para evitar <strong>deadlocks</strong> e <strong>starvation</strong>.</li>
</ul>



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



<h3 class="wp-block-heading"><strong>Conclusão</strong></h3>



<p class="wp-block-paragraph">O FreeRTOS fornece um sistema operacional leve e eficiente para sistemas embarcados, mas seu uso correto exige boas práticas na nomenclatura e estrutura do código. Resumindo:</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Use os prefixos e sufixos corretamente</strong> para garantir legibilidade.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Não modifique nomes das funções do FreeRTOS</strong> para manter compatibilidade.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dê nomes descritivos a tarefas, filas e semáforos</strong> para facilitar manutenção.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Sempre converta milissegundos para ticks com <code>pdMS_TO_TICKS()</code></strong>.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Evite variáveis globais desnecessárias</strong> para reduzir riscos de conflitos.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Documente e teste seu código regularmente</strong> para manter qualidade.</p>



<p class="wp-block-paragraph">Seguindo essas boas práticas, você garantirá que seus projetos baseados no FreeRTOS sejam mais organizados, confiáveis e fáceis de manter.</p>



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



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/rtos/introducao-a-nomenclatura-do-freertos/">Introdução à Nomenclatura do FreeRTOS</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">131</post-id>	</item>
	</channel>
</rss>
