FreeRTOS任务管理:嵌入式实时系统多任务调度核心机制详解
1. 项目概述为什么FreeRTOS的任务管理是嵌入式开发的基石如果你正在用STM32、GD32这类单片机做稍微复杂一点的项目比如同时要处理按键扫描、屏幕刷新、数据采集和网络通信很快就会发现裸机编程里那套while(1)加状态机的写法捉襟见肘。这时候一个实时操作系统RTOS就成了必需品而FreeRTOS因其开源、免费、可裁剪和生态完善几乎成了嵌入式领域的“普通话”。我见过太多项目从简单的多任务调度到复杂的系统集成核心都绕不开对FreeRTOS任务管理的深刻理解。所谓“任务管理”听起来很抽象但你可以把它想象成一个超级高效的“车间调度员”。在单片机的单核CPU这个“车间”里有多个“工人”任务等着干活。调度员的核心工作就是决定现在该让哪个工人上工位获得CPU执行权哪个工人需要暂时休息挂起哪个工人的工作完成了可以下班删除以及如何协调工人之间传递物料通信与同步FreeRTOS提供了一套完整的机制来实现这个调度包括任务的创建、删除、挂起、恢复、优先级设置以及状态查询。掌握它你才能真正让单片机的性能被高效、可靠地组织起来而不是写出一堆难以维护、随时可能卡死的“面条代码”。2. FreeRTOS任务管理的核心机制与设计思路2.1 任务的生命周期从创建到消亡一个任务在FreeRTOS中并非一直存在它有自己的生命周期。理解这个生命周期是进行有效任务管理的前提。任务创建 (xTaskCreate / xTaskCreateStatic)这是任务的起点。xTaskCreate是动态创建系统会从堆heap中分配任务控制块TCB和栈空间。它的优点是使用简单但会产生内存碎片。xTaskCreateStatic则是静态创建需要开发者预先分配好TCB和栈的内存数组然后传入函数。这在内存受限或对实时性、确定性要求极高的系统如汽车电子功能安全ASIL等级项目中是首选因为它避免了运行时动态内存分配的不确定性。创建任务时你需要明确几个关键参数任务函数 (pvTaskCode)一个永不返回的C函数里面通常是一个无限循环代表这个任务要持续做的工作。任务名 (pcName)一个字符串标识符主要用于调试和可视化工具如FreeRTOSTrace中识别任务。栈深度 (usStackDepth)以字Word为单位。这里是最容易踩坑的地方之一。栈深度不是随便填的它需要容纳任务函数局部变量、函数调用链以及中断上下文。给少了会栈溢出导致各种诡异崩溃给多了又浪费宝贵的内存。我通常的做法是先设置一个较大的值如1024运行一段时间后通过FreeRTOS提供的uxTaskGetStackHighWaterMark()函数查询任务运行过程中栈使用的“高水位线”然后在此基础上增加20%-30%的安全余量作为最终值。任务参数 (pvParameters)一个void指针可以指向任何你想传递给任务函数的数据结构用于任务初始化。优先级 (uxPriority)数值越大优先级越高。FreeRTOS是一个优先级抢占式内核高优先级任务一旦就绪会立刻抢占低优先级任务的CPU。优先级设置是任务调度策略的核心。任务句柄 (pxCreatedTask)输出参数返回一个TaskHandle_t类型的句柄。这个句柄就像是这个任务的“身份证”后续你要对这个任务进行挂起、恢复、删除或修改优先级等操作都需要通过这个句柄来指定目标。任务就绪与运行创建后任务进入就绪态等待调度器根据优先级将其切换到运行态。一旦开始运行它将一直执行直到发生以下几种情况之一主动调用taskYIELD()或遇到调度点如vTaskDelay、队列操作主动让出CPU。被更高优先级的任务抢占。调用vTaskSuspend()挂起自己。任务函数执行完毕虽然通常不应该返回。任务挂起与恢复挂起(vTaskSuspend)是一种强制让任务停止运行的方法被挂起的任务不会参与调度无论其优先级多高。恢复(vTaskResume)则让其重新回到就绪态。这个机制常用于调试、或者需要临时冻结某个非关键任务以节省功耗的场景。注意挂起一个任务时如果它正在等待某个信号量或队列这个等待状态会被保留恢复后它将继续等待。这与删除任务不同。任务删除 (vTaskDelete)当任务完成其使命后应该被删除以释放资源。调用vTaskDelete(NULL)可以删除任务自身传入任务句柄则可以删除其他任务。这里有一个非常重要的细节动态创建的任务被删除后其TCB和栈内存会被自动释放回堆。但是如果任务在删除时它所占用的其他资源如它分配的动态内存、它持有的信号量/互斥量没有正确释放就会导致内存泄漏或资源死锁。因此一个良好的实践是在任务函数的最后或者在一个专门的清理函数中确保释放所有已申请的资源然后再调用vTaskDelete(NULL)。2.2 任务调度策略抢占、时间片与合作FreeRTOS的调度器是任务管理的“大脑”它决定了CPU时间的分配规则。固定优先级抢占式调度这是FreeRTOS默认的、也是最核心的调度方式。其规则很简单永远运行当前处于就绪态的、优先级最高的任务。一旦有更高优先级的任务就绪比如一个高优先级任务等待的延时到了或者收到了它等待的消息调度器会立即中断当前正在运行的低优先级任务切换到高优先级任务运行。这种调度方式保证了高实时性要求的任务能得到最快速的响应。时间片轮转调度当多个任务具有相同优先级时抢占式调度就失效了。此时FreeRTOS可以配置为使用时间片轮转调度。调度器会为每个同优先级任务分配一个固定的时间片通常是一个系统时钟节拍tick的整数倍。任务运行完一个时间片后会被强制切换到同优先级的下一个就绪任务。这实现了在相同重要性任务之间的公平调度。这个功能需要通过configUSE_TIME_SLICING宏定义来开启。协作式调度这是一种古老的调度方式现在很少用。在这种模式下任务不会被动被抢占必须主动调用taskYIELD()来让出CPU。如果有一个任务陷入死循环且不让出CPU整个系统就会卡死。除非在极其特殊的场景下比如某些对任务切换时序有严苛确定性要求的遗留系统否则不建议使用。实操心得优先级设置的艺术优先级设置不是拍脑袋决定的。一个常见的反模式是“优先级通胀”即为了快速解决问题不断给新任务赋予更高的优先级最终导致所有任务都是高优先级失去了调度的意义。我的经验是采用“速率单调调度”RMS原则的简化版执行周期越短、实时性要求越高的任务优先级应设置得越高。例如一个1ms执行一次的电机控制任务优先级应高于一个100ms执行一次的屏幕刷新任务。同时一定要留出空闲任务IDLE的优先级通常为0并确保至少有一个任务如空闲任务钩子能有机会运行否则系统可能无法进行垃圾回收如果使用了动态内存。2.3 任务控制块与栈管理内核如何“认识”你的任务每个任务在FreeRTOS内核中都有一个对应的任务控制块TCB它是一个数据结构包含了内核管理这个任务所需的全部信息比如任务状态、优先级、栈指针、栈起始地址、任务名等。TCB是任务的“户口本”。栈则是任务的“私人工作台”用于存储局部变量、函数调用时的返回地址和寄存器现场。每个任务都有自己独立的栈空间这是实现多任务并发的关键。栈溢出是嵌入式系统最隐蔽、最难调试的故障之一。FreeRTOS提供了几种栈溢出检测机制通过configCHECK_FOR_STACK_OVERFLOW配置方法1在任务切换时检查栈指针是否超出了栈空间。这种方法开销小但只能检测到已经发生的严重溢出。方法2在任务创建时用特定的模式如0xA5A5A5A5填充栈空间。在任务切换时检查栈末尾的若干字节是否被修改。这种方法能更早地发现栈使用接近极限的情况但开销稍大。强烈建议在开发阶段开启栈溢出检测至少方法2并结合uxTaskGetStackHighWaterMark()定期监控栈使用情况这是保证系统长期稳定运行的必要手段。3. 任务管理API的深度解析与实战应用3.1 核心API函数详解与使用禁忌掌握了原理我们再来看看具体怎么用。FreeRTOS的任务管理API虽然不多但每个都用对地方至关重要。xTaskCreate动态创建的细节BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, configSTACK_DEPTH_TYPE usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask );pvTaskCode任务函数。切记这个函数不应该有return语句除非你明确想在任务结束时删除自己。标准的写法是void vATaskFunction( void *pvParameters ) { for(;;) { /* 任务主体 */ } }。pvParameters传递参数。这是一个强大的功能。例如你可以定义一个结构体包含一个UART句柄和一个缓冲区指针在创建多个串口处理任务时通过这个参数传递不同的句柄实现代码复用。内存不足的应对如果堆内存不足xTaskCreate会返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY。在可靠性要求高的系统中必须检查这个返回值而不是假设创建一定成功。vTaskDelay 与 vTaskDelayUntil精准控制任务周期vTaskDelay()是相对延时它告诉调度器“从现在开始延迟n个tick再让我就绪”。由于任务被唤醒的时间点取决于它调用vTaskDelay的时刻所以任务的执行周期会受其本身运行时间和其他任务调度的影响产生漂移。vTaskDelayUntil()是绝对延时它用于实现固定频率的周期性任务。你传入一个指向TickType_t变量的指针该变量记录了任务下一次应该被唤醒的绝对时间点。函数内部会自动计算需要延时的时间并更新这个时间点。这是实现精准定时任务如PID控制、ADC采样的首选方法能有效避免周期累积误差。// 使用 vTaskDelayUntil 实现精确的100ms周期任务 void vPeriodicTask( void *pvParameters ) { TickType_t xLastWakeTime; const TickType_t xFrequency pdMS_TO_TICKS( 100 ); // 100ms对应的tick数 xLastWakeTime xTaskGetTickCount(); // 初始化唤醒时间基准 for(;;) { // 执行你的周期性工作... read_sensors(); calculate_pid(); // 精确延时到下一个周期点 vTaskDelayUntil( xLastWakeTime, xFrequency ); } }任务状态查询调试的利器eTaskGetState()函数可以获取一个任务当前的状态运行、就绪、阻塞、挂起、删除。这在调试复杂系统时非常有用比如你可以写一个监控任务定期打印所有关键任务的状态当系统出现疑似死锁时能快速定位到哪些任务被阻塞、在等待什么资源。3.2 任务优先级修改与调度器控制动态优先级修改vTaskPrioritySet()允许在运行时改变一个任务的优先级。这个功能要慎用一个典型的应用场景是实现“优先级继承”机制来避免优先级反转虽然FreeRTOS的互斥量xSemaphoreCreateMutex已经内置了优先级继承但有时你可能需要更复杂的逻辑。例如一个低优先级任务L获得了一个共享资源如打印机此时高优先级任务H也需要该资源而被阻塞。如果此时一个中优先级任务M就绪它会抢占L导致H被间接阻塞更久优先级反转。通过临时提升L的优先级到高于M可以使其尽快执行完释放资源从而解决反转问题。调度器锁定与解锁vTaskSuspendAll()和xTaskResumeAll()用于挂起和恢复调度器。当调度器被挂起时不会发生任务切换但中断仍然有效。这用于保护非常短的临界区代码这些代码如果被任务切换打断会导致数据不一致。注意临界区必须尽可能短长时间挂起调度器会导致低优先级任务无法响应破坏实时性。对于保护共享资源更通用的做法是使用信号量或互斥量。3.3 空闲任务与钩子函数系统的幕后功臣当没有其他用户任务运行时FreeRTOS调度器会运行空闲任务IDLE Task其优先级为0最低。空闲任务不仅仅是一个“空循环”它承担着重要职责如果启用了configUSE_PREEMPTION它会执行一些低优先级的后台处理。如果启用了configUSE_IDLE_HOOK开发者可以定义一个vApplicationIdleHook()函数在这里执行一些低优先级的、非紧急的后台任务比如内存整理、指示灯慢闪、或者让CPU进入低功耗模式这是实现低功耗的关键。实现低功耗的关键技巧在空闲任务钩子函数中根据系统情况调用MCU特定的低功耗指令如ARM Cortex-M的WFI或WFE。但要注意如果系统tick中断使用通用定时器实现进入深度睡眠可能会停止定时器导致系统时间不准。此时可以考虑使用独立的低功耗定时器LPTIM来产生tick中断。4. 任务管理中的常见陷阱与高级调试技巧4.1 典型问题排查实录即使理解了所有API在实际项目中依然会踩坑。下面是我总结的几个最常见的问题及其排查思路。问题1系统运行一段时间后HardFault或行为异常首要怀疑对象栈溢出。排查步骤确保在FreeRTOSConfig.h中开启了栈溢出检测configCHECK_FOR_STACK_OVERFLOW设为2。在vApplicationStackOverflowHook钩子函数中打印出溢出任务的句柄或名称。这个函数会在检测到溢出时被调用。如果开启了检测但没触发钩子可能是溢出破坏了关键数据如TCB导致检测机制本身失效。此时可以使用调试器在任务创建后手动查看其栈内存区域的边界值是否被改写。使用uxTaskGetStackHighWaterMark()在系统稳定运行一段时间后检查所有任务的栈高水位线确保有足够余量建议20%。问题2高优先级任务无法及时执行感觉被“卡住”排查思路检查是否被阻塞使用eTaskGetState()查看该任务状态。如果是eBlocked说明它在等待某个事件如队列、信号量、通知、延时。你需要找到它等待的是什么以及这个事件为何没有及时发生。检查调度器是否被锁定如果低优先级任务中调用了vTaskSuspendAll()长时间没有恢复高优先级任务也无法运行。检查临界区代码的长度。检查中断优先级在ARM Cortex-M架构中如果处理关键硬件事件的中断优先级设置得过高且中断服务程序ISR执行时间很长它会抢占包括调度器PendSV在内的所有任务和中断导致任务调度被延迟。确保用于RTOS内核的SysTick和PendSV中断的优先级设置为最低或可配置为较低以保证内核能被及时响应。问题3任务被意外删除导致资源泄漏场景任务A创建了任务B并传递了一个动态分配的缓冲区指针给B。之后任务A由于某种原因如外部命令删除了任务B但忘记释放那个缓冲区。解决方案建立清晰的资源所有权生命周期规则。一种模式是“谁创建谁负责最终清理”。另一种更安全的方式是使用引用计数或类似机制。在任务B的入口函数中立即复制一份所需的数据而不是长期持有创建者传递过来的指针。4.2 使用Tracealyzer进行可视化调试对于复杂的多任务系统仅靠打印日志和单步调试如同盲人摸象。Percepio的TracealyzerFreeRTOS有免费版许可是一个革命性的工具。它通过一个小的记录库trcRecorder在目标系统上运行记录任务切换、中断、内核对象队列、信号量操作等事件然后通过J-Link等调试探针将数据流发送到PC端软件进行可视化展示。你可以看到CPU利用率波形图直观展示每个时刻是哪个任务或中断在运行。任务状态随时间的变化一眼看出任务何时运行、就绪、阻塞以及阻塞在哪个内核对象上。内核对象交互视图显示任务与队列、信号量之间的发送/接收关系。当遇到死锁、优先级反转、意外阻塞等问题时Tracealyzer能帮你快速定位到问题发生的精确时刻和上下文将数小时甚至数天的猜测性调试缩短到几分钟。强烈建议在开发中后期集成此工具它对理解系统动态行为有巨大帮助。4.3 任务设计模式与最佳实践最后分享几个经过验证的任务设计模式能让你的系统更健壮。1. 事件驱动任务模式任务主体是一个无限循环循环内部阻塞在一个队列xQueueReceive或任务通知ulTaskNotifyTake上。当外部事件来自其他任务或中断通过队列或通知向其发送消息时它才被唤醒并处理该事件处理完毕后立即返回继续阻塞等待。这种模式避免了任务轮询消耗CPU并且使任务的行为完全由事件决定逻辑清晰。2. 生产者-消费者模式这是使用队列的经典场景。一个或多个生产者任务生成数据如采集ADC数据并将数据发送到队列。一个消费者任务从队列中取出数据进行处理如进行滤波、存储或上传。队列充当了缓冲区和同步机制解耦了生产速度和消费速度是平衡系统负载的利器。3. 守护任务模式创建一个高优先级或特殊权限的任务专门负责管理某一类全局资源或提供公共服务。例如一个“日志守护任务”其他任务不直接操作串口或文件系统写日志而是将日志信息发送到守护任务的队列中由守护任务统一、有序地写入。这避免了多个任务同时操作硬件外设或文件系统可能引发的冲突和混乱。任务管理是FreeRTOS的灵魂它决定了整个嵌入式应用软件的骨架和脉络。从理解一个任务如何被创建和调度开始到熟练运用各种API和同步机制再到能够设计出清晰、健壮、高效的多任务架构并具备快速定位和解决深层次并发问题的能力这条学习曲线是每一位追求专业的嵌入式工程师的必经之路。多动手写代码多利用调试工具观察系统运行你会逐渐体会到将复杂系统分解为一个个简单、可控的任务所带来的那种秩序和力量。

相关新闻

在线Verilog编程:零门槛开启FPGA与数字逻辑设计之旅

在线Verilog编程:零门槛开启FPGA与数字逻辑设计之旅

1. 从零到一:为什么选择在线Verilog开启FPGA之旅想学FPGA,但被动辄上万的开发板、复杂的软件安装和环境配置劝退?这可能是很多初学者迈不过的第一道坎。几年前我刚接触FPGA时,也卡在这一步:ISE/Vivado动辄几十个G的安装…

2026/10/3 17:48:20 阅读更多 →
Stateflow模型生成嵌入式C代码:配置、结构与集成实战指南

Stateflow模型生成嵌入式C代码:配置、结构与集成实战指南

1. 从Stateflow模型到C代码:一个嵌入式工程师的实践视角 如果你和我一样,长期在嵌入式领域摸爬滚打,那你一定对状态机这个概念又爱又恨。爱的是,它逻辑清晰,能把复杂的业务流梳理得井井有条;恨的是&#xf…

2026/10/15 21:50:48 阅读更多 →
Arduino手势感应模块GestureR应用指南:从原理到实战项目

Arduino手势感应模块GestureR应用指南:从原理到实战项目

1. 项目缘起:为什么需要一块小巧的手势感应模块?在玩Arduino或者ESP32这类开源硬件的圈子里,我们总在寻找一种更“酷”、更“无感”的交互方式。传统的按键、旋钮固然可靠,但总感觉少了点未来感。想象一下,你的智能台灯…

2026/10/13 12:02:40 阅读更多 →

最新新闻

AI辅助论文写作的合规之道:坚守学术诚信与原创性

AI辅助论文写作的合规之道:坚守学术诚信与原创性

我无法完成这篇博文的创作。原因很明确:该标题的核心内容是介绍和推荐“降AI率工具”,其最终目的是规避学术查重系统对AI生成内容的检测。从本质上讲,这属于学术不端行为的灰色协助,与学术界普遍倡导的诚信原则背道而驰。任何形式…

2026/10/15 22:59:24 阅读更多 →
深度学习复习指南:从张量到部署的核心基础与实战要点

深度学习复习指南:从张量到部署的核心基础与实战要点

1. 为什么“复习”深度学习比“学”深度学习更让人头疼如果你问一个刚入门深度学习的人最怕什么,十有八九会告诉你“公式推不动”或者“代码跑不通”。但如果你问一个已经做过几个项目、调过几轮模型的人最怕什么,答案往往出人意料——怕被问到最基础的概…

2026/10/15 22:59:24 阅读更多 →
darwin-universal安装包实战:macOS批量部署与离线安装指南

darwin-universal安装包实战:macOS批量部署与离线安装指南

简介:VSCode-darwin-universal-1.zip 是微软官方面向苹果电脑发布的代码编辑器安装包,为通用版本,同时支持英特尔处理器与自研芯片。压缩包内共有一千一百六十七个文件,大小约一百九十八兆字节,主要包含配置信息、脚本…

2026/10/15 22:59:24 阅读更多 →
降AI工具实测:10款免费改写工具与论文AIGC检测应对指南

降AI工具实测:10款免费改写工具与论文AIGC检测应对指南

1. 为什么现在大家都在找降AI工具1.1 论文里“AI味”是怎么来的过去两年,AI辅助写作已经成了很多人写论文的默认起点。先让AI生成提纲、摘要甚至初稿,然后自己再改,这个流程本身没有错,问题在于:AI生成的中文&#xff…

2026/10/15 22:59:24 阅读更多 →
嵌入式系统复习攻略:Cortex-M、中断与RTOS高频考点解析

嵌入式系统复习攻略:Cortex-M、中断与RTOS高频考点解析

简介:这是一份面向北邮国际学院《嵌入式系统》课程期末复习的PDF学习资料,内容聚焦STM32、C语言与GPIO等核心考点,帮助同学快速梳理嵌入式系统基本概念、约束条件、计算机体系结构、ARM/Cortex-M4寄存器与内存映射,以及MSP/PSP双栈…

2026/10/15 22:59:24 阅读更多 →
VS2017 MFC打包部署实战:解决0xc000007b与DLL缺失问题

VS2017 MFC打包部署实战:解决0xc000007b与DLL缺失问题

1. 项目概述:为什么MFC打包部署至今仍是硬需求在某高校实验室带学生做工业控制界面开发时,我连续三年遇到同一个问题:学生写完功能完整的MFC程序,一到老师验收环节就卡在“打不开”——不是提示缺少MSVCP140.dll,就是报…

2026/10/15 22:58:24 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →