FreeRTOS信号量实战:从原理到UART解析器应用
1. 从“抢厕所”到“信号量”一个嵌入式老兵的实战理解搞嵌入式开发尤其是用上FreeRTOS这种实时操作系统信号量Semaphore绝对是你绕不开的一个核心概念。很多新手教程一上来就讲“信号量是用于任务间同步和互斥的机制”这句话本身没错但太抽象了听完还是不知道怎么用更不知道为什么用。今天我不打算复述手册而是想用一个我亲身经历过的、极其生活化的“抢厕所”场景来帮你彻底搞懂FreeRTOS信号量的本质、用法和那些手册里不会写的“坑”。想象一下你办公室里只有一个卫生间共享资源。当A同事进去后他通常会从里面把门锁上获取互斥锁。这个“锁门”的动作本质上就是一个二值信号量Binary Semaphore的获取操作。它确保了在任意时刻卫生间这个资源只被一个人一个任务独占使用避免了尴尬数据竞争或资源冲突。当A同事用完出来他会打开锁释放信号量这时在门外排队阻塞的B同事才能进去。如果有多个人想同时用就必须排队这个排队机制就是信号量提供的任务调度能力。但是如果你们公司比较豪建了三个独立的隔间多个同类资源。那么管理这三个隔间的就更像是一个计数信号量Counting Semaphore。初始值为3每进去一个人信号量值减1每出来一个人信号量值加1。当信号量值减到0时意味着所有隔间都满了后来的人就得排队等待。这个模型非常适合管理像缓冲区、内存池这类有多个实例的资源。而互斥信号量Mutex可以看作是二值信号量的一个“高配版”它增加了“优先级继承”机制。继续用厕所例子假设高优先级的领导高优先级任务和低优先级的你低优先级任务都要上厕所。如果低优先级的你占着厕所持有普通二值信号量这时领导来了他只能在门口干等阻塞这可能导致系统响应不及时。但如果用的是互斥量当领导来等待时系统会临时把你的优先级提升到和领导一样高让你能尽快“用完厕所”释放资源从而减少高优先级任务的阻塞时间。这个机制对于防止优先级反转至关重要。所以FreeRTOS的信号量无论是二值、计数还是互斥量其核心思想就是用一个计数器来安全、高效地管理任务对共享资源的访问秩序。它不仅仅是“同步”更深层次是解决多任务环境下因资源共享和竞争带来的秩序问题。理解了这一点我们再去看API就会清晰很多。2. FreeRTOS信号量API的“正确打开方式”与隐藏细节FreeRTOS提供了两套创建信号量的函数xSemaphoreCreateBinary()/xSemaphoreCreateCounting()和xSemaphoreCreateBinaryStatic()/xSemaphoreCreateCountingStatic()以及对应的xSemaphoreCreateMutex()。很多教程只告诉你用前者但这里面有门道。2.1 动态创建 vs. 静态创建不仅仅是内存来源不同xSemaphoreCreateBinary()是动态创建它会在FreeRTOS的堆heap中申请内存。这很方便但带来了两个潜在问题堆碎片化频繁地创建和删除信号量特别是在某些动态模式下可能导致堆内存产生碎片最终可能因为无法找到一块连续内存而创建失败这种错误在长时间运行的设备上可能是致命的。实时性不确定性动态内存分配pvPortMalloc的时间是不确定的在严格的硬实时系统中这可能会带来风险。// 动态创建二值信号量常见但不一定最优 SemaphoreHandle_t xBinarySemaphore; xBinarySemaphore xSemaphoreCreateBinary(); if (xBinarySemaphore NULL) { // 创建失败可能是堆内存不足 }xSemaphoreCreateBinaryStatic()则需要你预先分配好内存通常是全局变量或静态数组并将指针传给API。这完全消除了堆内存分配的不确定性和碎片化风险非常适合资源受限、要求确定性的嵌入式系统。// 静态创建二值信号量更稳健的选择 StaticSemaphore_t xSemaphoreBuffer; // 静态内存缓冲区 SemaphoreHandle_t xBinarySemaphore; xBinarySemaphore xSemaphoreCreateBinaryStatic(xSemaphoreBuffer); // 无需检查NULL因为内存已提前确保我的经验之谈在产品级代码中尤其是对可靠性要求高的场合我强烈建议默认使用静态创建。在系统初始化阶段main函数或某个初始化任务中集中创建所有需要的信号量、队列、任务等内核对象。这就像在盖房子前就把所有建材备齐而不是边盖边买能让整个系统的内存布局和运行行为更加可控和可预测。2.2 “Give”与“Take”理解阻塞的本质xSemaphoreGive()和xSemaphoreTake()是信号量操作的核心。它们的原型是BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore ); BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );关键在xTicksToWait这个参数。它决定了任务在尝试获取Take一个信号量时的行为0非阻塞模式。获取不到立即返回pdFAIL。portMAX_DELAY无限期阻塞直到成功获取。其他Tick值阻塞指定的时间长度超时则返回pdFAIL。这里有一个极易踩坑的点二值信号量的初始状态。通过xSemaphoreCreateBinary()创建的信号量初始状态是“空”的计数值为0。这意味着如果一个任务在创建后立即去Take这个信号量它会被阻塞直到另一个任务先Give一次。这个设计常常让新手困惑他们本以为创建后就可以直接Take成功。正确的使用模式通常是一个任务如生产者先Give另一个任务如消费者在Take。SemaphoreHandle_t xDataReadySem; void vProducerTask(void *pvParameters) { while(1) { // ... 生产数据 ... xSemaphoreGive(xDataReadySem); // 数据就绪发出信号 vTaskDelay(pdMS_TO_TICKS(100)); } } void vConsumerTask(void *pvParameters) { while(1) { // 等待数据就绪信号无限期阻塞 if (xSemaphoreTake(xDataReadySem, portMAX_DELAY) pdPASS) { // ... 消费数据 ... } } } // 在main中 xDataReadySem xSemaphoreCreateBinary(); // 注意此时xDataReadySem为“空”Consumer任务会在此阻塞直到Producer第一次Give2.3 互斥量Mutex的特殊性优先级继承的利与弊互斥量用xSemaphoreCreateMutex()创建。它和二值信号量最大的区别就是优先级继承。这是一个重要的安全机制但并非没有代价。优先级继承是如何工作的假设有三个任务L低优先级、M中优先级、H高优先级。L获取了互斥量。H尝试获取同一个互斥量被阻塞。此时FreeRTOS会临时将L的优先级提升到和H相同。L因此能更快地被调度执行从而尽快释放互斥量。L释放互斥量后其优先级恢复原状H成功获取互斥量并运行。这个机制防止了被M中优先级任务“插队”导致H无限期阻塞的“优先级反转”问题。使用互斥量的注意事项不能用于中断服务程序ISR因为xSemaphoreTake可能阻塞而ISR绝不能阻塞。在ISR中需要释放信号量时应使用带中断保护版本的xSemaphoreGiveFromISR()并配合portYIELD_FROM_ISR()进行任务切换。谁获取谁释放这是一个严格的编程纪律。一个任务获取的互斥量必须由同一个任务释放。跨任务释放互斥量会导致逻辑混乱和不可预知的错误。持有时间应尽可能短互斥量锁定的时间越长其他高优先级任务被阻塞的风险就越大会影响系统的实时性。只在对共享资源进行访问的临界区代码段加锁。小心递归互斥量FreeRTOS也提供了xSemaphoreCreateRecursiveMutex()允许同一个任务多次获取同一个互斥量。使用时要非常小心确保获取和释放的次数严格匹配否则会导致锁无法被其他任务获取。3. 信号量实战构建一个UART命令解析器理论说再多不如看一个实际案例。我们构建一个常见的场景通过UART接收不定长的命令帧并在一个独立的任务中解析它们。这里涉及到任务间通信和资源保护。3.1 场景设计与问题分析假设我们有一个串口接收中断每次收到一个字节就放入一个环形缓冲区rxBuffer。同时我们有一个命令解析任务它需要从缓冲区中取出完整的命令帧进行处理。 面临的挑战生产者-消费者问题中断生产者放数据任务消费者取数据。缓冲区保护rxBuffer是一个共享资源中断和任务可能同时访问它比如中断正在写索引任务正在读索引需要互斥保护。高效通知当缓冲区中有新数据时如何高效地通知解析任务而不是让它不断轮询浪费CPU。3.2 实现方案二值信号量 互斥量组合拳我们将使用一个二值信号量来通知数据到达使用一个互斥量来保护环形缓冲区。#include “FreeRTOS.h” #include “task.h” #include “semphr.h” #include “queue.h” // 可能用于传递解析后的命令 // 定义环形缓冲区 #define RX_BUFFER_SIZE 256 static uint8_t rxBuffer[RX_BUFFER_SIZE]; static volatile uint16_t rxWriteIndex 0; // 中断修改任务读取 static uint16_t rxReadIndex 0; // 只有任务修改 static uint16_t dataCount 0; // 缓冲区中数据量用于快速判断 // 定义信号量句柄 static SemaphoreHandle_t xDataReadySem; // 用于通知数据到达 static SemaphoreHandle_t xBufferMutex; // 用于保护缓冲区 // 串口接收中断服务程序 void USART1_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken pdFALSE; if (USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t receivedByte USART_ReceiveData(USART1); // 1. 尝试获取互斥量非阻塞因为是在ISR中 // 注意ISR中不能使用普通的xSemaphoreTake这里我们假设中断写入的索引操作是原子的对于8/16位MCU通常是。 // 更严谨的做法是使用中断安全的队列xQueueSendFromISR来代替手动缓冲区管理。 // 此处为演示信号量我们简化处理认为写索引是原子的。 uint16_t nextWriteIndex (rxWriteIndex 1) % RX_BUFFER_SIZE; if (nextWriteIndex ! rxReadIndex) { // 缓冲区未满 rxBuffer[rxWriteIndex] receivedByte; rxWriteIndex nextWriteIndex; // 2. 释放二值信号量通知解析任务 xSemaphoreGiveFromISR(xDataReadySem, xHigherPriorityTaskWoken); } else { // 缓冲区满数据丢失可以增加错误计数 } // 如果有任务被唤醒且优先级高于当前被中断的任务需要进行上下文切换 portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } } // 命令解析任务 void vCommandParserTask(void *pvParameters) { uint8_t cmdBuffer[128]; uint8_t cmdLen 0; while (1) { // 等待数据到达信号无限期阻塞 if (xSemaphoreTake(xDataReadySem, portMAX_DELAY) pdPASS) { // 收到信号开始处理缓冲区数据 // 3. 在操作共享缓冲区前获取互斥量 xSemaphoreTake(xBufferMutex, portMAX_DELAY); // 临界区开始安全地读取缓冲区 while (rxReadIndex ! rxWriteIndex) { uint8_t data rxBuffer[rxReadIndex]; rxReadIndex (rxReadIndex 1) % RX_BUFFER_SIZE; // 简单的命令帧解析逻辑例如以换行符结尾 if (data ‘\n’) { cmdBuffer[cmdLen] ‘\0’; // 字符串结束符 // 处理命令 cmdBuffer... cmdLen 0; // 重置为下一帧准备 } else if (cmdLen sizeof(cmdBuffer) - 1) { cmdBuffer[cmdLen] data; } } // 临界区结束 // 4. 操作完成释放互斥量 xSemaphoreGive(xBufferMutex); } } } // 系统初始化 int main(void) { // 硬件初始化UART等... // 创建信号量使用静态创建以增强确定性 static StaticSemaphore_t xDataReadySemBuffer, xBufferMutexBuffer; xDataReadySem xSemaphoreCreateBinaryStatic(xDataReadySemBuffer); xBufferMutex xSemaphoreCreateMutexStatic(xBufferMutexBuffer); // 注意二值信号量初始为“空”解析任务会在此等待 // 互斥量初始为“可用” // 创建解析任务 xTaskCreate(vCommandParserTask, “Parser”, 256, NULL, 2, NULL); // 启动调度器 vTaskStartScheduler(); while (1); }3.3 方案点评与优化思考这个方案清晰地展示了两种信号量的分工二值信号量xDataReadySem充当“事件标志”。ISR每收到一个字节就Give一次快速通知任务有数据待处理。即使ISR连续触发多次Give二值信号量的值也只会是1满不会丢失通知事件但也不会计数。这意味着如果任务处理较慢它无法知道中间累积了多少次Give它只知道自己需要去处理。互斥量xBufferMutex保护共享的环形缓冲区rxBuffer及其索引变量。确保任务在读取/修改索引时不会被ISR打断防止数据错乱。潜在问题与优化信号量溢出ISR中频繁Give二值信号量如果任务处理极慢会导致大量冗余的Give调用。虽然二值信号量不会计数但这也是一种CPU浪费。对于这种高频数据流更好的模式是使用队列Queue。ISR直接通过xQueueSendFromISR将字节送入队列解析任务从队列中接收。队列本身自带缓冲和同步机制更简洁高效。互斥量持有时间解析任务在持有互斥量期间执行了可能较长的命令解析逻辑// 处理命令...部分。这期间ISR无法写入新数据因为写索引也被保护了可能导致数据丢失。最佳实践是临界区应只包含对共享数据结构的访问处理逻辑应放在释放互斥量之后。我们可以先将数据从环形缓冲区拷贝到任务本地的临时数组然后立即释放互斥量再慢慢解析本地数组中的数据。使用计数信号量如果我们想更精确地知道有多少数据到达可以将二值信号量替换为计数信号量初始值设为0。ISR每收到一个字节就Give计数值加1任务每处理一个字节就Take计数值减1。这能更精确地控制生产消费节奏但复杂度也稍高。4. 调试与排坑信号量使用中的常见“雷区”即使理解了原理和API在实际项目中信号量相关的bug依然层出不穷。下面是我总结的几个典型“雷区”及其排查思路。4.1 死锁Deadlock与优先级反转死锁最经典的场景是嵌套锁未按顺序获取。 任务A先锁Mutex1再锁Mutex2。 任务B先锁Mutex2再锁Mutex1。 当两者同时运行时可能A锁了Mutex1B锁了Mutex2然后A等B释放Mutex2B等A释放Mutex1陷入永久等待。排查与规避统一锁顺序为所有互斥量定义一个全局的获取顺序例如按内存地址从低到高所有任务都遵守这个顺序。使用超时在xSemaphoreTake中使用一个合理的超时时间如pdMS_TO_TICKS(100)而不是portMAX_DELAY。超时返回pdFAIL后可以记录错误日志并释放已持有的锁然后重试或进入错误处理流程。工具辅助FreeRTOS的跟踪宏trace功能或一些第三方调试工具如Percepio Tracealyzer可以可视化任务和信号量的状态是发现死锁的利器。优先级反转在未使用互斥量而用二值信号量做互斥或互斥量被禁用优先级继承时可能发生。使用xSemaphoreCreateMutex()创建的互斥量默认启用优先级继承这是防止优先级反转的主要手段。务必确保用于互斥的场景使用的是Mutex而不是Binary Semaphore。4.2 信号量丢失与重复获取信号量丢失常见于二值信号量用于事件通知的场景。如果事件触发非常频繁比如高速数据中断而任务处理较慢可能会发生事件1触发信号量置位事件2紧接着触发再次调用xSemaphoreGive但信号量已经是满的这次Give操作没有效果对于二值信号量满的时候再Give不会改变状态。当任务处理完事件1并Take信号量后信号量变空但事件2的通知已经“丢失”了。任务会等待下一个事件触发而事件2已经被遗漏。解决方案对于高频事件应使用队列或计数信号量。计数信号量可以累积事件次数。重复获取Double Take而未释放一个任务成功Take了一个互斥量后在释放之前由于逻辑错误再次Take同一个互斥量。对于普通互斥量这会导致任务永久阻塞自己死锁。需要使用递归互斥量Recursive Mutex来避免但需谨慎。4.3 在中断中使用信号量的严格限制这是一个硬性规则绝对不能在ISR中使用xSemaphoreTake()因为Take可能阻塞。在ISR中只能使用xSemaphoreGiveFromISR()、xSemaphoreTakeFromISR()仅用于某些特定场景如释放计数信号量以及xQueueSendFromISR等后缀为FromISR的API。一个常见的错误是在中断中尝试获取一个暂时不可用的信号量来进行同步这会导致系统挂起。正确的模式永远是“中断通知任务由任务去获取信号量”。4.4 内存与性能考量内存开销每个信号量对象无论是动态还是静态创建都占用一定的内存几十字节用于存储信号量的状态、等待列表等。在资源极其紧张的MCU上需要规划好信号量的数量。性能开销信号量的Give和Take操作涉及任务调度和可能的上下文切换是有时间成本的。在极端追求性能的代码路径如极高频率的中断中需要评估是否能用更轻量级的机制如原子操作、标志位替代。等待列表当多个任务阻塞在同一个信号量上时FreeRTOS会按照任务优先级管理一个等待列表。释放信号量时会唤醒等待列表中优先级最高的任务。理解这一点有助于分析复杂任务间的调度行为。信号量是FreeRTOS多任务编程的基石之一它抽象了任务间协同工作的复杂细节。掌握它不仅仅是记住几个API更是要理解其背后的同步原语思想并在具体的项目场景中做出恰当的选择和设计。从简单的二值信号量通知到互斥量保护临界区再到计数信号量管理资源池每一步都需要结合实际情况仔细权衡。多写代码多踩坑多使用调试工具观察任务和信号量的状态是掌握它的不二法门。

相关新闻

智能体操作系统(AOS)架构解析:从核心原理到工程实践

智能体操作系统(AOS)架构解析:从核心原理到工程实践

1. 项目概述:当智能体遇见操作系统 最近和几个做系统架构和AI应用落地的朋友聊天,大家不约而同地提到了一个词: Agent Operating Systems (AOS) ,或者说“智能体操作系统”。这听起来像是一个缝合怪,把当下最火的AI智…

2026/8/20 13:29:18 阅读更多 →
发动机转速控制:从PID原理到硬件选型与参数整定实战

发动机转速控制:从PID原理到硬件选型与参数整定实战

1. 项目概述:发动机转速控制的本质与价值 在动力机械领域,无论是汽车引擎、工业发电机还是船舶推进系统,发动机转速控制都是一个核心且永恒的话题。它远不止是让指针稳定在某个刻度那么简单,而是关乎效率、寿命、安全与性能的精密…

2026/8/19 12:55:00 阅读更多 →
ESP32-S3驱动LED点阵屏实现数字雨与动态光效全解析

ESP32-S3驱动LED点阵屏实现数字雨与动态光效全解析

1. 项目概述:打造动态光影艺术的核心最近在捣鼓一个挺有意思的玩意儿,用ESP32-S3驱动一块LED点阵屏,实现类似《黑客帝国》里那种酷炫的数字雨(Waterfall)效果,再叠加各种动态光效。这不仅仅是让灯条闪一闪那…

2026/8/19 12:55:00 阅读更多 →

最新新闻

当系统弹出“此 Mac 已不支持“:OpenCore Legacy Patcher 把 2007 年的老 Mac 一路续到 Sequoia

当系统弹出“此 Mac 已不支持“:OpenCore Legacy Patcher 把 2007 年的老 Mac 一路续到 Sequoia

当系统弹出"此 Mac 已不支持":OpenCore Legacy Patcher 把 2007 年的老 Mac 一路续到 Sequoia 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patche…

2026/8/20 14:59:28 阅读更多 →
动物森友会修改器 NHSE 完整上手指南:零基础把存档玩出花

动物森友会修改器 NHSE 完整上手指南:零基础把存档玩出花

动物森友会修改器 NHSE 完整上手指南:零基础把存档玩出花 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE 存档编辑器(Animal Crossing: New Horizons save editor&…

2026/8/20 14:59:28 阅读更多 →
NBTExplorer快速上手全攻略:一次看懂Minecraft存档数据编辑

NBTExplorer快速上手全攻略:一次看懂Minecraft存档数据编辑

NBTExplorer快速上手全攻略:一次看懂Minecraft存档数据编辑 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款免费开源的NBT编辑器&…

2026/8/20 14:59:28 阅读更多 →
别乱选投票小程序!真正好用的免费款在这里

别乱选投票小程序!真正好用的免费款在这里

你是不是也遇到过这种情况:临时要办一场评选活动,随手找了个投票小程序,结果活动做到一半,页面弹窗提示“导出数据需开通VIP”,或者链接刚发出去就被刷票大军攻陷,更糟心的是活动页面突然卡死,几…

2026/8/20 14:59:28 阅读更多 →
图片转STL免费工具ImageToSTL怎么用:一条命令把照片变成可3D打印的浮雕模型

图片转STL免费工具ImageToSTL怎么用:一条命令把照片变成可3D打印的浮雕模型

图片转STL免费工具ImageToSTL怎么用:一条命令把照片变成可3D打印的浮雕模型 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated …

2026/8/20 14:59:27 阅读更多 →
论文大纲逻辑理不清,有哪些专业的AI论文写作软件推荐?

论文大纲逻辑理不清,有哪些专业的AI论文写作软件推荐?

每到毕业季,很多同学都卡在开题报告的第一步:选题定不下来、研究背景和意义分不清、文献综述无从下手、研究方法和技术路线逻辑混乱,盯着空白文档发愁好几天也写不出完整框架。尤其是零基础、在职读研、跨专业的学生,对高校开题规…

2026/8/20 14:58:27 阅读更多 →

日新闻

Framework笔记本BIOS更新变砖,“可维修”承诺遭遇芯片级维修考验!

Framework笔记本BIOS更新变砖,“可维修”承诺遭遇芯片级维修考验!

Framework笔记本BIOS更新引“变砖”危机2026年7月7日,Framework向用户quantum5发送邮件,建议其安装BIOS 3.20更新。然而,更新后电脑出现严重问题,屏幕显示三角形和随机像素图案,风扇狂转,系统完全挂起。qua…

2026/8/20 0:00:46 阅读更多 →
2026还在担忧建站平台哪家好?手把手带你搭建自家网站!

2026还在担忧建站平台哪家好?手把手带你搭建自家网站!

2026还在担忧建站平台哪家好?手把手带你搭建自家网站!据艾瑞咨询发布的《2026年中国企业数字化服务市场研究报告》,2025年国内网站建设市场规模已达896亿元,同比增长18.7%。中国互联网络信息中心数据显示,截至2025年底…

2026/8/20 0:00:46 阅读更多 →
2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?

2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?

2026高端网站建设公司哪家好?怎么选才能不花冤枉钱?据艾瑞咨询《2026年中国企业数字化服务市场研究报告》,2025年国内网站建设市场规模已达896亿元,其中高端定制网站服务占比突破42%。更值得关注的是,91%的规模以上企业…

2026/8/20 0:00:46 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/19 11:55:18 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 9:46:27 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/19 7:42:22 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/19 11:55:13 阅读更多 →