STM32F4 移植 uCOS-II 实战:从裸机到 RTOS 的完整工程指南
简介这份资源是面向嵌入式开发者的STM32F4移植UCOS_II完整工程基于STM32F407ZGT6与Keil μVision环境解决实时操作系统在Cortex-M4平台上的落地问题。内容涵盖UCOS_II任务调度、信号量、消息队列与内存管理机制并涉及时钟初始化、中断向量表配置、任务切换函数编写及GPIO、定时器、串口等外设驱动适配适合具备一定单片机基础、希望深入理解RTOS原理与移植流程的中高级学习者。压缩包共252个文件约7.18MB以61个c源文件、54个头文件为核心辅以汇编启动代码、链接脚本、工程配置与编译中间文件完整呈现从源码到可执行固件的工程结构。目前已有694人学习下载。通过该工程读者可掌握RTOS移植的关键步骤、任务调度与中断处理的配合方式并借助Keil调试工具排查死锁与资源冲突积累嵌入式系统设计与软件工程实践经验。1. 从裸机到 RTOS一份能直接跑起来的 STM32F4 移植 uCOS-II 工程手头这块 STM32F407 的板子跑裸机跑了大半年前后台架构越写越乱定时器中断里塞逻辑、主循环里等标志位改一处崩三处。想上 RTOS 又嫌从头搭环境太费劲——启动文件怎么改、PendSV 和 SysTick 怎么接、中断优先级怎么分组每一步都有坑。这份 STM32F4 移植 uCOS-II 的 Keil 工程就是冲着这个场景来的它把内核源码、移植层、板级支持和一份能编译下载的 Keil 工程打包在一起省掉从零拼装的时间。适合已经会点灯串口、想迈出 RTOS 第一步的嵌入式开发者也适合用过 uCOS-II 但换到 F4 平台需要参考移植层写法的熟手。下面按「这份工程里有什么、怎么跑起来、移植层怎么改、坑在哪」的顺序拆开讲。2. 工程结构与 uCOS-II 在 F4 上的运行骨架2.1 目录里到底放了什么拿到一个移植工程先别急着点编译把目录结构看清楚能省掉后面一半的排查时间。这份工程大致分成四块内核源码、移植层、板级支持包和 Keil 工程文件。内核源码是 uCOS-II 的与处理器无关部分包括任务调度、信号量、消息队列、内存管理这些文件名通常是os_core.c、os_task.c、os_sem.c、os_q.c、os_time.c等它们不关心你用的是 F4 还是别的芯片。移植层是跟 Cortex-M4 内核绑定的部分核心就三个文件os_cpu.h、os_cpu_c.c、os_cpu_a.asm负责堆栈初始化、任务切换、临界区进出这些底层动作。板级支持包是跟具体开发板相关的比如时钟配置、串口初始化、SysTick 和 PendSV 的中断服务函数挂接。Keil 工程文件负责把这些源码组织成可编译的目标。目录/文件作用移植时是否需要改os_core.c/os_task.c等内核与处理器无关代码不改os_cpu.h数据类型、堆栈增长方向、临界区宏基本不改确认宏定义os_cpu_c.c任务堆栈初始化OSTaskStkInit按需改os_cpu_a.asmPendSV 切换、开中断关中断汇编基本不改os_cfg.h内核功能裁剪配置按需改includes.h全局头文件汇总按需改app_cfg.h任务优先级、堆栈大小配置按需改bsp.c/bsp.h板级初始化、时钟、串口按板子改这张表建议对着实际工程核一遍尤其是os_cpu.h里的临界区宏和os_cfg.h里的功能开关后面出问题十有八九跟这两处有关。2.2 任务切换靠什么撑起来uCOS-II 在 Cortex-M4 上跑任务切换的骨架是 PendSV 异常加 SysTick 节拍。SysTick 按固定频率产生中断每次中断给内核一个时间基准内核判断有没有更高优先级任务就绪如果有就触发 PendSV。PendSV 被设计成最低优先级异常这样它不会打断其他中断等所有高优先级中断处理完再安全地做上下文切换。这个机制是 Cortex-M 内核专门为 RTOS 设计的理解它比死记代码重要。移植层里OSTaskStkInit负责在任务创建时伪造一个堆栈帧让第一次调度到这个任务时CPU 从 PendSV 返回的路径「以为」这个任务之前被切换过。堆栈帧里要按 Cortex-M4 异常入栈顺序摆好 R0-R3、R12、LR、PC、xPSR 这些寄存器PC 指向任务函数入口LR 指向任务退出处理。如果这个帧摆错了现象通常是任务第一次运行就进 HardFault或者跑飞到一个莫名其妙的地址。OS_CPU_SR_Save和OS_CPU_SR_Restore这两个临界区宏在 Cortex-M4 上一般用MRS读 PRIMASK、MSR写 PRIMASK 实现关中断和恢复。注意恢复的时候不能无脑写 0要把保存的值写回去否则嵌套临界区会出问题。2.3 时钟节拍和中断优先级分组SysTick 的配置频率决定了系统节拍常见做法是配成 1ms 一次也就是OS_TICKS_PER_SEC设成 1000。F4 主频 168MHz 的话SysTick 重装载值就是 168000 减 1。这个值在BSP_Init或者专门的SysTick_Init里设别跟内核的OS_TICKS_PER_SEC对不上对不上会导致延时函数时间全错。中断优先级分组是 F4 上最容易翻车的地方。Cortex-M4 的优先级寄存器是 8 位但 ST 只实现了高 4 位分组决定了这 4 位里几位给抢占优先级、几位给子优先级。uCOS-II 需要用到抢占优先级来做任务调度和临界区管理常见做法是用NVIC_PriorityGroup_22 位抢占 2 位子优先级。PendSV 要设成最低抢占优先级SysTick 设成次低其他外设中断按实时性要求排。如果 PendSV 优先级没设对任务切换可能被其他中断卡住表现为系统响应迟钝甚至卡死。/* SysTick 配置1ms 节拍F4 主频 168MHz */ void SysTick_Init(void) { /* 168000000 / 1000 168000减 1 是重装载值 */ if (SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC)) { while (1); /* 配置失败就停在这里方便定位 */ } /* SysTick 优先级设为次低仅高于 PendSV */ NVIC_SetPriority(SysTick_IRQn, 0xFE); } /* 中断优先级分组必须在任何外设中断配置之前调用 */ void NVIC_Config(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* PendSV 设为最低优先级保证上下文切换不打断其他中断 */ NVIC_SetPriority(PendSV_IRQn, 0xFF); }这段代码里SysTick_Config是 CMSIS 提供的函数参数是重装载值返回非零表示失败。NVIC_SetPriority的第二个参数是优先级值数值越小优先级越高0xFF 是最低。注意优先级分组一定要在配置任何外设中断之前设好中途改分组会让已配置的中断优先级含义全变这是血泪经验。3. 从零编译到点灯把工程跑起来3.1 Keil 工程配置逐项核对打开 Keil 工程后先别急着编译把几个关键配置过一遍。Target 选项里晶振频率要跟板子实际晶振一致F4 常见是 8MHz 外部晶振经过 PLL 倍频到 168MHz。如果这里填错串口波特率、延时时间全不对。C/C 选项卡里要确认头文件包含路径覆盖了内核源码、移植层、板级支持包三个目录漏一个就是一堆 undefined。汇编选项卡里确认os_cpu_a.asm被加入编译这个文件不参与 C 编译容易在新建工程时被漏掉。链接器选项里堆栈大小要留意。uCOS-II 的任务堆栈是每个任务独立分配的但主堆栈 MSP 和进程堆栈 PSP 的大小也要够。启动文件里的Stack_Size建议不小于 0x400Heap_Size如果不用动态内存可以设小一点。如果编译通过但下载后一运行就 HardFault先怀疑堆栈不够。调试器配置里下载算法要选对 F4 对应的 Flash 算法SWD 模式复位方式选SYSRESETREQ或者硬件复位都行。如果连不上目标先降 SWD 速率到 1MHz 试试排线太长或者板子供电不稳的时候高速率容易连不上。3.2 启动文件和中断向量表的处理F4 的启动文件startup_stm32f4xx.s里定义了中断向量表PendSV_Handler 和 SysTick_Handler 这两个名字必须跟移植层里的实现对上。uCOS-II 的移植层通常把 PendSV 的处理放在os_cpu_a.asm里名字叫PendSV_HandlerSysTick 的处理放在os_cpu_c.c或者板级文件里名字叫SysTick_Handler。如果启动文件里这两个名字被改过或者你在别处又定义了一份链接时会报重复定义或者运行时进的是空函数。常见做法是在启动文件里把这两个中断的弱定义保留移植层里用同名强定义覆盖。如果用的是 ST 标准库或者 HAL 库自带的启动文件确认没有在stm32f4xx_it.c里重复实现这两个函数。我一般会把stm32f4xx_it.c里跟 RTOS 相关的中断处理全部注释掉统一交给移植层管。/* SysTick 中断服务函数必须跟启动文件里的向量名一致 */ void SysTick_Handler(void) { /* 进入中断通知内核节拍 */ OSIntEnter(); OSTimeTick(); OSIntExit(); } /* 如果板级文件里已经有 SysTick_Handler这里就不要重复定义 */OSIntEnter和OSIntExit是成对使用的前者告诉内核现在进了中断后者在退出时判断有没有更高优先级任务需要切换。漏掉任何一个中断嵌套时调度就会乱。OSTimeTick负责给所有延时任务减计数、给超时任务发信号。3.3 第一个任务的创建和验证工程跑起来之后先别急着上复杂逻辑创建一个闪灯任务验证调度器正常工作。任务函数里放一个无限循环点灯、延时、灭灯、延时。如果灯按预期闪烁说明 SysTick 节拍、任务切换、延时函数这条链路是通的。/* 闪灯任务堆栈大小按经验给简单任务 128 字够了 */ #define LED_TASK_STK_SIZE 128 static OS_STK LedTaskStk[LED_TASK_STK_SIZE]; /* 闪灯任务函数 */ void LedTask(void *p_arg) { (void)p_arg; while (1) { GPIO_ToggleBits(GPIOA, GPIO_Pin_5); /* 翻转 LED */ OSTimeDlyHMSM(0, 0, 0, 500); /* 延时 500ms */ } } /* 在 main 里创建任务并启动调度器 */ int main(void) { BSP_Init(); /* 板级初始化含时钟和 GPIO */ OSInit(); /* 内核初始化必须最先调用 */ OSTaskCreate(LedTask, /* 任务函数 */ (void *)0, /* 传给任务的参数 */ LedTaskStk[LED_TASK_STK_SIZE - 1], /* 堆栈栈顶 */ 5); /* 任务优先级数值越小越高 */ OSStart(); /* 启动调度器不返回 */ return 0; }OSTaskCreate的第三个参数是堆栈栈顶指针注意 F4 的堆栈是向下增长的所以传的是数组最后一个元素的地址。优先级 5 是个中间值uCOS-II 里 0 是最高、最低由OS_LOWEST_PRIO决定别用 0 和最低几个它们通常留给系统任务。OSStart调用后调度器接管永远不会返回后面的代码不会执行。如果灯不闪先查三个地方SysTick 有没有正常进中断、PendSV 有没有被触发、任务堆栈有没有溢出。用调试器在SysTick_Handler里打个断点能进来说明节拍没问题在PendSV_Handler里打断点能进来说明切换被触发了堆栈溢出可以在OSTaskStkInit里把堆栈填充成固定值跑一段时间后看栈顶附近有没有被改写。4. 移植层改造换板子、改时钟、调优先级4.1 时钟树变了要动哪里换一块 F4 板子最常见的变化是外部晶振频率不同或者主频目标不同。时钟配置一般在system_stm32f4xx.c的SystemInit或者板级BSP_ClockInit里。改完时钟之后SysTick 的重装载值要跟着变因为它是按SystemCoreClock算的。如果用了SystemCoreClockUpdate在运行时更新这个变量SysTick 配置函数里直接引用它就行不用手改数字。串口波特率也跟时钟挂钩。如果时钟从 168MHz 改成 100MHz串口初始化里的分频系数要重算否则打印出来全是乱码。常见做法是用 CubeMX 或者标准库的USART_Init自动算但移植工程里往往是手写的寄存器配置改时钟后要手动核对USARTDIV的值。4.2 任务优先级和堆栈怎么定uCOS-II 的优先级是抢占式的高优先级任务就绪就会立刻抢占低优先级任务。任务优先级分配有个常见原则实时性要求最高的给最高优先级比如电机控制、通信接收人机交互、日志打印给低优先级空闲任务由内核自动创建优先级最低。优先级数值不能重复重复了OSTaskCreate会返回错误码。堆栈大小按任务里局部变量、函数调用深度、中断嵌套深度来估。简单闪灯任务 128 字注意 uCOS-II 里堆栈单位是OS_STKF4 上是 4 字节够用带浮点运算或者递归的任务要加大。估算不准就先给大一点跑起来后用调试器看堆栈使用水位再往回收。堆栈溢出是 RTOS 上最隐蔽的 bug 之一现象可能是随机死机、变量被莫名改写查起来很痛苦。任务类型建议优先级范围建议堆栈大小OS_STK通信接收/电机控制3~8256~512数据处理9~15256~512人机交互16~24128~256日志/状态上报25~30128~256这张表是经验值具体还要看任务里调用了哪些库函数、有没有用浮点。用了 FPU 的任务堆栈要额外留空间保存浮点寄存器。4.3 中断里怎么跟任务通信RTOS 里中断服务函数要尽量短耗时逻辑丢给任务处理。中断和任务之间通信用信号量、消息队列或者事件标志组。在 uCOS-II 里中断里发信号量要用OSSemPost收信号量在任务里用OSSemPend。注意中断里不能调用会阻塞的函数OSSemPend带超时参数在中断里调用会出问题。/* 中断服务函数里发信号量通知任务处理 */ void EXTI0_IRQHandler(void) { OSIntEnter(); if (EXTI_GetITStatus(EXTI_Line0) ! RESET) { EXTI_ClearITPendingBit(EXTI_Line0); OSSemPost(Sem_Key); /* 发信号量不阻塞 */ } OSIntExit(); } /* 任务里等信号量超时 100ms */ void KeyTask(void *p_arg) { INT8U err; (void)p_arg; while (1) { OSSemPend(Sem_Key, 100, err); /* 等按键信号量 */ if (err OS_ERR_NONE) { /* 收到信号处理按键逻辑 */ } } }OSIntEnter和OSIntExit把中断处理包起来OSIntExit里会判断有没有更高优先级任务就绪有的话触发切换。OSSemPend的第二个参数是超时时间单位是节拍100 就是 100ms。超时返回OS_ERR_TIMEOUT收到信号返回OS_ERR_NONE根据返回值区分情况处理。5. 避坑排查移植 uCOS-II 常踩的五个坑5.1 一进调度器就 HardFault现象是OSStart调用后程序跑飞调试器停在 HardFault_Handler。原因通常是OSTaskStkInit里伪造的堆栈帧不对PC 指向了非法地址或者 xPSR 的 Thumb 位没置 1。Cortex-M4 要求指令地址最低位为 1 表示 Thumb 状态如果任务函数地址直接塞进 PC 而没置位取指就出错。解决方法是检查OSTaskStkInit里 PC 赋值那行确认任务函数指针做了| 0x01处理同时核对堆栈帧里各寄存器的偏移顺序跟 Cortex-M4 异常入栈顺序一致。5.2 任务能跑但延时不准现象是OSTimeDly延时时间跟预期差很多或者串口打印的时间戳对不上。原因一般是OS_TICKS_PER_SEC跟 SysTick 实际配置频率不一致或者SystemCoreClock变量没更新导致重装载值算错。解决方法是先确认OS_TICKS_PER_SEC的值再在 SysTick 初始化后读一下重装载寄存器用SystemCoreClock / OS_TICKS_PER_SEC - 1算一遍对比。如果用了动态时钟切换每次切完要调SystemCoreClockUpdate。5.3 中断里调用 Pend 导致卡死现象是系统运行一段时间后卡死或者某个任务永远等不到信号。原因是在中断服务函数里调用了OSSemPend、OSTimeDly这类会阻塞的函数。中断上下文不能阻塞这些函数在中断里调用会破坏内核状态。解决方法是中断里只用Post类函数发信号耗时的等待和处理放到任务里做。排查时可以在OSSemPend入口加断言判断当前是否在中断上下文。5.4 优先级反转导致高优先级任务饿死现象是高优先级任务明明就绪却长时间不运行低优先级任务反而在跑。原因是高优先级任务等一个被低优先级任务持有的信号量而中间优先级的任务抢占了低优先级任务导致信号量迟迟不释放。uCOS-II 支持优先级继承创建信号量时用OSSemCreate并开启OS_TASK_OPT相关选项或者在设计上避免多个任务共享同一个信号量。更稳妥的做法是让持有信号量的临界区尽量短别在里面做耗时操作。5.5 堆栈溢出引发随机死机现象是系统跑一段时间后随机死机或者某个变量值莫名其妙变了。原因是任务堆栈给少了函数调用或中断嵌套把堆栈写穿踩到了相邻任务的数据。解决方法是在OSTaskStkInit里把整个堆栈填充成固定模式比如 0x5A5A5A5A跑一段时间后在调试器里看栈底附近还有多少没被改写的填充值估算实际用量。也可以在每个任务切换时检查栈指针有没有越界越界就报错。堆栈给大一点不丢人省那点 RAM 换来随机死机不值得。6. 进阶用统计任务和钩子函数把系统看透工程跑通之后下一步是让它变得可观测。uCOS-II 自带统计任务OSStatTask开启OS_TASK_STAT_EN之后它会周期性统计 CPU 使用率结果放在OSCPUUsage变量里。这个值能告诉你系统还有多少余量如果长期高于 80%说明任务设计有问题或者该换更高主频的芯片了。开启方法是在OSInit之后、OSStart之前调用OSStatInit注意这个函数里有个延时要等一个节拍才能拿到准确值。int main(void) { BSP_Init(); OSInit(); OSTaskCreate(LedTask, (void *)0, LedTaskStk[LED_TASK_STK_SIZE - 1], 5); OSStatInit(); /* 初始化统计任务内部会延时一个节拍 */ OSTaskCreate(OtherTask, (void *)0, OtherTaskStk[OTHER_STK_SIZE - 1], 10); OSStart(); return 0; }OSStatInit必须在至少创建了一个用户任务之后调用因为它要对比空闲任务和用户任务的运行时间。调用位置放在OSStart之前内部会主动延时一个节拍让统计基准生效。开启统计任务会多占一个任务堆栈和一点 CPU 开销资源紧张的项目可以只在调试阶段开。钩子函数是另一个观测手段。OSTaskCreateHook在任务创建时被调用可以在这里打印任务名和优先级OSTaskDelHook在任务删除时调用OSTaskSwHook在任务切换时调用可以记录切换次数或者做性能分析。这些钩子函数默认是空的在os_cfg.h里把对应的OS_CPU_HOOKS_EN打开然后在os_cpu_c.c里实现。注意钩子函数在调度器内部被调用里面不能调用任何可能引起阻塞的 API打印用寄存器直接写串口或者存到缓冲区里事后分析。我自己的习惯是每移植一版新的 RTOS 工程先把统计任务和OSTaskSwHook打开跑一天看 CPU 使用率和任务切换频率稳不稳定确认没有异常再关掉钩子做正式开发。从那以后每次换平台或者改时钟配置都强制走一遍「统计任务看余量、堆栈填充看水位、钩子看切换」这三步能挡掉大部分玄学问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

制造业项目管理软件有哪些?从BOM到生产计划全覆盖

制造业项目管理软件有哪些?从BOM到生产计划全覆盖

多品种、小批量、变更频繁,是当前制造企业研发与生产协同最典型的痛点:设计变更传导不到产线,生产计划反复调整。 围绕从BOM到生产计划这条主线,本文整理制造业常用的八款项目管理软件,按研发管理与产品数据、生产计划…

2026/10/15 17:12:20 阅读更多 →
非线性控制实战:反馈线性化与Backstepping原理及Simulink仿真对比

非线性控制实战:反馈线性化与Backstepping原理及Simulink仿真对比

做控制工程的这两年,我最大的感受是:教科书上干干净净的线性假设,到了现场往往第一个顶不住。摩擦死区、伺服阀流量非线性、气动执行机构的饱和,任何一个环节的非线性都能让精心调好的线性控制器在工况切换时突然“失忆”。所以当…

2026/10/15 17:12:20 阅读更多 →
TerraExplorer二次开发C#示例:从COM互操作到场景加载与避坑指南

TerraExplorer二次开发C#示例:从COM互操作到场景加载与避坑指南

简介:TerraExplorer是基于Skyline平台的三维地球可视化软件,广泛应用于GIS与虚拟现实等场景。这份C#二次开发示例代码面向需要掌握TerraExplorer API的GIS开发人员,通过完整的Visual Studio解决方案演示了SDK调用、事件驱动编程、地图对象控制…

2026/10/15 17:12:20 阅读更多 →

最新新闻

AI论文写作要点梳理与前沿研究成果应用实践指南

AI论文写作要点梳理与前沿研究成果应用实践指南

外文文献“白嫖”与高效阅读全攻略 宝子们,是不是一提到下载外文文献就头大? 想找的文献要么全网搜不到,要么下载流程复杂到让人原地爆炸。好不容易在某个小网站找到了资源,又担心版权问题不敢点,更别说有些平台动辄几…

2026/10/15 19:38:32 阅读更多 →
人脸识别开集测试:从闭集幻觉到真实拒识的工程实践

人脸识别开集测试:从闭集幻觉到真实拒识的工程实践

1. 开集与闭集测试:人脸识别系统落地前必须跨过的那道坎 我第一次在某高校实验室参与人脸识别项目验收时,被现场演示结果惊得愣在原地——模型在内部测试集上准确率高达99.2%,可当现场随机邀请三位未录入过人脸的访客走进识别区域&#xff0c…

2026/10/15 19:38:32 阅读更多 →
深耕支付宝收钱码推广领域,拓推客以专业合作服务赋能地推从业者

深耕支付宝收钱码推广领域,拓推客以专业合作服务赋能地推从业者

移动支付已深度融入日常消费与商业经营场景。线下商户对于便捷收款、数字化经营工具及相关支付服务的需求持续受到关注,与之相关的商户拓展和推广服务,也逐渐成为连接支付产品与线下经营场景的重要环节。在这一行业背景下,专业化、规范化的推…

2026/10/15 19:38:32 阅读更多 →
记忆系统演化:从简单缓存到多层认知架构

记忆系统演化:从简单缓存到多层认知架构

在大模型驱动的智能体(AI Agent)系统研发初期,绝大多数团队对“记忆”的理解仅仅停留在会话上下文的传递上。早期的 LangChain 会话记忆组件(如 ConversationBufferMemory 或 ConversationSummaryMemory)通过简单的字符…

2026/10/15 19:38:32 阅读更多 →
观测全景:基于 OpenInference 的可观测体系总结

观测全景:基于 OpenInference 的可观测体系总结

随着大语言模型(LLM)与多智能体(Multi-Agent System)系统从概念验证(POC)全面进入企业生产级核心业务,传统的微服务可观测性体系(Metrics、Logs、Traces)遭遇了前所未有的…

2026/10/15 19:38:32 阅读更多 →
OpenCV+Python轻量物体识别:纯CPU端到端方案

OpenCV+Python轻量物体识别:纯CPU端到端方案

简介:本资源是一套面向Python与OpenCV初学者及计算机视觉入门开发者的自定义物体识别实战教程,聚焦于零基础构建可识别任意目标的检测模型,适用于智能监控、工业质检、教学实验等场景。压缩包共709个文件,含663张标注用JPG图像、2…

2026/10/15 19:37:32 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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 阅读更多 →