news 2026/10/1 3:15:54

CH32L103 RISC-V工业MCU选型与低功耗设计实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CH32L103 RISC-V工业MCU选型与低功耗设计实战

1. 项目概述与核心需求拆解

1.1 为什么这轮选型我重点看了CH32L103

做工业项目这些年,MCU选型一直是我在立项阶段最耗神的事。尤其是这两年国产RISC-V工业MCU铺开之后,性能和供货都开始跟传统Cortex-M产品正面竞争,CH32L103就是其中一款让我印象很深的芯片。第一次看数据手册时,我最直观的感受是“外设够花”:一个96MHz的青稞V4C RISC-V内核,居然把USB PD控制器、可编程运放OPA、比较器、CAN、多路高级定时器全塞进去了,低功耗能力也不是摆设。

这颗芯片解决的核心问题很明确:在成本敏感、供货要求高的工业场景里,用一颗MCU同时处理好传感器信号采集、现场总线通信和低功耗待机这三件事。传统方案往往需要“MCU + 外部运放 + 外部PD协议芯片 + 独立看门狗”的组合,而CH32L103把其中一大半功能收进了芯片内部,BOM缩了,设计周期也跟着缩短。

适合谁看?如果你是做工业传感器、智能阀门、便携仪表、Type-C供电类设备,或者正在考虑从Cortex-M平台往国产RISC-V平台迁移,这篇文章讲的选型逻辑、低功耗设计细节和外设配置方法,应该能帮你少踩几个坑。

1.2 选型之前,先把外设需求量化成一张清单

很多工程师选MCU喜欢先看主频、Flash和RAM,这三个参数当然重要,但在工业项目里,更关键的是“外设能力是否和你的系统需求精确匹配”。我的习惯是把需求先拆成可量化的项目,再拿着清单去对比芯片资源。下面是一张我常用的比对表,拿智能变送器项目举例:

需求维度典型需求CH32L103对应的资源关键考量
模拟信号采集压力/温度传感器毫伏级信号12位ADC + 可编程OPAOPA能否直连ADC内部通道
通信接口一路RS485 MODBUSUART + 方向控制IO波特率误差和DE信号时序
现场总线扩展CAN组网CAN 2.0控制器滤波配置是否灵活
执行机构驱动比例阀PWM控制高级定时器互补PWM输出是否支持死区插入
供电方式24V工业电源,部分节点电池供电宽压供电 + 低功耗模式停止/待机模式的电流量级
系统调试程序下载和日志输出WCH-Link调试 + UARTRISC-V调试生态是否顺手

我建议你也按这个思路来:先把所有功能外设列出来,再逐个核对芯片的引脚映射、复用冲突、功耗模式下的行为。不要只看“有没有这个外设”,还要看“这个外设能不能在你需要的引脚上工作”,这两个问题之间往往藏着选型时最大的坑。


2. 低功耗设计:三种工作模式的底层逻辑与唤醒策略

2.1 睡眠、停止、待机:功耗数字背后的设计取舍

CH32L103的低功耗模式和主流ARM Cortex-M MCU类似,分为睡眠、停止、待机三档,但每一档的适用场景差别很大。我先把三者的状态差异列出来再逐个展开:

模式CPU状态外设时钟SRAM内容典型唤醒方式适合场景
睡眠停止保持运行保持任意中断/事件事件驱动且频率较高,比如通信数据到达
停止停止全部停止保持EXTI外部中断、RTC、比较器事件周期性采样的无线传感器节点
待机停止全部停止丢失WKUP引脚、RTC闹钟需要极低静态电流的电池设备

睡眠模式是最容易理解的一档:CPU核心时钟停了,但外设时钟还在跑。这种模式适合做“任务事件密集等待”,比如UART处于接收状态,数据一到就触发中断唤醒CPU处理。它的最大优点是从唤醒到继续执行几乎无延迟,不需要重新初始化时钟和外设,但代价是功耗相对较高,毕竟外设时钟和部分外设电路还在工作。

停止模式则是把芯片内几乎所有时钟都停掉,只保留SRAM内容和部分唤醒逻辑。这是工业传感器节点最常用的档位,唤醒后需要重新配置系统时钟,但SRAM里的数据不会丢。很多工程师第一次用停止模式时容易忽略一个问题:在进入停止模式前,一定要手动关闭那些不需要的外设时钟,否则实际功耗会比预期高出一大截。芯片的“低功耗”不是魔法,它只是给你提供了降低功耗的条件,能不能真正把功耗降下来,取决于你把外设和IO状态管理成什么样。

待机模式下的状态最彻底:除了备份域和RTC等极少量电路,其他逻辑全部断电。代价是SRAM内容会丢失,唤醒后程序从头执行。在一些需要几年电池寿命的超低功耗场合,这种模式几乎是必须的;但如果你的系统需要在唤醒瞬间恢复运行状态,就得把关键数据提前存到Flash或备份寄存器里。

这里需要特别提醒:数据手册上的电流值是典型实验室环境下的结果,实际项目里IO外部上下拉、传感器静态电流、电源芯片自身静态功耗都会叠加进来。看到一款MCU的待机电流是几微安,别直接当成整机待机电流来设计。

2.2 外围器件才是低功耗设计的隐形杀手

我见过不少项目,MCU选型时盯着手册上的低功耗参数猛抠,结果整机待机电流嗖的一下飙到几百微安,最后排查半天发现“凶手”根本不是MCU,而是外围电路里的某颗电阻或某个指示灯。

第一个常见漏电点是IO引脚的外部上下拉电阻。比如某个按键检测引脚拉了10k上拉到3.3V,你进入停止模式前如果把引脚设成浮空输入,这个10k电阻就成了固定漏电路径,按3.3V/10k算,一个引脚就增加0.33mA的电流。处理办法有两个:一是在进入低功耗前把这些引脚重新配置为模拟输入或推挽输出并输出确定电平,二是干脆在硬件设计时就把上下拉电阻放到MCU可关断的供电域里。

第二个坑是电源指示灯。很多开发板上LED串联电阻直接挂在3.3V上,待机时整板电流算下来几毫安都不奇怪。量产设备如果必须要状态指示灯,建议通过三极管或MOS管控制LED供电,低功耗时把这路电源切掉。

第三个问题是电源芯片的静态电流。24V工业电源降压用DC-DC方案没问题,但有些DC-DC芯片在轻载时静态电流本身就很大,甚至达到几百微安。设计低功耗节点时,电源芯片的“空载电流”参数要单独看,必要时选择带使能脚的电源方案,让MCU在进入停止模式后把电源芯片也关掉,或者采用静态电流极低的LDO。

还有一个容易忽略的点:系统里的其他接口芯片,比如RS485收发器、传感器调理芯片、外部PHY,它们是否支持低功耗模式?很多时候这些芯片的静态电流远大于MCU本身的待机电流,但它们的功耗控制往往不在MCU的电源域管理范围内。选型时要把整个信号链上的“静态小电流器件”都列出来,统一设计电源门控策略。

2.3 唤醒策略与代码陷阱

停止模式的代码实现其实不复杂,但有几个细节直接决定系统可靠性。我会在项目中反复使用类似下面这样的入口函数:

void Enter_StopMode(void) { // 1. 关闭不必要的外设时钟,降低停止模式漏电 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE); // 2. 配置EXTI唤醒源,这里以PA13上升沿为例 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 3. 进入停止模式,WFI等待事件 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); // 4. 唤醒后立即重新配置系统时钟 SystemInit(); // 5. 重新开启外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); }

代码本身不难,但“第4步SystemInit”是很多人容易漏掉的。停止模式下PLL、外部晶振、Flash读取时钟全部都被关掉了,唤醒后如果直接操作外设寄存器,系统时钟可能还停留在低速内部RC状态,波特率、PWM频率全部跑偏。所以唤醒后的第一件事,就是把系统时钟恢复到进入低功耗前的配置。

另一个实际项目中的常见问题是EXTI触发电平选错。如果你的唤醒信号是低电平有效,比如UART的空闲线为高、数据到来时拉低,但你配置成上升沿唤醒,那数据永远不会触发唤醒。建议在硬件设计阶段就明确每个唤醒源的有效电平,并画一张“唤醒源-触发沿-优先级”的对照表,自己和同事评审时都不会搞错。


3. 外设配置核心细节:从寄存手感说开去

3.1 USB PD控制器:不只是充电口协议

CH32L103的USB PD控制器是我认为它在同级工业MCU里最不寻常的一点。它把PD物理层收发器和控制器集成在芯片内部,这意味着你的设备可以直接通过Type-C口进行PD协议协商,向电源适配器申请需要的电压,或者作为DFP给外部设备供电。

工业场景里,PD控制器最常见的用法是“诱骗取电”。传统工业设备用的一体化电源适配器,输出电压是固定的12V或24V;但如果你做的是便携仪表、手持终端,想直接用市面上常见的Type-C PD充电器供电,就可以让MCU以UFP角色参与PD协商,把协商结果设定在20V电压档位,再通过后端DCDC降压到系统需要的电压。这样做的好处是适配器兼容性大幅提升,BOM里还省掉了一颗外部PD协议芯片,成本和PCB面积都降下来了。

配置PD控制器时,最需要留意的是CC引脚的上下拉电阻。CC1和CC2在作为UFP时需要5.1k下拉到GND,作为DFP时则需要通过Rd/Rp组合实现角色检测。如果复用配置不对,插上Type-C线缆后USB接口毫无反应,很常见的原因就是CC引脚既没有配置成复用功能,也没有外部正确的上拉/下拉电阻。

另一个细节是VBUS检测。PD协商过程中,MCU需要实时采样VBUS电压来判断连接状态和供电状态,记得把VBUS检测引脚的输入耐压余量留足,并且加上合适的RC滤波,避免插拔瞬间的浪涌打坏引脚。

3.2 OPA+ADC:把工业信号链做干净

CH32L103内部集成的可编程运算放大器OPA,是它另一个让我觉得“贴心”的地方。传统M0/M3内核MCU采集毫伏级传感器信号时,前面必须加一颗外部仪表放大器或普通运放做信号调理,而CH32L103的OPA输出可以直接映射到内部ADC通道,省掉了外部运放和PCB走线。

我在压力变送器项目里用过这个组合,信号链是这样设计的:传感器电桥输出差分信号,先经过一级OPA做放放大,放大倍数根据传感器满量程输出和ADC参考电压反复计算。比如传感器满量程是40mV,ADC参考电压采用内部的2.4V,那我至少需要60倍左右的增益才能把满量程信号放大到2.4V附近。实际配置时,用两级20倍放大比一级60倍放大更容易稳定,增益带宽积的压力也更小。

还有几个细节需要说明。OPA的输入共模范围很关键,如果你的传感器输出接近电源轨,必须选用轨到轨输入特性的OPA,否则小信号会被截断。OPA的输出级也要关注,一般建议在OPA输出和ADC输入之间留一个几百欧的串联电阻再配合220pF的电容到地,构成低通滤波器,滤掉高频噪声。这里阻容值的选择思路和外部运放电路完全一样,不要把OPA当成“免费的模拟器件”就忽略精馏设计。

另外,CH32L103内部OPA与ADC连接时,信号路径可以完全在片内完成,外部引脚上甚至不需要引出任何模拟信号线,这对EMC抗干扰是很大的优势。工业现场环境里,模拟信号走线只要露出PCB超过2厘米,就会变成天线去接收各种干扰,能把这些信号路径封在硅片内部,效果比任何软件滤波都好。

3.3 定时器、CAN与UART的组合思路

定时器方面,CH32L103的高级定时器支持互补PWM输出和死区插入,这是电机控制、比例阀驱动、开关电源控制的基本盘。在工业电机控制场景里,互补PWM最重要的参数是死区时间。死区时间设置太短,上下桥臂同时导通会烧功率管;设置太长,输出波形失真,电机噪音变大。计算死区时间时,要考虑功率管驱动芯片的传播延时和功率管的关断延时,一般工业应用从几百纳秒到几微秒不等,建议一开始先按器件手册推荐值偏中间设置,再用示波器实测波形微调。

CAN在工业现场通信中还在大量使用,CH32L103的CAN控制器配波特率时要特别重视位时序的采样点位置。很多工程师设波特率时只关注“1M波特率”这个数字,却忽略了采样点。工业总线长度长时,采样点最好靠近85%-90%位时间位置,能有效容忍线缆传播延时和节点时钟误差。我习惯先把位时序参数算好再填寄存器,而不是直接套参考例程里的预设值。

UART的配置在低功耗系统里更讲究。如果需要在停止模式下由UART唤醒MCU,那UART的时钟本身在停止模式下是被关掉的,通常只能通过RX引脚上的电平变化激发EXTI来唤醒,而不是靠UART硬件中断。所以设计时要在UART RX引脚和EXTI线之间规划好映射关系,并把唤醒后的字节接收处理逻辑想清楚,避免唤醒后收到的第一个字节被丢。

3.4 时钟树与引脚复用:最容易翻车的地方

CH32L103内部时钟树支持HSI、HSE和PLL三种时钟来源。低功耗系统里,我最常用的组合是正常运行时通过外部8MHz晶振加PLL倍频到96MHz,进入停止模式前切回HSI并关闭PLL,唤醒以后再重新开PLL。

为什么这么折腾?因为外部晶振的起振时间是毫秒级的,直接从停止模式恢复到96MHz全速跑,如果等待晶振稳定后再继续,响应速度会慢;用HSI起振虽然快,但精度一般,通信波特率误差会偏大。所以唤醒后建议先把系统时钟切到HSI保证快速启动,等外设初始化快完成前再打开PLL切换到高速时钟。

引脚复用是另一个高频翻车点。CH32L103的UART、SPI、定时器等都支持引脚重映射,但不同外设之间会争用同一个引脚。比如你想用UART1的TX/RX放在PA9/PA10,结果发现PA9同时被定时器1的CH2复用了,配置时稍不注意,功能就会互相干扰。我自己的做法是在原理图阶段就画一张“引脚占用表”,每个引脚一行,明确列出用到的复用功能、默认功能、以及低功耗模式下该引脚应处于什么状态。这张表评审完一本,后面软件调试能少掉80%的怪问题。


4. 从一个工业节点样机看整套选型落地

4.1 功能场景定义与引脚分配

为了把这颗芯片的选型逻辑讲透彻,我拿一个实际做过的智能压力变送器升级项目当案例。这个节点的需求不复杂,但覆盖了CH32L103的几大核心外设:模拟采集、OPA放大、ADC、RS485通信、PWM阀门控制。

功能定义如下:传感器输出毫伏级差分信号,经过OPA放大后进入ADC;系统运行状态通过RS485总线用MODBUS协议上报;同时输出一路PWM到比例阀驱动单元,根据压力偏差调节阀门开度。系统供电为24V现场电源,大部分时间里使用停止模式,只在远程轮询或本地控制事件发生时进入工作模式。

我把引脚分配列成了表格,这是我在项目里最终确定的方案:

功能模块使用引脚复用配置备注
OPA输入PA1模拟输入传感器信号接入
OPA输出到ADC内部通道内部直连无需引脚片内信号链
RS485收发PA9(DE) / PA2(TX) / PA3(RX)UART1重映射 + GPIODE必须提前翻转
PWM输出PA8TIM1_CH1互补输出备用占用PA7
唤醒按键PA13EXTI13上升沿同时保留SWD调试功能时要小心
调试接口PA13/PA14SWD需要和唤醒源规划好

这里有个容易踩的坑:PA13同时是SWDIO,如果你把它复用到EXTI唤醒,调试器可能无法连接MCU。我在实际布局时把唤醒功能放到了另一个引脚,保留了完整的SWD调试能力。嵌入式开发不像写应用软件,没有调试器,效率会低一个量级。

4.2 电源、复位与外围器件选型

整机电源从24V工业母线进来,第一级是防反接和TVS保护,然后经过DC-DC降到3.3V给MCU和传感器供电。这颗DC-DC的选型我特别看了空载电流,因为节点大部分时间处于停止模式,如果DC-DC芯片自己的空载电流就有100多微安的,整个低功耗设计就废了。最终选了一颗静态电流在微安级别的同步降压芯片,低压差时效率也还能接受。

模拟电源部分我没有直接从3.3V拉一条线给OPA和ADC用,而是加了磁珠和π型滤波,再配合100uF电解和100nF陶瓷电容组合。这样做是为了把电机、继电器动作时产生的电源噪声隔离在模拟电路之外。ADC的参考电压这里用的内部参考,做了软校准,精度可以满足0.2%左右的系统需求;如果遇到精度要求更高的应用,建议干脆选外部基准源芯片。

复位电路只用了一颗0.1uF的电容,因为CH32L103内部有POR上电复位电路,外部复位芯片对工业项目来说很多时候没必要。调试接口那边,我留了标准的SWD 4线接口,加上WCH-Link,下载和调试速度都很顺手,不熟悉RISC-V生态的工程师也不用担心。

4.3 软件层面的低功耗任务调度

这套系统的软件逻辑,我把它简化为一个状态机:初始化 - 待命 - 采集 - 通信 - 回到待命。

上电后先做GPIO配置、时钟树配置、外设初始化,然后直接进入停止模式。停止期间,RTC定时闹钟或RS485总线上的活动事件都可以唤醒芯片。唤醒后软件会先判断原因:如果是RTC定时到,就执行一次传感器采样,把结果通过RS485上报,然后再次进入停止模式;如果是外部通信事件,就临时进入全速工作模式,处理完远程指令后再回到低功耗。

我把这个调度逻辑里最重要的几个点列一下:

  1. 进入停止模式前,一定要把所有ADC连续采集、定时器PWM输出、DMA传输全部停掉,否则唤醒后状态机容易跑错。
  2. RS485的DE方向引脚在通信结束后要立即切回接收方向,并且保持在确定的电平,否则总线空闲态不对,下一轮通信可能无法启动。
  3. 事件处理后,不要立刻进入停止模式,建议先让系统时钟切换到HSI再进入,并把不必要的模拟外设关断。

这套调度做下来,整机在非工作时段能控制在较低水平,按键唤醒的响应时间也基本感觉不到延迟,除了通信唤醒后第一个请求会因为时钟重建稍慢一些,其他功能都正常。


5. 常见问题排查与避坑实录

5.1 停止模式唤醒后的“半死”问题

有段时间我调试一个使用停止模式的节点,发现一个非常诡异的规律:按键唤醒后程序看起来在跑,但USART发出来的数据全部是乱码,PWM波形也完全不对。用调试器一停,发现PC指针已经跑回main函数开头了,但RCC寄存器里的系统时钟配置还是低速内部RC的频段。

这里的问题本质在于:停止模式唤醒后,系统默认回到复位后的时钟状态,也就是HSI低速档。如果我在唤醒函数里没有重新调用SystemInit,或者调用顺序早于USART初始化,那后面所有外设的波特率、定时器分频全部按错误时钟算,表现就是乱码和频率偏移。

排查办法很简单:在唤醒路径入口处加一个GPIO翻转作为示波器观测点,再在SystemInit的前后各抓一次时钟输出引脚,确认系统时钟确实恢复稳定后再继续初始化其他外设。只要这条链路时序对了,类似乱码问题就再也没出现过。

5.2 外设时钟和引脚复用的诡异故障

另一个让我印象深刻的坑是写给UART寄存器写不进去。代码逻辑完全正确,初始化顺序也跟官方例程一致,但UART2的TX引脚就是拉不出波形。最后看了参考手册才发现,UART2外设时钟使能位在某个特定低功耗唤醒路径下会被硬件自动清零。这不是Bug,而是低功耗模式的合理行为:系统在唤醒时对部分外设做了电源门控,要想恢复使用,必须重新使能对应外设时钟。

所以后来我给自己定了一条规矩:所有外设初始化函数都写成幂等风格,函数开头先读取RCC时钟使能位,如果没使能就重新打开,再继续后面配置。这样即使主流程被低功耗唤醒打断过,重新初始化时也能恢复。

引脚复用问题就更常见了,比如定时器PWM信号输出后,示波器测量发现对地短路,最终原因是同一引脚被初始化成了推挽输出复用,但又被后来的GPIO配置函数改成了模拟输入。多人协作开发时,一个初始化文件里改动GPIO设置,很容易影响另一个模块。这种问题排查很费时间,建议所有引脚配置集中放在一个文件里,模块之间不要随意改引脚。

5.3 低功耗实测值与手册“不符”

前面反复强调过外围电路的漏电影响,这里再补一个测量方法上的坑。用万用表测uA级电流时,万用表的表笔内阻本身会引入压降,如果系统电源电压被表笔内阻“吃掉”了一部分,芯片可能工作在不正常状态,电流读数也就没参考价值了。更可靠的做法是用精密台式电流表或电流探头,或者干脆在电源回路里串联一个10欧采样电阻,用示波器测电阻两端压降再换算电流,还能顺便看到唤醒瞬间的电流峰形。

还有一次我发现待机电流在温度升高后翻倍,排查后才知道是板上某颗外部传感器芯片在温度升高时漏电增大,跟MCU没有半毛钱关系。所以如果你的低功耗系统是温度变化剧烈的工业现场,最好在-40℃、25℃、85℃三个温度点各做一次电流摸底,而不是只在常温下测一次就拍板定方案。

5.4 这类工业MCU选型到底该怎么横向对比

如果你正在多个工业MCU之间摇摆,我给你一个比较具体的横向对比维度表。就拿CH32L103和传统低功耗Cortex-M产品,以及同为RISC-V阵营的HC32L系列、GD32L系列对比来看,关键不是只看主频和Flash,而是看以下几点:

对比维度CH32L103传统低功耗Cortex-M其他国产RISC-V低功耗MCU
内核和生态RISC-V,WCH调试工具支持齐全ARM生态成熟,案例资料多RISC-V,但各家IDE工具链参差
模拟外设集成度带OPA和PD控制器通常不带PD,运放要看型号部分带运放,但PD集成少见
低功耗模式睡眠/停止/待机深度睡眠模式选择多,功耗极低低功耗IP设计差异大
供货和成本国产供应链友好视具体品牌和型号而定国产供应链友好
资料和例程参考手册齐全,但部分例程需要自己啃文档丰富,例程海量不同厂商资料质量差异大

选型决策我一般分成三步:先把硬性需求(通信接口、模拟通道、封装、温度范围、功耗指标)筛一遍;然后重点看“外设的集成度是否可以减少外部BOM”,这一步能省下大量成本和工作量;最后再考虑生态和工具链是否顺手。按这个顺序走,CH32L103在很多工业传感和控制项目里都会是性价比很突出的选择。

最后说一个我自己的习惯。无论芯片手册写得多么漂亮,我都会在布局前就先把官方评估板买一块回来,用最小系统板把关键外设全部跑通,把它当成“参考设计”而不是“玩具”。这颗芯片的PD控制器、OPA和低功耗唤醒这些功能,单独看文档可能觉得简单,但组合在一起跑业务逻辑时才会暴露真正的时序问题和寄存器依赖。在评估板上把坑提前踩完,比等产品打样回来再返工要划算得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 3:15:39

猪场实拍YOLO数据集:3万+真场景目标检测数据

简介:本资源是面向农业AI与智能养殖领域的猪只目标检测专用数据集,适用于计算机视觉初学者、算法工程师及智慧畜牧项目开发者,解决猪只在复杂监控场景下的精准识别与定位难题。数据集包含2000张真实养猪场监控实拍图像,配套3万余个…

作者头像 李华
网站建设 2026/10/1 3:15:11

双向链表核心操作详解:结构、插入删除、逆置与C++实现

写数据结构相关的代码这么多年,我有一个很深的体会:单链表用起来确实顺手,但真要往回找前驱节点的时候,只能从头再遍历一遍,总有种“开过头了还要倒车”的别扭感。后来用上双向链表,两个方向都能走&#xf…

作者头像 李华
网站建设 2026/10/1 3:15:10

本地部署Qwen 3.8 27B:GGUF量化与llama.cpp实战指南

1. 为什么要在本地折腾 Qwen 3.8 27B第一次看到 Qwen 3.8 27B 这个规格的时候,我脑子里冒出来的第一个念头是:27B 这个参数量卡在一个非常微妙的位置。往上够不着 70B 那种“必须上多卡”的门槛,往下又比 7B、14B 明显更能打,尤其…

作者头像 李华
网站建设 2026/10/1 3:15:09

Linux系统管理实战:文件权限、用户与网络配置

Linux record 05,是我这套学习记录里的第五篇。写记录这件事,最早是因为自己记性不太好,每次在Linux上折腾完一个功能,隔一阵子就忘得一干二净,后来索性养成习惯:遇到问题、查资料、搞定问题、复现一遍&…

作者头像 李华
网站建设 2026/10/1 3:13:54

Spring Security踢出指定用户:从SessionRegistry到JWT无状态方案

SpringSecurity踢出指定用户,这个需求听起来很不起眼,但真正动手做的时候,你会发现它牵扯出来的问题一个比一个多:会话怎么追踪、踢人之后用户下一次请求怎么被拦截、无状态 JWT 场景下又该怎么处理。我最近在一个多端登录的后台系…

作者头像 李华
网站建设 2026/10/1 3:12:47

Linux下memcached实战指南:从缓存原理、安装配置到高并发调优

Linux下面做性能优化、扛高并发,memcached早晚绕不开。这篇博文是我在实际运维和项目开发中反复使用memcached之后整理出来的入门实战笔记,从原理、安装到命令行操作、项目接入、调优排错,一条线讲清楚,新手看完能直接上手干活&am…

作者头像 李华