【我踩过的那些坑】U盘做D:,Temp建在U盘,编译程序卡顿
U 盘作为 D 盘、Temp 目录建在 U 盘导致编译卡顿」是嵌入式开发中典型的存储 IO 瓶颈问题,尤其 ESP-IDF 编译涉及大量小文件读写、临时文件生成,U 盘的性能短板会被无限放大。
二、分步骤解决方案(优先级从高到低)方案 1:紧急修复 —— 将 Temp 目录移回系统盘(最快见效)无需改动工程路径,仅调整临时目录位置,就能立竿见影提升编译速度:
打开系统环境变量设置:
右键「此电脑」→「属性」→「高级系统设置」→「环境变量」;
修改用户级 Temp/TMP 变量:
在「用户变量」中找到 TEMP 和 TMP,双击编辑;
将变量值从 U 盘路径(如 D:\Temp)改为系统盘路径,推荐:
C:\Users\Administrator\AppData\Local\Temp(默认路径,或自定义 C:\Temp);
点击「确定」保存,重启终端 / VSCode(环境变量生效需要重启);
验证生效:
在 PowerShell 中执行 echo $env:TEMP,输出应为 C 盘路径,说明修改成功。
方案 2:根治 —— 将 ESP-IDF 工程移到系统盘(机械盘也比 U 盘快)即使系统盘是普通机械硬盘(HDD),随机读写速度也比 U 盘快 10 倍以上,步骤:
迁移工程目录:
复制 D:\Espressif\frameworks\esp-idf-v5.4.2 到系统盘,推荐路径:
C:\Espressif\frameworks\esp-idf-v5.4.2(避免中文 / 空格);
重新激活 ESP-IDF 环境:
打开新终端,进入新的 ESP-IDF 根目录,重新执行激活脚本:
powershell- cd C:\Espressif\frameworks\esp-idf-v5.4.2.\export.ps1
切换到新工程目录编译:
powershellcd C:\Espressif\frameworks\esp-idf-v5.4.2\examples\get-started\hello_worldidf.py fullclean build -j4 # 验证编译速度
方案 3:进阶优化 —— 给系统盘加缓存 / 升级存储(可选)如果系统盘是机械硬盘,编译仍有轻微卡顿,可进一步优化:
启用 Windows 磁盘缓存:
右键系统盘(C 盘)→「属性」→「硬件」→ 选中磁盘 →「属性」→「策略」→ 勾选「启用写入缓存」;
临时关闭 Windows Defender 实时扫描:
编译时 Defender 会扫描大量临时文件,导致 IO 卡顿,可临时关闭(编译完成后重启):
长期最优解:升级系统盘为 SSD:
SSD 的随机读写速度是 U 盘的 100 倍以上,ESP-IDF 编译耗时可从「分钟级」降到「10 秒级」(二次编译),是嵌入式开发的终极存储方案。
三、避坑补充:U 盘作为 D 盘的其他注意事项如果必须保留 U 盘作为 D 盘(如存储大文件),需注意:
禁用 U 盘的索引和碎片整理:
右键 U 盘(D 盘)→「属性」→ 取消勾选「允许此驱动器上的文件具有内容索引」→「工具」→「优化」→ 选择 U 盘 →「分析」→ 若碎片率高则「优化」(但 U 盘碎片整理效果有限);
ESP-IDF 仅将成品固件输出到 U 盘:
工程编译在系统盘,编译完成后用命令将固件复制到 U 盘,避免编译过程读写 U 盘:
powershell# 编译完成后复制固件到U盘copy .\build\hello-world.bin D:\ESP32_Firmware\避免 4 线程编译(U 盘场景):
若暂时无法迁移目录,将线程数降到 1~2,减少 IO 并行冲突:
powershellidf.py build -j1 # 单线程反而比多线程快
四、效果验证修改后编译 ESP32-S3 的 hello_world 工程,对比优化前后的耗时:
优化前(U 盘 Temp+U 盘工程):首次编译 10 + 分钟,二次编译 3 + 分钟;
优化后(系统盘 Temp + 系统盘工程):首次编译 1~2 分钟,二次编译 10~20 秒;
若升级 SSD:首次编译 40 秒,二次编译 5~8 秒。
总结嵌入式编译的核心瓶颈是「存储 IO」而非 CPU,U 盘的随机读写性能完全无法满足 ESP-IDF 的编译需求。
优先将 Temp 目录和工程目录移到系统盘(机械盘即可),是最低成本、最高效的解决方案;长期来看,升级 SSD 能彻底解决编译卡顿问题,也是嵌入式 / 编程开发的基础硬件投入。