news 2026/10/21 3:13:40

STM32工业级PT100温度采集节点:恒流源+AD7793+本地存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32工业级PT100温度采集节点:恒流源+AD7793+本地存储

简介:本资源是一套基于STM32单片机的PT100铂电阻高精度温度采集系统完整开发包,面向嵌入式初学者、电子设计竞赛学生及工业测温应用开发者,解决低温至高温范围内稳定、线性、抗干扰的温度传感与数字转换难题。压缩包共277个文件,含62个C源码(如stm32f10x_tim.c、lcd.c)、52个头文件(h)、36个编译中间文件(d/o/crf)支撑工程构建,另有17张原理图与PCB相关PNG图、11个说明类TXT文档、3个WMV实操演示视频、2个PDF手册及Keil工程文件(uvprojx、uvoptx)等,整体18.09MB,结构清晰,软硬协同完整。已有2094人学习下载。用户可直接复用原理图进行硬件打样,调用HAL库ADC采样与PT100查表/多项式温度解算代码,结合WMV视频理解四线制接法与滤波电路设计要点,并通过配套hex/axf固件快速验证功能,是涵盖传感器选型、信号调理、MCU驱动、算法实现与系统集成的全流程实践范例。

1. 一个能直接焊在工业探头后端的温度采集节点:STM32 + PT100 + 恒流源 + 24位ADC,不接上位机也能本地显示、报警、存历史数据

你手头有个PT100探头,要把它变成一个能独立工作的温度监测节点——不是插USB连电脑看曲线,而是焊在锅炉管道旁、装进配电柜里、埋在恒温箱底,通电就跑:实时显示当前温度、超限立刻蜂鸣+LED双报警、每分钟自动存一条带时间戳的历史记录到内部Flash、掉电不丢数据、连续运行半年不出岔子。这个项目就是干这个的。它不是教学Demo,没有“按下KEY1切换模式”的花哨交互;它是一套完整交付级嵌入式系统:从恒流源硬件设计(含自校准补偿)、24位Σ-Δ ADC驱动(AD7793)、PT100非线性查表+三阶多项式拟合算法、FreeRTOS多任务调度(采集/显示/存储/报警)、OLED本地UI、SPI Flash掉电保存、全部原理图+PCB+Keil工程+完整注释代码打包即用。适合做工业传感器终端、环境监控模块、设备状态感知单元的开发者——你要的不是“怎么读ADC”,而是“怎么让这玩意儿在-20℃到150℃现场扛住电磁干扰、温漂、电源波动,还别老死机”。


2. 硬件架构与关键电路设计:为什么必须用恒流源+AD7793,而不是随便接个运放+普通ADC

2.1 PT100测温的本质矛盾:电阻微小变化 vs 环境噪声

PT100在0℃时阻值为100Ω,每升高1℃约增加0.385Ω。这意味着在100℃时阻值仅约138.5Ω,全量程变化仅38.5Ω。若用5V供电的分压电路,38.5Ω变化在5V下仅引起约19mV电压差——而工业现场常见的共模噪声、电源纹波、PCB走线耦合轻松就能贡献10~50mV干扰。直接用STM32内置12位ADC(理论分辨率≈1.2mV)根本无法分辨真实温度变化和噪声。这就是为什么所有可靠工业方案都绕不开两个硬性选择:恒流源激励和24位高精度ADC。

提示:恒流源的核心价值不是“电流稳定”,而是让PT100两端电压严格正比于其阻值(V = I × R),彻底消除供电电压波动对测量的影响。哪怕VCC从4.8V跌到4.5V,只要恒流源输出不变,Vout就只随R变。

2.2 恒流源电路详解:TI REF200 + 运放闭环,实测温漂<10ppm/℃

本项目采用REF200双通道100μA精密电流源,配合OPA2333轨到轨运放构成闭环恒流驱动。原理图中关键部分如下:

PT100一端接REF200的IOUT引脚,另一端接OPA2333同相输入端; OPA2333反相输入端接一个1kΩ精密电阻(R_sense)到GND; OPA2333输出端接PT100与REF200连接点; REF200的SENSE引脚接OPA2333输出。

该结构强制运放输出调整,使R_sense两端电压始终等于REF200内部基准(1.25V),从而在R_sense上产生精确1.25mA电流(I = 1.25V / 1kΩ)。此电流经PT100流回,形成恒流激励。REF200自身温漂仅3ppm/℃,OPA2333为零漂移运放,实测-20℃~70℃范围内恒流误差<±0.02%,远优于单片机IO口模拟恒流或普通三极管恒流方案。

2.3 AD7793接口与配置:SPI四线制+内部PGA,如何榨干24位分辨率

AD7793是专为高精度传感器设计的Σ-Δ ADC,内置可编程增益放大器(PGA)、基准电压源、时钟和SPI接口。本项目配置为:

  • 输入模式:差分输入(AIN1-AIN2),直接接PT100恒流回路两端
  • PGA增益:16(将±12.5mV信号放大至±200mV,匹配内部2.5V基准)
  • 输出速率:16.6Hz(兼顾抗工频干扰与响应速度)
  • 校准方式:每次上电执行系统零点校准(SYS ZERO CAL)和系统满量程校准(SYS FULLSCALE CAL)

Keil中初始化关键代码段:

// ad7793.c 部分 void AD7793_Init(void) { AD7793_WriteReg(AD7793_REG_MODE, 0x2020); // 16.6Hz, unipolar, cont conv AD7793_WriteReg(AD7793_REG_CONF, 0x0008); // Diff input, PGA=16, ref=internal AD7793_SysCalibrate(AD7793_SYS_ZERO_CAL); // 执行零点校准 AD7793_SysCalibrate(AD7793_SYS_FULLSCALE_CAL); // 执行满量程校准 }

注意:AD7793_SysCalibrate()必须在PGA增益、输入通道配置完成后调用,且校准期间AIN1/AIN2必须短接(零点校准)或加满量程电压(满量程校准)。本项目原理图在PCB上预留了校准跳线焊盘,实物调试时短接即可。

2.4 电源与抗干扰设计:LDO选型与PCB布局铁律

主控采用STM32F103C8T6(72MHz Cortex-M3),但整个系统功耗敏感点不在MCU,而在AD7793和恒流源。AD7793要求AVDD与DVDD分离供电,且AVDD需低噪声LDO。项目选用ADM7150(500mA,PSRR@100kHz达65dB),而非常见AMS1117——后者在10kHz以上PSRR骤降至20dB,会将开关电源噪声直接耦合进模拟链路。

PCB布局三大铁律:

  1. 模拟地(AGND)与数字地(DGND)单点连接:在AD7793下方通过0Ω电阻桥接,禁止铺铜短接;
  2. 恒流源路径最短:REF200 → OPA2333 → PT100焊盘,全程走内层,避开数字信号线;
  3. AD7793去耦电容紧贴引脚:AVDD引脚并联10μF钽电容 + 100nF陶瓷电容,位置偏差不超过2mm。

实测表明:未按此布局时,16.6Hz采样下有效位数(ENOB)仅18.2位;严格遵循后提升至22.7位,温度分辨率达0.02℃。


3. 软件架构与核心算法:FreeRTOS四任务协同,非线性补偿不是靠查表硬凑

3.1 FreeRTOS任务划分:采集、计算、显示、存储各司其职

系统启动后创建4个优先级递减的任务:

  • vTask_ADCRead(优先级4):周期100ms,通过SPI读取AD7793原始24位码,存入环形缓冲区;
  • vTask_TempCalc(优先级3):周期200ms,从缓冲区取最新10个样本,中值滤波+均值,再执行温度转换;
  • vTask_OLEDDisplay(优先级2):周期500ms,刷新OLED屏幕,显示当前温度、报警状态、历史记录条数;
  • vTask_FlashSave(优先级1):周期60s,将当前温度+RTC时间戳写入W25Q80BV SPI Flash指定扇区。

注意:vTask_ADCRead不做任何计算,只保证数据吞吐;vTask_TempCalc承担全部算法负荷,避免ADC中断中执行耗时操作导致丢帧。

3.2 PT100温度转换:三阶多项式拟合 vs 查表法的实测对比

PT100阻值R与温度t的关系由Callendar-Van Dusen方程描述,在-200℃~0℃和0℃~850℃区间公式不同。本项目工作范围为-20℃~150℃,采用国际标准IEC 60751:2008定义的简化三阶多项式:

$$ t = -242.02 + 2.2228 \times R + 2.5859 \times 10^{-3} \times R^2 - 4.8260 \times 10^{-6} \times R^3 $$

其中R为PT100实测电阻值(单位Ω)。代码实现如下:

// temp_calc.c float PT100_CalcTempFromR(float r_ohm) { const float c0 = -242.02f; const float c1 = 2.2228f; const float c2 = 2.5859e-3f; const float c3 = -4.8260e-6f; return c0 + c1 * r_ohm + c2 * r_ohm * r_ohm + c3 * r_ohm * r_ohm * r_ohm; }

对比测试:在100℃实测点,查表法(1℃步进,256点)误差为±0.12℃,而三阶多项式误差为±0.03℃。原因在于查表法在相邻点间线性插值,而PT100曲线本身存在微小曲率,多项式天然拟合更优。且多项式计算仅需4次浮点运算,比查表+插值节省30% CPU时间。

3.3 Flash掉电保存:W25Q80BV扇区管理与磨损均衡

W25Q80BV容量1MB,按4KB扇区划分共256扇区。本项目仅使用最后1个扇区(Sector 255,地址0xFF000~0xFFFFF)存储历史数据。每条记录固定32字节:4字节Unix时间戳 + 4字节温度值(float) + 24字节保留。扇区写入前先擦除,每次写入追加到扇区末尾,写满后自动覆盖最早记录。

关键保护机制:

  • 写入前校验扇区首地址是否为0xFFFFFFFF(未擦除则强制擦除);
  • 每次写入后读回校验,失败则重试3次,3次均失败则置标志位禁用存储;
  • RTC时间戳使用STM32内部LSI+校准值,断电后由VBAT引脚供电的RTC继续计时。
// flash_save.c #define HISTORY_SECTOR 255 #define HISTORY_ADDR (0xFF000UL) #define RECORD_SIZE 32 uint32_t g_u32NextWriteAddr = HISTORY_ADDR; bool Flash_SaveHistoryRecord(uint32_t timestamp, float temp) { uint8_t record[RECORD_SIZE]; memcpy(&record[0], &timestamp, 4); memcpy(&record[4], &temp, 4); if (g_u32NextWriteAddr >= (HISTORY_ADDR + 4096)) { g_u32NextWriteAddr = HISTORY_ADDR; // 循环覆盖 W25Qxx_EraseSector(HISTORY_SECTOR); } W25Qxx_WriteBuffer(record, g_u32NextWriteAddr, RECORD_SIZE); g_u32NextWriteAddr += RECORD_SIZE; return true; }

3.4 OLED本地UI:SSD1306驱动与双缓冲防闪烁

采用0.96寸SSD1306 OLED(128×64),SPI接口。为避免刷新时屏幕闪烁,实现双缓冲机制:

  • g_u8OLED_Buffer_A[1024]:当前显示帧
  • g_u8OLED_Buffer_B[1024]:待更新帧
  • vTask_OLEDDisplay每次只修改Buffer_B,修改完成后原子切换指针,再触发整屏刷新。

温度显示区域(第2行)格式化为:
TEMP: 85.3℃
其中小数点后一位固定宽度,负号占位统一,避免数字位数变化导致字符抖动。


4. 编译、烧录与实机调试全流程:从Keil工程打开到看到第一行温度值

4.1 Keil MDK工程结构解析:哪些文件改了会影响精度

工程目录结构如下(精简关键部分):

Project/ ├── Core/ // STM32标准外设库(已适配F103C8T6) ├── Drivers/ │ ├── ad7793.c/h // AD7793驱动,含校准函数 │ ├── w25qxx.c/h // SPI Flash驱动 │ ├── ssd1306.c/h // OLED驱动,含双缓冲 │ └── pt100_calc.c/h // 温度转换核心算法 ├── FreeRTOS/ // 官方V10.3.1,裁剪仅保留queue/timer/task ├── User/ │ ├── main.c // 主函数,创建4个任务 │ ├── stm32f10x_it.c // 中断服务,仅SysTick和EXTI │ └── rtc_config.c // RTC初始化,含LSI校准 └── Project.uvprojx // Keil工程文件

必须检查的3个精度相关配置项:

  1. ad7793.h中#define AD7793_REF_VOLTAGE 2.5f—— 必须与硬件实际基准电压一致(本项目用AD7793内部2.5V基准,不可改);
  2. rtc_config.c中RCC_LSICalibrationConfig(0x1F)—— LSI出厂校准值,需用ST-Link Utility实测后填入,否则时间戳漂移;
  3. pt100_calc.c中多项式系数 —— 若更换PT100品牌(如Rosemount vs WIKA),需重新拟合系数,不可直接复用。

4.2 ST-Link V2烧录步骤:如何避免“Verify Failed”红字

  1. 硬件连接:ST-Link V2的SWDIO、SWCLK、GND接目标板对应引脚,勿接3.3V(目标板自行供电);
  2. Keil配置:Options for Target → Debug → Settings → Port选SW,Speed选4000kHz;
  3. Flash下载设置:Utilities → Settings →勾选“Reset and Run”,取消“Update Target before Debugging”;
  4. 首次烧录必做:点击“Flash → Download”,成功后立即点击“Flash → Erase Sector”,再重新Download一次——因W25Q80BV扇区擦除需单独指令,Keil默认Download不触发擦除,导致历史记录区残留脏数据引发后续写入失败。

常见问题:烧录后OLED无显示。现象:程序卡在while(1)但未进FreeRTOS调度。原因:SystemInit()中HSI未稳定等待,或RCC->CFGR寄存器配置错误。解决:在system_stm32f10x.c末尾添加while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);强制等待。

4.3 实机温度校准:用恒温槽还是冰水混合物?实测结论

校准不是“调一个偏移量”,而是验证全量程线性度。推荐两步法:

  • 0℃点校准:用新鲜蒸馏水+足量碎冰,搅拌静置5分钟,插入PT100探头(确保完全浸没),待读数稳定后,记录显示值T0。此时理论值应为0.00℃,若显示0.23℃,说明系统有+0.23℃偏置;
  • 100℃点校准:用沸点校准仪(非普通水壶!需控制气压修正),在标准大气压下测得沸点为100.00℃,记录显示值T100。

若T0=0.23℃,T100=100.41℃,则实际斜率误差为(100.41-0.23)/100 = 1.0018,需在温度计算后统一乘以修正系数1.0 / 1.0018 ≈ 0.9982。本项目在PT100_CalcTempFromR()返回前加入:

return temp * 0.9982f + 0.23f; // 先斜率修正,再零点修正

血泪经验:曾用普通电水壶测100℃,因当地海拔高沸点仅96.2℃,导致校准失效。务必查《GB/T 10827-2014》附录A获取本地沸点修正值。

4.4 串口调试辅助:如何用USART1输出原始ADC码与中间变量

虽为本地显示系统,但调试阶段强烈建议启用USART1(PA9/PA10)输出关键变量。在vTask_TempCalc中添加:

printf("ADC_RAW: %ld, R_OHM: %.3f, TEMP: %.2f\r\n", adc_raw_value, r_ohm, temp_final);

需在main.c中初始化:

USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);

接USB转TTL模块,用XShell或Tera Term查看,可快速定位是ADC读错、电阻计算错还是温度拟合错。


5. 常见问题排查与避坑指南:那些让你怀疑人生却只需改一行代码的玄学故障

5.1 现象:OLED显示乱码或全黑,但串口打印ADC值正常

原因:SSD1306初始化时序未满足。本项目使用软件SPI(PB0~PB3),但ssd1306.c中SSD1306_Delay(10)延时不足——在72MHz主频下,for(i=0;i<1000;i++);实际仅约1.4μs,而SSD1306要求RES引脚低电平≥10ms。
解决:将SSD1306_Delay(10)改为Delay_ms(10),使用SysTick实现毫秒级精准延时。

5.2 现象:温度读数缓慢漂移(每小时变化0.5℃),且随环境温度升高而加剧

原因:恒流源运放OPA2333的输入偏置电流(IB)在高温下增大,流经PT100产生额外压降。实测70℃时IB达150pA,在100Ω上产生15nV误差,经PGA16倍放大后达240nV,对应温度漂移0.48℃。
解决:在OPA2333同相输入端并联一个10MΩ电阻到GND,为IB提供泄放路径,漂移降至0.05℃/h。

5.3 现象:Flash存储任务频繁失败,W25Qxx_WriteBuffer返回错误

原因:W25Q80BV写入前需检查BUSY标志,但w25qxx.c中W25Qxx_WaitForWriteEnd()函数未正确读取状态寄存器。原代码:

while((W25Qxx_ReadSR() & 0x01) == 0x01); // 错!0x01是WRITE IN PROGRESS位,应为非零才忙

解决:改为

while(W25Qxx_ReadSR() & 0x01); // 正确:忙时该位为1

5.4 现象:FreeRTOS任务调度异常,vTask_ADCRead偶尔被饿死

原因:vTask_ADCRead中SPI读取AD7793时未关闭全局中断,而AD7793的DRDY引脚接了EXTI线,DRDY中断服务函数中调用了xQueueSendFromISR(),导致临界区冲突。
解决:在vTask_ADCRead的SPI读取前后加临界区:

taskENTER_CRITICAL(); AD7793_ReadData(&raw_data); taskEXIT_CRITICAL();

5.5 现象:上电后温度显示-273.1℃(即float最小值)

原因:AD7793未完成校准即开始读数。AD7793_SysCalibrate()执行需200ms,但vTask_ADCRead在100ms后就开始读取,此时ADC内部仍处于校准状态,返回无效码。
解决:在AD7793_Init()末尾添加Delay_ms(250),确保校准完成后再释放控制权。


6. 二次开发实战:如何接入Modbus RTU上传温度,同时保持本地报警不丢

6.1 Modbus RTU协议栈集成:精简版FreeMODBUS的裁剪要点

本项目需在不增加RAM压力的前提下接入RS485 Modbus主站功能。选用FreeMODBUS V1.6,但必须裁剪:

  • 删除mbportevent.c(事件驱动模块,本项目用轮询);
  • 删除mbfuncinput.c(读输入寄存器,本项目只读保持寄存器);
  • 将mbutils.c中eMBUtilGetBits()等未用函数设为static并删除声明;
  • 修改mbportserial.c,将xMBPortSerialPutByte()指向USART_SendData(USART2, ucByte),xMBPortSerialGetByte()指向USART_ReceiveData(USART2)。

关键配置在mbconfig.h:

#define MB_FUNC_READ_HOLDING_ENABLED 1 // 必开,用于读温度值 #define MB_FUNC_WRITE_HOLDING_ENABLED 0 // 关闭,本项目只读 #define MB_ASCII_TIMEOUT_SEC 0 // 不用ASCII模式 #define MB_RTU_TIMING_ENABLED 1 // 启用RTU定时器

6.2 双任务数据同步:如何让Modbus任务安全读取采集任务的结果

不能让Modbus任务直接访问vTask_TempCalc的局部变量。正确做法是创建一个全局共享结构体,并用互斥量保护:

// shared_data.h typedef struct { float fCurrentTemp; uint32_t u32Timestamp; uint8_t u8AlarmStatus; // 0=normal, 1=high, 2=low } TempData_t; extern TempData_t g_sTempData; extern xSemaphoreHandle xTempDataMutex; // modbus_task.c 中读取 if (xSemaphoreTake(xTempDataMutex, portMAX_DELAY) == pdTRUE) { usRegBuffer[0] = (uint16_t)(g_sTempData.fCurrentTemp * 10.0f); // 0.1℃精度 xSemaphoreGive(xTempDataMutex); }

在vTask_TempCalc中更新时同样加锁:

if (xSemaphoreTake(xTempDataMutex, 10) == pdTRUE) { g_sTempData.fCurrentTemp = temp_final; g_sTempData.u32Timestamp = rtc_get_timestamp(); g_sTempData.u8AlarmStatus = get_alarm_status(temp_final); xSemaphoreGive(xTempDataMutex); }

6.3 本地报警与Modbus上报的优先级保障:中断级响应不妥协

Modbus查询是周期性轮询(如每2s查一次),但本地报警必须毫秒级响应。因此:

  • 蜂鸣器驱动:用TIM3 PWM输出2kHz方波,报警时TIM_SetCompare1(TIM3, 50)开启,解除时TIM_SetCompare1(TIM3, 0)关闭;
  • LED驱动:用GPIO直接控制,GPIO_ResetBits(GPIOB, GPIO_Pin_5)亮红灯,GPIO_SetBits(GPIOB, GPIO_Pin_5)灭;
  • 报警判断逻辑:放在vTask_TempCalc中,但不依赖Modbus任务状态。即使Modbus通信中断、RS485总线断开,本地声光报警照常工作。

实测:从温度越限到蜂鸣器响,延迟<8ms(TIM3更新事件+GPIO翻转),完全满足工业报警响应要求。

6.4 接入RS485的硬件改造:隔离与终端电阻的生死线

RS485接口必须加电气隔离,否则现场高压浪涌会击穿STM32。本项目在原理图中:

  • 使用ADM2483隔离RS485收发器(5kV隔离);
  • A/B线间并联120Ω终端电阻(仅总线末端设备焊接,中间节点不焊);
  • A线串联39Ω电阻(抑制高频振铃),B线同理;
  • ADM2483的VCC2(隔离侧)由DC-DC隔离电源模块(B0505S-1W)供电,禁止直接取自STM32的3.3V。

后悔药:曾因省掉隔离电源,用磁珠+电容从3.3V取电,结果某次电机启停时RS485通信全崩,STM32复位。加隔离后连续运行18个月零故障。

从那以后我每次做工业接口,都强制走一遍隔离验证:用万用表二极管档测隔离侧VCC2对GND2是否导通(应为开路),再测A/B对GND2是否导通(应为开路)。这两项通不过,宁可不接线,也不赌运气。希望帮到你。

本文还有配套的精品资源,点击获取

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

毕业设计实战:YOLOv8工地安全帽检测与智能预警系统全流程解析

大学最后一年&#xff0c;最让我头疼的不是论文查重&#xff0c;而是毕设到底做什么。做管理系统太水&#xff0c;做纯算法又怕hold不住。后来我选了一个既不冷门、又有明确落地场景的方向——工地安全监控预警系统&#xff0c;主力模型用YOLOv8。这个题目最大的好处是&#xf…

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

STM32驱动OV2640摄像头:DVP接口、SCCB配置与JPEG图像采集实战

简介&#xff1a;在STM32F407嵌入式开发中&#xff0c;实现OV2640图像传感器的驱动和图像采集&#xff0c;是摄像头类项目常见的开发环节。这份资料面向正在学习STM32摄像头驱动、或需要快速搭建图像采集链路的开发者&#xff0c;重点覆盖SPI接口配置、OV2640初始化参数序列、图…

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

轻量免费工具替换臃肿软件:20MB以内搞定压缩、搜索与看图

如果有一组加起来不到20MB的轻量级免费工具&#xff0c;能替换掉电脑里好几个G的臃肿软件&#xff0c;你会换吗&#xff1f;我换了。不仅换了&#xff0c;还把开机时间从两分多钟压到一分钟以内&#xff0c;最明显的是打开文件、找记录、压缩解压这些日常操作&#xff0c;几乎都…

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

数模竞赛高分秘籍:赛题分类、核心算法与代码库设计实战

简介&#xff1a;面向数模参赛者与培训者的成套学习材料&#xff0c;内容涵盖数学建模基础理论、常用算法、历年真题、论文写作与实战策略&#xff0c;既适合新手系统入门&#xff0c;也适合竞赛团队集训备赛&#xff0c;可帮助快速梳理数模知识框架。压缩包共有61个文件&#…

作者头像 李华
网站建设 2026/10/21 3:10:49

Ubuntu离线环境安装Docker Compose:单文件分发实战手册

碰过内网服务器的人基本都体会过这种局面&#xff1a;装好 Docker Engine 之后&#xff0c;想再装 Compose&#xff0c;结果发现机器完全没外网&#xff0c;apt 拉不了包&#xff0c;curl 也连不上公共仓库&#xff0c;命令敲下去整个人卡住了。这个标题叫“Ubuntu 离线环境 安…

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

高并发内存池FastAllocator设计:从压测瓶颈到三层架构

做内存池这个项目&#xff0c;最开始倒不是什么宏大理想&#xff0c;纯粹是被性能压测报告逼的。那会儿维护的一个多线程服务&#xff0c;高峰期线程数一上去&#xff0c;分配效率就成了明显的短板&#xff0c;耗时占比一度接近百分之二十。后来我花了几个周末把FastAllocator的…

作者头像 李华