现在是2024年10月,之前一直在MS windows 11环境开发,电脑配置还凑合,i7 32G 20核心,编译基本30秒左右,可以接受。但是从2024年10月某天开始,编译变得非常缓慢,原来30秒的编译时间,增加到了9分钟,感觉生命在等待中被消耗,所以开始研究,如何解决。
首先,查了网上所有相关文章,大概总结一下:
1)杀毒软件影响,尤其是Windows Defender。沿着这个思路进行各种配置测试,发现这就是主要问题,但是WIN11的defender,中文系统却是英文界面,感觉还没做好,打开/关闭Windows Defender,好像它都是打开的,后来无奈装了360替代它,360一定要选择性能模式,同时要把工作目录加入排除项,编译速度快了10几倍;
如果是WIN10,在Defender中有个排除项,把以下进程名称加入进去,速度也快了10倍。
Code.exe
conhost.exe
OpenConsole.exe
WindowsTerminal.exe
wsl.exe
wslhost.exe
2)ccache,但是一直都用的,没有变化过;
3)ninja多线程编译,看了看,从来都是ninja -j32,允许32线程,没有变化过;
总之,最大的影响还是杀毒软件,一定要让杀毒软件不要阻挡编译的进程。否则,速度慢死。可能是系统安装补丁后默认把杀毒软件的配置改变了,所以突然变慢了。
问题解决了,但是试一下WSL下搭建开发环境吧,也好对比下编译速度。
乐鑫的软件多数都是开源的,开发环境都是推荐在linux上运行,看到有的文章说,在linux下,编译速度快,那就试试看。
WSL很方便,首选,试试看,如果效果好就WSL,否则就装虚拟机跑linux。
一、WSL的安装
网上很多教程,推荐看微软官方的教程:安装 WSL | Microsoft Learn
安装完成后,有几个有用,用的多的命令:
查看安装的linux及版本:
$ wsl -l -v
停机:
$ wsl --shutdown
将虚拟机迁移到D盘:
$ wsl --shutdown
$ wsl -l -v
$ wsl --export Ubuntu D:\WSL\Ubuntu.tar
$ wsl --unregister Ubuntu
$ wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar
迁移完后,运行wsl,会默认root登录,如果需要修改默认登录的用户名,需要修改/etc/wsl.conf内容,加入:
[user]
default=username
搞定后,到D:\WSL\Ubuntu目录下看看,看到了ext格式的虚拟磁盘文件ext4.vhdx,这就是WSL的Ubuntu的磁盘。
还有一个很重要的问题,就是WSL2与本地竟然默认不能通信,Windows 防火墙要配置一下放行规则,用管理员权限打开一个cmd,输入:
>New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
这样,可以通过设置proxy来使用上位机的VPN,方位github方便些。
$ export ALL_PROXY="http://172.29.32.1:9999"
二、在WSL2虚拟Ubuntu内安装IDF
IDF的安装参照官方linux安装方法,Standard Toolchain Setup for Linux and macOS - ESP32 - — ESP-IDF Programming Guide v5.2.3 documentation
$ mkdir esp
$ mkdir esp/idf
$ cd esp/idf
需要的软件安装:
$ sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
下载idf源码,通过git下载,以后切换版本简单些:
$ git clone --recursive https://github.com/espressif/esp-idf.git
安装交叉编译工具链,注意,这个工具链和IDF当前的版本是关联的,每次切换IDF版本,需要重新运行一遍,而且最好能重新打开一个空的console:
$ cd esp-idf
$ ./install.sh all
因为要访问外网,需要找个网络比较畅通的时间,速度会比较快,记住1)要PROXY;2)要等待。
都下载好了,在IDF的根目录,运行
$ git status
On branch release/v5.3
Your branch is up to date with 'origin/release/v5.3'.
如果切换版本
$ git branch -a
master
* release/v5.3
remotes/origin/HEAD -> origin/master
remotes/origin/audio/stack_on_psram_v3.3
remotes/origin/customer/11kv_v4.0_xiaomi
remotes/origin/customer/maintain_v4.0_xiaomi_tsf_issue
remotes/origin/master
remotes/origin/release/v2.0
remotes/origin/release/v2.1
remotes/origin/release/v3.0
remotes/origin/release/v3.1
remotes/origin/release/v3.2
remotes/origin/release/v3.3
remotes/origin/release/v4.0
remotes/origin/release/v4.1
remotes/origin/release/v4.2
remotes/origin/release/v4.3
remotes/origin/release/v4.4
remotes/origin/release/v5.0
remotes/origin/release/v5.1
remotes/origin/release/v5.2
remotes/origin/release/v5.3
remotes/origin/release/v5.4
$ git checkout master
Switched to branch 'master'
切换完,最好同步一下子模块
$ git submodule update --init --recursive
为了设置IDF的环境变量,有个export.sh脚本要运行,首先要加入可运行属性
$ sudo chmod +x export.sh
$ . ./export.sh
如果一切正常,会显示
Done! You can now compile ESP-IDF projects.
Go to the project directory and run:
idf.py build
为了避免每次使用都要运行export.sh,把这个命令放到.bashrc里去,每次新开console就运行。将下面的命令加到.bashrc最后一行,注意最前面是一个“.”。
. $HOME/esp/idf/esp-idf/export.sh
三、安装VSCode及插件
这步相对简单,到官网下载安装文件,Download Visual Studio Code - Mac, Linux, Windows
安装完,在插件里搜索espressif插件,安装。
VSCode在WSL虚拟机里,可以通过code来调用打开,比如在项目目录,可以
$ code .
来打开Ubuntu内的项目源码,期间,VSCode会自动安装WSL Server插件。
安装完插件后,插件会推荐安装IDF,因为我们已经手动安装过了,可以忽略,关闭相关弹窗即可。
有个需要考虑的问题,就是USB转串口的驱动,WSL2要在Linux内访问Windows的USB设备,推荐使用usbidp软件。
可以直接下载msi安装,usbipd 4.3.0 下载地址
安装后,可以在windown 管理员终端运行以下命令设置
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-3 1a86:7523 USB-SERIAL CH340 (COM3) Shared
1-7 05c8:03c0 HD Camera Not shared
1-10 8087:0aaa 英特尔(R) 无线 Bluetooth(R) Not shared
Persisted:
GUID DEVICE
> usbipd bind -b 1-3
usbipd: info: Device with busid '1-3' was already shared.
> usbipd attach --wsl --busid 1-3
usbipd: info: Using WSL distribution 'Ubuntu-22.04' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 172.29.32.1 to reach the host.
这样,在WSL2的Ubuntu主机内,可以通过
$ dmesg | tail
[11505.334370] vhci_hcd vhci_hcd.0: Device attached
[11505.615844] vhci_hcd: vhci_device speed not set
[11505.686562] usb 1-2: new full-speed USB device number 4 using vhci_hcd
[11505.767954] vhci_hcd: vhci_device speed not set
[11505.839157] usb 1-2: SetAddress Request (4) to port 1
[11505.874157] usb 1-2: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.64
[11505.874161] usb 1-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[11505.874162] usb 1-2: Product: USB Serial
[11505.875547] ch341 1-2:1.0: ch341-uart converter detected
[11505.878487] usb 1-2: ch341-uart converter now attached to ttyUSB1
查看,调试用的串口设备句柄是ttyUSB1
有了ttyUSB1,可以通过插件的GUI案件直接下载固件。
到了这一步,应该就可以实现在VSCode中编辑代码,编译代码,下载代码,通过串口查看log,操作都是通过GUI进行。
唯一一点,就是编译选项无法实现,因为python的路径需要配置,打开VSCode的设置页面,查看idf的设置,有个Python Bin Path路径设置,需要设置成绝对路径。
/home/songyn/.espressif/python_env/idf5.3_py3.10_env/bin/python
在顺便改一下烧写波特率Flash Baud Rate
921600
这样烧写快些
四、速度对比
都搞定了,测试一下,同样的代码,分别放在Windows目录下和WSL的虚拟硬盘内,完全清理后,进行编译,确实WSL内的编译速度快,差距明显。看来,编译速度,现象确实如此。
打开杀毒软件360,非性能模式 / WindowsDefender 默认设置:
Windows编译时间:9分30秒
WSL2编译时间:2分08秒
杀毒软件360性能模式 / WindowsDefender 设置排除项:
Windows编译时间:38秒
WSL2编译时间:32秒
带着使命来到世上的你,给他人提供价值,才有价值