在WSL2环境安装IDF,通过VSCode安装espressif插件开发ESP32应用

现在是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软件。

dorssel/usbipd-win: Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2.

可以直接下载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秒

 

 

欢迎转载,本文地址: https://blog.prodrich.com/detail/87/

带着使命来到世上的你,给他人提供价值,才有价值