<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>嵌入式 on 蛋蛋忧桑</title><link>https://dandansad.com/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/</link><description>Recent content in 嵌入式 on 蛋蛋忧桑</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Tue, 06 May 2025 21:21:12 +0800</lastBuildDate><atom:link href="https://dandansad.com/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>三种 FreeRTOS 通信方式</title><link>https://dandansad.com/2025/05/06/%E4%B8%89%E7%A7%8D-freertos-%E9%80%9A%E4%BF%A1%E6%96%B9%E5%BC%8F/</link><pubDate>Tue, 06 May 2025 21:21:12 +0800</pubDate><guid>https://dandansad.com/2025/05/06/%E4%B8%89%E7%A7%8D-freertos-%E9%80%9A%E4%BF%A1%E6%96%B9%E5%BC%8F/</guid><description>&lt;p&gt;在嵌入式系统中，任务之间的通信是实现并发、同步和资源共享的关键。FreeRTOS 提供了多种通信机制，以满足不同的应用场景和性能要求。本文将重点介绍三种常用的通信方式：&lt;strong&gt;消息队列（Queue）&lt;/strong&gt;、&lt;strong&gt;邮箱（Semaphore）和任务通知（Task Notification）&lt;/strong&gt;，并通过代码示例分析其适用场景和使用方法。&lt;/p&gt;
&lt;h2 id="一消息队列queue"&gt;&lt;a href="#%e4%b8%80%e6%b6%88%e6%81%af%e9%98%9f%e5%88%97queue" class="header-anchor"&gt;&lt;/a&gt;一、消息队列（Queue）
&lt;/h2&gt;&lt;h3 id="概述"&gt;&lt;a href="#%e6%a6%82%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;概述
&lt;/h3&gt;&lt;p&gt;消息队列用于在任务之间&lt;strong&gt;传递消息或数据&lt;/strong&gt;。它可以存储多个数据项，常用于任务与任务、中断与任务之间的通信，适合需要“带数据”传递的情况。&lt;/p&gt;
&lt;h3 id="使用场景"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;使用场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;按钮中断向任务传递事件编号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;任务间传输传感器值、指令等&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例代码"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;示例代码
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 定义一个整型队列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;QueueHandle_t my_queue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 初始化队列，容量为10，每个元素是int类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;my_queue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xQueueCreate&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 消费者任务：从队列接收数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;consumer_task&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; received_data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;xQueueReceive&lt;/span&gt;(my_queue, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;received_data, portMAX_DELAY)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Received value: %d&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, received_data);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 在此处理数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 中断服务程序：向队列发送数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EXTI_IRQHandler&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;42&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BaseType_t xHigherPriorityTaskWoken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pdFALSE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;xQueueSendFromISR&lt;/span&gt;(my_queue, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;data, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;xHigherPriorityTaskWoken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;portYIELD_FROM_ISR&lt;/span&gt;(xHigherPriorityTaskWoken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="特点"&gt;&lt;a href="#%e7%89%b9%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;特点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ 可传递任意数据类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ 可用于任务与中断间通信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ 内存开销略大&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ 比任务通知慢一些&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二邮箱semaphore"&gt;&lt;a href="#%e4%ba%8c%e9%82%ae%e7%ae%b1semaphore" class="header-anchor"&gt;&lt;/a&gt;二、邮箱（Semaphore）
&lt;/h2&gt;&lt;h3 id="概述-1"&gt;&lt;a href="#%e6%a6%82%e8%bf%b0-1" class="header-anchor"&gt;&lt;/a&gt;概述
&lt;/h3&gt;&lt;p&gt;邮箱本质上是一种&lt;strong&gt;二值信号量&lt;/strong&gt;，主要用于任务同步，不承载数据。它常被用作“任务启动信号”或“事件通知”，而非传输数据。&lt;/p&gt;
&lt;h3 id="使用场景-1"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af-1" class="header-anchor"&gt;&lt;/a&gt;使用场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通知任务“有事情要做了”，但不传递数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中断触发任务启动&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例代码-1"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81-1" class="header-anchor"&gt;&lt;/a&gt;示例代码
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 创建一个二值信号量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SemaphoreHandle_t binary_semaphore;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 初始化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;binary_semaphore &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xSemaphoreCreateBinary&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 任务：等待信号量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;led_task&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;xSemaphoreTake&lt;/span&gt;(binary_semaphore, portMAX_DELAY)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Button pressed, toggle LED.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 翻转 LED 状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 中断服务程序：发送信号量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;button_isr&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BaseType_t xHigherPriorityTaskWoken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pdFALSE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;xSemaphoreGiveFromISR&lt;/span&gt;(binary_semaphore, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;xHigherPriorityTaskWoken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;portYIELD_FROM_ISR&lt;/span&gt;(xHigherPriorityTaskWoken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="特点-1"&gt;&lt;a href="#%e7%89%b9%e7%82%b9-1" class="header-anchor"&gt;&lt;/a&gt;特点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ 简单高效&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ 适合事件同步（不含数据）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ 无法携带数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ 支持中断触发&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三任务通知task-notification"&gt;&lt;a href="#%e4%b8%89%e4%bb%bb%e5%8a%a1%e9%80%9a%e7%9f%a5task-notification" class="header-anchor"&gt;&lt;/a&gt;三、任务通知（Task Notification）
&lt;/h2&gt;&lt;h3 id="概述-2"&gt;&lt;a href="#%e6%a6%82%e8%bf%b0-2" class="header-anchor"&gt;&lt;/a&gt;概述
&lt;/h3&gt;&lt;p&gt;任务通知是 FreeRTOS 中一种&lt;strong&gt;轻量级的任务间通信机制&lt;/strong&gt;，每个任务有一个 32 位的“通知值”，可以在任务之间或中断中更新和读取。它支持传递一个整数值，效率高，是性能最优的通信方式。&lt;/p&gt;
&lt;h3 id="使用场景-2"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af-2" class="header-anchor"&gt;&lt;/a&gt;使用场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;单一任务之间快速通信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按钮等中断触发简单事件通知&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;替代低开销信号量和队列&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例代码-2"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81-2" class="header-anchor"&gt;&lt;/a&gt;示例代码
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 假设我们已经获得任务句柄 task_handle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 任务：等待通知
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;notify_task&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;uint32_t&lt;/span&gt; value;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 阻塞等待通知，并获取通知值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;xTaskNotifyWait&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;value, portMAX_DELAY)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Received notify value: %lu&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 响应事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 中断服务程序：发送通知
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;notify_isr&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BaseType_t xHigherPriorityTaskWoken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pdFALSE;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;xTaskNotifyFromISR&lt;/span&gt;(task_handle, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, eSetValueWithOverwrite, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;xHigherPriorityTaskWoken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;portYIELD_FROM_ISR&lt;/span&gt;(xHigherPriorityTaskWoken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="特点-2"&gt;&lt;a href="#%e7%89%b9%e7%82%b9-2" class="header-anchor"&gt;&lt;/a&gt;特点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ 传输单个整数值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ 效率最高、开销最小&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ 每个任务只能有一个通知槽位&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ 适合中断触发事件通知&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四总结对比"&gt;&lt;a href="#%e5%9b%9b%e6%80%bb%e7%bb%93%e5%af%b9%e6%af%94" class="header-anchor"&gt;&lt;/a&gt;四、总结对比
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;消息队列&lt;/th&gt;
					&lt;th&gt;邮箱（信号量）&lt;/th&gt;
					&lt;th&gt;任务通知&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;是否传递数据&lt;/td&gt;
					&lt;td&gt;✅ 是（任意类型）&lt;/td&gt;
					&lt;td&gt;❌ 否（仅通知）&lt;/td&gt;
					&lt;td&gt;✅ 是（单个整数）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;是否支持中断调用&lt;/td&gt;
					&lt;td&gt;✅ 是&lt;/td&gt;
					&lt;td&gt;✅ 是&lt;/td&gt;
					&lt;td&gt;✅ 是&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;通信效率&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;最高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;资源开销&lt;/td&gt;
					&lt;td&gt;较大（占用内存）&lt;/td&gt;
					&lt;td&gt;小&lt;/td&gt;
					&lt;td&gt;最小（无堆内存）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;多对一通信支持&lt;/td&gt;
					&lt;td&gt;✅ 支持（多个任务写入）&lt;/td&gt;
					&lt;td&gt;✅ 支持&lt;/td&gt;
					&lt;td&gt;❌ 单槽位，需注意覆盖&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;典型使用场景&lt;/td&gt;
					&lt;td&gt;传输数据、任务调度&lt;/td&gt;
					&lt;td&gt;同步任务、事件触发&lt;/td&gt;
					&lt;td&gt;快速事件触发、ISR通信&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>