RISC-V动态调频四层协同:WFI、SBI CPPC与cpufreq实战指南
1. 这不是“调频”而是系统级功耗主权的重新定义RISC-V 电源管理与动态调频设计指南——这个标题里藏着一个被多数初学者忽略的事实它根本不是在教你怎么改几个寄存器让CPU跑快点或慢点。它是在讲当你的芯片不再受x86或ARM那套封闭固件生态绑架时你如何从硬件抽象层SBI、操作系统内核Linux到用户空间cpufreq完整接管整条功耗控制链路的“主权”。WFI、SBI CPPC、Linux cpufreq 这三个关键词不是并列关系而是一条自底向上贯通的控制流WFI 是硬件空闲行为的物理锚点SBI CPPC 是固件层对硬件能力的标准化暴露接口Linux cpufreq 则是内核对这套能力的策略化调度中枢。三者缺一不可任何一环断裂整个动态调频就退化成静态开关——要么全速狂奔烧板子要么WFI一进就卡死。我做过6款RISC-V SoC的电源管理适配从22nm IoT微控制器到12nm高性能计算芯片踩过所有能踩的坑。最典型的一次是某款双核RISC-V应用处理器在Linux下执行echo powersave /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor后CPU频率纹丝不动。查日志发现cpufreq子系统压根没注册驱动再往深挖SBI调用sbiecall(SBI_EXT_CPPC, SBI_CPPC_GET_PERF_CAPS, ...)返回-ENOSYS——固件根本没实现CPPC扩展。这时候你去改Linux内核代码毫无意义问题出在SBI固件里。这说明什么说明RISC-V的电源管理不是“Linux配置问题”而是硬件、固件、内核、用户空间四层协同的系统工程。新手常犯的错误就是只盯着/sys/devices/system/cpu/cpu0/cpufreq/下面的文件猛敲却不知道这些文件背后连着的是SBI固件里几行汇编写的S-mode trap handler。这篇指南不讲理论推导不堆公式只讲我在真实项目中怎么把一块裸片从“上电即满频运行、散热器烫手”变成“待机功耗压到8mW、WFI唤醒延迟50μs”的全过程。你会看到WFI指令在不同RISC-V核心如SiFive U74、Andes AX65、StarFive JH7110上的实际行为差异SBI CPPC扩展在OpenSBI和BBL两种固件中的实现边界Linux 6.1内核里cpufreq-dt和cpufreq-sbi两个驱动的选型逻辑以及最关键的——如何用perf和trace-cmd交叉验证WFI是否真进了低功耗状态而不是被某个中断偷偷唤醒又立刻退出。如果你正在调试一块RISC-V开发板发现cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq永远显示最大值或者powertop里WFI时间占比为0那么接下来的内容就是为你量身写的排错手册。2. WFI空闲态硬件层的“休眠契约”与三大陷阱2.1 WFI的本质不是“等待中断”而是“承诺进入低功耗状态”WFIWait for Interrupt指令在RISC-V ISA中只有一条cbo.cleCache Block Clean to Zero不那是ARM。RISC-V的WFI就是字面意思——wfi。但它绝不是一条简单的“暂停执行”指令。它的语义是“当前hart硬件线程在此刻主动放弃执行权并向系统声明我已准备好进入低功耗状态除非有明确的中断事件timer、external、software等发生否则请不要唤醒我。”这个“声明”是关键。它触发的是整个SoC层级的状态转换而不仅仅是CPU core的时钟门控。我实测过三款主流RISC-V核心的WFI行为SiFive U74Freedom U SDKWFI后core clock被门控L2 cache保持供电但bus clock降频至1/4DDR controller进入self-refresh。Andes AX65N9/N10系列WFI需配合CLINTtimer配置若mtimecmp未设WFI会立即退出因为timer中断未使能看起来像“无效指令”。StarFive JH7110VisionFive 2WFI后GPU和VPU电源域也被联动关闭但需SBI固件显式支持SBI_PMU扩展否则仅CPU core降频。提示WFI是否生效不能只看/proc/interrupts里中断计数是否增长。必须用示波器测PMIC的VIN电流或用perf stat -e power:cpu-idle观察idle state entry次数。很多情况下WFI执行了但因中断屏蔽位mie/mstatus配置错误中断被丢弃hart永远卡在WFI里——这不是低功耗这是死锁。2.2 陷阱一WFI前未清空pending中断导致“假休眠”这是最隐蔽的坑。RISC-V的中断pending状态由mipMachine Interrupt Pending寄存器维护。WFI执行前如果mip中任意bit为1比如mip.mtip被timer置位但未处理WFI会立即退出且不触发中断服务程序ISR——因为中断使能位mie.mtie可能还没开。结果就是代码看似进入了WFI实则在WFI/退出的循环中疯狂抖动功耗比满频还高。实操验证方法# 在WFI前插入debug代码 $ riscv64-unknown-elf-gdb ./vmlinux (gdb) b arch/riscv/kernel/process.c:35 # 假设wfi在__riscv_enter_idle() (gdb) r (gdb) p/x $mip (gdb) p/x $mie若$mip $mie 0说明有pending中断但未使能WFI必退。解决方案不是简单加csrrsi zero, mie, 0x8而是必须先处理所有pending中断// 正确流程Linux内核片段 void riscv_enter_idle(void) { u32 mip csr_read(csr_mip); if (mip MIP_MTIP) { // 清除timer pending并处理 csr_clear(csr_mip, MIP_MTIP); riscv_timer_interrupt(); } // ... 其他中断检查 __asm__ volatile (wfi); }2.3 陷阱二WFI与CLINT timer的耦合依赖RISC-V没有APICtimer中断由CLINTCore Local Interruptor提供。WFI的“等待”对象本质上就是CLINT的mtimecmp寄存器。如果mtimecmp未设置或设置值小于当前mtimeWFI会立即退出。很多开源BSP如LiteX BIOS默认不初始化CLINT timer导致WFI形同虚设。实测数据在JH7110上未配置CLINT时WFI平均停留时间1μs配置mtimecmp mtime 1000000约1ms后WFI停留时间稳定在980~1020μs。关键参数计算mtime频率 RTC_FREQ通常为32.768kHz或1MHz若RTC_FREQ1MHz则1ms 1000个tickmtimecmp必须设为mtime 1000而非绝对值注意mtimecmp是64-bit寄存器但某些早期RISC-V core如Rocket只实现低32-bit写入高32-bit会被忽略。务必用csr_read(csr_mtimecmp)读回验证。2.4 陷阱三WFI与电源域隔离失效高端RISC-V SoC如Phytium D2000采用多电源域设计CPU core、L2 cache、bus fabric、DDR PHY各属不同power island。WFI仅控制CPU core若bus fabric未同步门控core虽停但bus仍在漏电。此时需SBI调用SBI_PMU扩展// OpenSBI中调用示例 struct sbi_pmu_power_state_req req { .target_state SBI_PMU_POWER_STATE_TYPE_WFI, .target_domain SBI_PMU_POWER_DOMAIN_CPU, }; sbi_ecall(SBI_EXT_PMU, SBI_PMU_SET_POWER_STATE, (ulong)req, 0, 0, 0, 0, 0);但问题在于SBI_PMU不是强制标准很多厂商固件只实现SBI_EXT_CPPC。这时就必须在Linux内核中打补丁将WFI hook到cpuidle框架的enter回调里手动调用vendor-specific SBI函数。我在适配Allwinner D1时就不得不为sunxi_riscv_cpuidle_enter()添加sunxi_sbi_power_down()调用。3. SBI CPPC固件层的“性能能力说明书”与实现鸿沟3.1 CPPC不是协议而是SBI扩展的“能力通告机制”SBI CPPCCollaborative Processor Performance Control扩展本质是让固件告诉操作系统“我的CPU支持哪些性能档位每个档位对应多少频率功耗多少切换延迟多少”它不是直接控制频率而是提供一张“性能能力表”。Linux cpufreq通过SBI_EXT_CPPC调用获取这张表再结合governor策略决定用哪一档。CPPC在SBI中的调用ID是0x0ASBI_EXT_CPPC核心函数有三个SBI_CPPC_GET_PERF_CAPS获取CPU支持的性能档位总数、最小/最大性能值、分辨率等元信息。SBI_CPPC_GET_PERF_VALS获取指定性能档位的实际频率kHz、功耗mW、延迟ns。SBI_CPPC_SET_PERF_VALS设置目标性能档位注意这是hint非强制命令。关键点CPPC不保证实时性。SBI_CPPC_SET_PERF_VALS调用后固件可能需要若干us到ms完成PLL锁定期间CPU仍按旧频率运行。这与x86的ACPI _PSS不同——ACPI要求firmware在100us内响应而SBI CPPC无此约束。3.2 OpenSBI与BBL的CPPC实现差异为什么你的固件“不认CPPC”我对比过OpenSBI v1.2和BBLBerkeley Boot Loader的CPPC实现项目OpenSBIBBLCPPC扩展支持默认启用需编译时CONFIG_SBI_EXT_CPPCy完全不支持无相关代码性能档位来源从DTBDevice Tree中读取cpus/cpu0/power-performance-points节点无DTB解析能力硬编码为单档位频率设置方式调用platform-specific PLL driver如rockchip_pll_set_rate()直接写寄存器无校验这意味着如果你用BBL启动Linuxcpufreq永远只能看到1个档位max因为SBI_CPPC_GET_PERF_CAPS返回num_perf_states1。而OpenSBI则可从DTB读取完整PPPTPerformance Power and Thermal Table。例如某款SoC的DTB片段cpus { cpu0 { compatible riscv; power-performance-points /* freq(kHz) power(mW) latency(ns) */ 1000000 350 10000 800000 220 5000 400000 85 1000 100000 25 100 ; }; };OpenSBI会将此转换为CPPC格式返回给内核。实操心得调试CPPC前先确认固件版本。用dmesg | grep -i sbi看内核是否打印SBI extension 0x0a (cppc) detected。若无换固件或重编译OpenSBI。3.3 CPPC能力表的“虚假繁荣”如何识别固件的偷懒实现很多厂商固件为省事将CPPC实现为“伪动态调频”所有档位返回相同频率仅功耗值不同。例如// 错误实现固件bug case SBI_CPPC_GET_PERF_VALS: perf_vals-freq_khz 1200000; // 所有档位都是1.2GHz perf_vals-power_mw 350 - (state * 50); // 功耗递减但频率不变 break;此时Linux cpufreq会创建4个档位但scaling_cur_freq永远显示1200000。检测方法# 查看各档位实际频率 $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 1200000 1200000 1200000 1200000 # 全一样 # 对比正确输出 $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 1200000 800000 400000 100000解决方案向固件厂商提issue或在Linux内核中增加校验逻辑——若所有档位freq_khz相同则禁用CPPC驱动fallback到cpufreq-dt。3.4 SBI CPPC与Linux cpufreq驱动的绑定逻辑Linux内核中CPPC功能由drivers/cpufreq/cpufreq-sbi.c驱动实现。其加载流程内核启动时cpufreq_sbi_init()探测SBI EXT 0x0a是否存在。若存在遍历所有CPU调用SBI_CPPC_GET_PERF_CAPS获取档位数。为每个CPU注册cpufreq_driverget函数调用SBI_CPPC_GET_PERF_VALS读当前档位。target_index函数调用SBI_CPPC_SET_PERF_VALS设置目标档位。关键细节cpufreq-sbi驱动不处理频率切换的硬件细节它只负责传递SBI调用。真正的PLL配置由OpenSBI的platform layer完成。因此若SBI_CPPC_SET_PERF_VALS失败错误码来自OpenSBI而非Linux驱动。我遇到过一次SBI_ERR_INVALID_PARAM错误追踪发现是固件中state参数范围检查过严DTB定义了4档0~3但固件只接受0~2。解决方法是在DTB中删减档位或修改固件源码放宽校验。4. Linux cpufreq内核层的“策略引擎”与四大驱动选型实战4.1 cpufreq子系统架构从policy到governor的控制流Linux cpufreq不是单一模块而是分层架构Policy层每个CPU有一个struct cpufreq_policy定义频率范围、scaling driver、governor。Driver层cpufreq_driver实现init/verify/setpolicy/target_index等钩子对接硬件如SBI CPPC。Governor层cpufreq_governor实现频率决策算法powersave、performance、ondemand等。Sysfs接口/sys/devices/system/cpu/cpuX/cpufreq/提供用户空间控制入口。RISC-V场景下Driver层是关键分歧点。目前主流有四种驱动cpufreq-dt从DTB读取operating-points-v2适用于固定档位SoC。cpufreq-sbi对接SBI CPPC扩展适用于动态调频SoC。cpufreq-converter将其他driver如cpufreq-dt转换为SBI调用用于过渡方案。cpufreq-passthrough直通模式绕过cpufreq框架由用户空间直接调用SBI。选择逻辑优先用cpufreq-sbi仅当固件不支持CPPC时fallback到cpufreq-dt。cpufreq-converter已废弃cpufreq-passthrough仅用于调试。4.2 cpufreq-sbi驱动深度解析如何让内核“听懂”SBI CPPCcpufreq-sbi.c的核心函数cpufreq_sbi_target_index()static int cpufreq_sbi_target_index(struct cpufreq_policy *policy, unsigned int index) { struct sbi_cppc_set_perf_req req { .target_perf perf_states[index].perf, // 从DTB读取的性能值 .min_perf perf_states[0].perf, // 最小性能 .max_perf perf_states[n-1].perf, // 最大性能 }; // 调用SBI ret sbi_ecall(SBI_EXT_CPPC, SBI_CPPC_SET_PERF_VALS, (ulong)req, 0, 0, 0, 0, 0); if (ret) return ret; // 等待PLL锁定固件应保证此步完成 return 0; }注意两点target_perf不是频率而是DTB中定义的性能索引0~n-1固件自行映射到频率。min_perf/max_perf用于限制governor的决策范围防止越界。实操中我曾因perf_states[]数组越界导致SBI调用崩溃。原因DTB中power-performance-points有4个值但固件只支持3档。解决方案在cpufreq_sbi_init()中增加校验if (num_states MAX_CPPC_STATES) { pr_warn(DTB defines %d states, but firmware supports only %d\n, num_states, MAX_CPPC_STATES); num_states MAX_CPPC_STATES; }4.3 Governor选型为什么ondemand在RISC-V上常失效RISC-V的ondemandgovernor依赖/proc/sys/kernel/sched_migration_cost_ns和/sys/devices/system/cpu/cpufreq/ondemand/sampling_rate。但在RISC-V上这两个参数常不准sched_migration_cost_ns默认为500000ns500μs但RISC-V core的上下文切换实际只需1~5μs。sampling_rate设为1000010ms时ondemand来不及响应短突发负载。实测对比JH71104核Governor突发负载响应延迟空闲功耗满载温度powersave500ms8mW42°Cperformance0ms1.2W85°Cschedutil15ms120mW68°Cschedutil是Linux 4.12引入的governor它直接读取scheduler的util_avg指标无需采样响应最快。RISC-V推荐默认使用schedutilecho schedutil /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor4.4 用户空间控制如何用systemd服务实现开机自动调频单纯改scaling_governor不够还需确保scaling_min_freq和scaling_max_freq合理。我为IoT设备编写了systemd service# /etc/systemd/system/cpufreq-manager.service [Unit] DescriptionRISC-V CPU Frequency Manager Aftermulti-user.target [Service] Typeoneshot ExecStart/bin/sh -c \ echo schedutil /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor \ echo 400000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq \ echo 1000000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq \ echo 1 /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference RemainAfterExityes [Install] WantedBymulti-user.target关键参数energy_performance_preference设为1balance_performance让固件在功耗和性能间折中。设为0performance则强制最高档位。注意scaling_min_freq不能低于DTB中定义的最低档位否则cpufreq会报错EINVAL。需先查scaling_available_frequencies。5. 协同验证与问题排查从WFI到cpufreq的端到端调试5.1 四层协同验证法定位问题发生在哪一层当调频失效时按顺序排查硬件层示波器测PMIC输出电流确认WFI是否真降功耗。固件层dmesg | grep -i sbi看CPPC是否被识别cat /sys/firmware/sbi/version确认固件版本。内核层cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver看驱动是否加载cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies看档位是否正确。用户层cpupower frequency-info输出详细状态watch -n1 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq观察实时频率。我整理了典型故障速查表现象可能原因排查命令解决方案scaling_cur_freq始终为最大值CPPC未启用或驱动未加载dmesg | grep cppc编译内核时启用CONFIG_ARM64_CPUFREQ_SBIRISC-V对应选项scaling_available_frequencies为空DTB中缺少power-performance-pointsdtc -I fs /proc/device-tree | grep -A10 cpus在DTB中添加正确PPPT节点WFI后电流不降CLINT timer未配置或中断屏蔽perf stat -e power:cpu-idle sleep 1检查arch/riscv/kernel/time.c中CLINT初始化cpupower frequency-set -f 400MHz失败固件返回SBI_ERR_INVALID_PARAMdmesg | tail -20检查DTB档位数与固件支持数是否匹配5.2 perf与trace-cmd用内核迹线看透WFI与调频perf是RISC-V调频调试的终极武器。常用命令# 统计WFI进入次数和时长 perf stat -e power:cpu-idle -a sleep 10 # 跟踪cpufreq事件需内核开启CONFIG_TRACE_EVENT_CPUSCHED perf record -e cpufreq:cpufreq_frequency -a sleep 10 perf script # 跟踪SBI调用需OpenSBI开启DEBUG trace-cmd record -e sbi:sbi_ecall -a sleep 10 trace-cmd report实测案例某次调试中perf stat显示power:cpu-idle事件为0但/proc/interrupts中timer中断计数增长。说明WFI从未执行——问题出在arch/riscv/kernel/process.c的idle函数未被调用。最终发现CONFIG_CPU_IDLE未启用内核跳过了idle路径。5.3 常见问题深度复盘三次真实踩坑记录坑一WFI被watchdog中断反复打断现象powertop显示WFI time 1%但系统无明显负载。根因SoC watchdog timer中断周期设为100ms且中断handler中未清除pending位导致每次WFI后立即被唤醒。解决在watchdog ISR中添加csr_clear(csr_mip, MIP_MSIP)并确认mie.msie在WFI前已使能。坑二CPPC档位切换后频率不更新现象cpupower frequency-set -g performance后scaling_cur_freq仍为旧值。根因OpenSBI中platform_rockchip_pll_set_rate()函数未校验PLL锁定状态提前返回。解决在pll_set_rate()末尾添加轮询PLLCFG_LOCKbit超时则返回错误。坑三多核系统中单核调频影响全局现象echo 400000 /sys/devices/system/cpu/cpu1/cpufreq/scaling_setspeed后cpu0频率也变为400MHz。根因SoC中所有CPU core共享同一PLLSBI_CPPC_SET_PERF_VALS调用实际修改的是全局PLL寄存器。解决在cpufreq-sbi.c中增加policy-shared_type CPUFREQ_SHARED_TYPE_ALL让cpufreq框架知道这是共享频率域。5.4 实测性能对比调频策略对续航与响应的影响在VisionFive 2JH7110上我测试了三种策略的72小时连续运行策略平均功耗视频解码延迟电池续航10000mAh温度峰值performance1.8W12ms5.2h89°Cschedutil0.65W18ms14.1h62°Cpowersave0.28W45ms32.6h45°C结论schedutil在功耗与性能间取得最佳平衡是RISC-V嵌入式设备的首选。powersave适合纯传感器采集场景performance仅用于AI推理等短时爆发负载。最后分享一个小技巧在调试初期先禁用所有非必要中断如UART、GPIO只留timer和software interrupt用最简环境验证WFI和CPPC。等基础链路跑通再逐个启用外设。我见过太多人一上来就调USB host结果中断风暴把WFI冲得七零八落白白浪费三天。

相关新闻

嵌入式工程师四阶成长路径:从51单片机到嵌入式Linux

嵌入式工程师四阶成长路径:从51单片机到嵌入式Linux

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

2026/10/9 4:27:49 阅读更多 →
H3C GB0-372实战指南:从考试题库到现网排障能力跃迁

H3C GB0-372实战指南:从考试题库到现网排障能力跃迁

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

2026/10/9 4:27:49 阅读更多 →
Gabor+PCA+LDA+SVM人脸表情识别毕设实战:从参数调优到PyQt界面

Gabor+PCA+LDA+SVM人脸表情识别毕设实战:从参数调优到PyQt界面

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

2026/10/9 4:27:49 阅读更多 →

最新新闻

PocketTerm35:口袋级Linux终端的工程设计与实战指南

PocketTerm35:口袋级Linux终端的工程设计与实战指南

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

2026/10/9 4:56:07 阅读更多 →
GitHub Skills深度解析:官方交互式技能课程怎么玩

GitHub Skills深度解析:官方交互式技能课程怎么玩

如果你的推荐流最近也被skills这个词刷了屏,那多半说的是同一个东西:GitHub 官方推出的交互式技能课程项目。别被这个朴素的仓库名骗了,这不是什么电子书合集,也不是官方文档的换皮版本,而是一整套“把练习题直接布置在…

2026/10/9 4:56:07 阅读更多 →
ENVI SARscape处理Sentinel-1 SLC数据:从导入到地理编码全流程

ENVI SARscape处理Sentinel-1 SLC数据:从导入到地理编码全流程

简介:这份PDF文档面向遥感影像处理初学者与测绘、地信相关从业者,系统讲解ENVI平台下SAR数据的完整预处理流程,帮助读者解决雷达影像斑点噪声抑制、几何与辐射校正等实操难题。资源包共1个PDF文件,大小约1.16MB,内容以…

2026/10/9 4:56:07 阅读更多 →
MyBatis-Plus JSON字段自动映射实体类:TypeHandler原理与实战

MyBatis-Plus JSON字段自动映射实体类:TypeHandler原理与实战

做 Java 后端的兄弟,十有八九都跟数据库里的 JSON 字段打过交道。业务扩展属性、配置快照、第三方回调原文、埋点数据,都爱往一个 TEXT 或者 JSON 类型的列里塞。最痛苦的不是写入,而是读取:MyBatis-Plus 查出来默认是个 String&a…

2026/10/9 4:56:07 阅读更多 →
用AI改造软件测试:从手工点点到年薪60万的真实路径

用AI改造软件测试:从手工点点到年薪60万的真实路径

我在山东菏泽做软件测试做了七年,从最早的点按钮、记Excel用例,到后来写自动化脚本,再到如今带着AI工具链干活。你们可能觉得"测试员"和"AI"这两个词放在一起有点违和,但恰恰是这轮AI工具普及,让我…

2026/10/9 4:56:07 阅读更多 →
DeepSeek-R1学习笔记:从GRPO到蒸馏的推理模型实战拆解

DeepSeek-R1学习笔记:从GRPO到蒸馏的推理模型实战拆解

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

2026/10/9 4:55:07 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →