嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > 基于wsl安装esp32-idf开发环境

基于wsl安装esp32-idf开发环境


  • wsl 安装

    • 1. 检查 BIOS 是否开启了虚拟化

    • 2. 启用wsl功能

    • 3.安装 Ubuntu

  • 安装usbipd-win

    • 1. 下载

    • 2. 常用命令

    • 3. 使用demo

  • 安装esp32-idf开发环境

    • 安装vscode-esp-idf插件

    • 安装esp32开发环境

    • 使用

    • Windows和wsl编译环境来回切换

原先是在Windows环境下,在vscode下使用esp-idf插件进行esp32s3的相关开发,在vscode下使用esp-idf插件可以使安装环境更加的简单和清爽。但是唯一的缺点就是在Windows下编译是在时太慢了,特别是修改过menuconfig后,触发全局编译,那真是等着难受。听说在linux下编译比较快,所以想尝试在wsl下进行编译,加快编译环境。

编译时间对比(以下只是粗略对比,仅仅是相对时间有价值,绝对时间和电脑性能相关)。可以看出,wsl下的编译时长有明显提升。

均编译Heelo_Wolddemo((先清除编译,再开始编译)

Windowswsl
04:11.0501:00.59

wsl 安装

WSL(Windows Subsyetem for Linux) 目前已发布两代产品:WSL1 和 WSL2。WSL2 则利用 Windows 的 Hyper-V 功能,通过虚拟化技术直接运行 Linux 虚拟机,更接近原生 Linux 操作系统体验。

注意:以下的wsl均指wsl2

1. 检查 BIOS 是否开启了虚拟化

ctrl+shfit+esc进入任务管理器,查看 BIOS 是否开启虚拟化。

如果显示禁用,则要进入BIOS,在config中将Intel Virtual Technology设置为true

2. 启用wsl功能

打开控制面板 -> 程序和功能 -> 启动或关闭Windows功能 -> Hyper & 适用于linux的Windows系统-> 点击确认,等待安装完成。

3.安装 Ubuntu

直接在Microsoft Store中搜索“ubuntu”

直接选择安装即可。

安装完毕后,点击“启动”,或者按 Win+R,输入 wsl,即可开始按照提示创建用户名(username)和密码(password)了。

之后,可以在 Win+R 中输入 wsl,开始WSL。

安装usbipd-win

wsl无法获取USB设备,必须使用usbipd-win将连接到windows上的usb设备转接到wsl中。

1. 下载

在github中下载最新的usbipd-win^1

直接点击subipd-win.msi安装,安装完毕后根据提示重启电脑

2. 常用命令

  • usbipd attach
  • Description:
     连接一个USB设备到客户端
     
    Usage:
      usbipd attach [options]

    Options:
      -a, --auto-attach                     当设备断开时,重新连接
      -b, --busid <BUSID>                   通过 <BUSID>连接设备
      -i, --hardware-id <VID:PID>            通过<VID>:<PID>连接设备
      -w, --wsl <[DISTRIBUTION]> (REQUIRED)  链接到WSL(可以指定Ubuntu的版本)
      -?, -h, --help                         显示帮助信息
  • usbipd bind
  • Description:
     注册一个设备用于共享

    Usage:
      usbipd bind [options]

    Options:
      -b, --busid <BUSID>          通过 <BUSID>共享设备
      -f, --force                  强制绑定,Windows无法使用
      -i, --hardware-id <VID:PID>  通过 <VID>:<PID>共享设备
      -?, -h, --help               帮助
  • usbipd detach
  • Description:
     断开一个或者多个设备
     
    Usage:
      usbipd detach [options]

    Options:
      -a, --all                    断开所以设备
      -b, --busid <BUSID>          断开 <BUSID>设备
      -i, --hardware-id <VID:PID>  断开 <VID>:<PID>设备
      -?, -h, --help               帮助
  • usbipd list
  • 列出当前连接的 USB 设备

  • usbipd unbind
  • Description:
       取消共享,如果设备已经连接到其他客户端,设备立即和客户端断开

    Usage:
      usbipd unbind [options]

    Options:
      -a, --all                    停止共享所有设备
      -b, --busid <BUSID>          停止<BUSID>设备
      -g, --guid <GUID>            Stop sharing persisted device having <GUID>
      -i, --hardware-id <VID:PID>  停止共享 <VID>:<PID>设备
      -?, -h, --help               帮助

    3. 使用demo

    挂载设备

    常用命令

    # 1.查看帮助,可以列出所有的usbipd命令
    usbipd --help
    # 2. 列出目前所有的USB设备
    usbipd list
    # 3. 共享某个设备
    usbipd bind --busid=<BUSID>
    # 4. 将设备挂载在wsl下
    usbipd attach -wsl --busid=<BUSID>
  • 将esp32连接到电脑;

  • 在Windows下打开终端,通过usbipd list查看目前Windows下挂了哪些设备;

  • PS C:\Users\haijun> usbipd list
    Connected:
    BUSID  VID:PID    DEVICE                                                        STATE
    2-1    17ef:60ff  USB 输入设备                                                  Not shared
    2-3    06cb:00fc  Synaptics UWP WBDI                                            Not shared
    2-4    174f:2454  Integrated Camera, Integrated IR Camera                       Not shared
    2-7    303a:1001  USB 串行设备 (COM8), USB JTAG/serial debug unit               Not shared
    2-10   8087:0026  英特尔(R) 无线 Bluetooth(R)                                   Not shared

    可知本台电脑,挂载5个设备,和esp32连接的USB设备为2-7,其状态为not shared

  • 通过usbipd bind共享USB设备;
  • PS C:\Users\haijun> usbipd bind -b 2-7

    再次查看设备状态

    PS C:\Users\haijun> usbipd list       
    Connected:
    BUSID  VID:PID    DEVICE                                                        STATE
    2-1    17ef:60ff  USB 输入设备                                                  Not shared
    2-3    06cb:00fc  Synaptics UWP WBDI                                            Not shared
    2-4    174f:2454  Integrated Camera, Integrated IR Camera                       Not shared
    2-7    303a:1001  USB 串行设备 (COM8), USB JTAG/serial debug unit               Shared
    2-10   8087:0026  英特尔(R) 无线 Bluetooth(R)                                   Not shared

    Persisted:
    GUID                                  DEVICE
    5fcf8573-b9b6-4cbb-81e1-4cdafbb7982d  Silicon Labs CP210x USB to UART Bridge (COM3)

    设备状态变成shared,说明共享成功。

    注意:一旦设备被共享,重新拔插以后,该设备仍处于共享状态,即对于同一设备,该命令只需要运行一次

  • 通过usbipd attach将设备挂载到wsl下;
  • PS C:\Users\haijun> usbipd attach -w -b 2-7
    usbipd: info: Using WSL distribution 'Ubuntu-20.04' to attach; the device will be available in all WSL 2 distributions.
    usbipd: info: Using IP address 172.19.32.1 to reach the host.

    再次查看设备状态

    PS C:\Users\haijun> usbipd list
    Connected:
    BUSID  VID:PID    DEVICE                                                        STATE
    2-1    17ef:60ff  USB 输入设备                                                  Not shared
    2-3    06cb:00fc  Synaptics UWP WBDI                                            Not shared
    2-4    174f:2454  Integrated Camera, Integrated IR Camera                       Not shared
    2-7    1a86:55d3  USB-Enhanced-SERIAL CH343 (COM4)                              Shared
    2-10   8087:0026  英特尔(R) 无线 Bluetooth(R)                                   Not shared

    Persisted:
    GUID                                  DEVICE
    2abd5a66-7692-48f4-8cc4-f4b90ac84aff  USB 串行设备 (COM8), USB JTAG/serial debug unit
    5fcf8573-b9b6-4cbb-81e1-4cdafbb7982d  Silicon Labs CP210x USB to UART Bridge (COM3)

    设备状态变成Attached,说明挂载成功。

    注意:在使用 usbipd attach -w -b 2-7前必须先开启wsl

  • 验证
  • 在wsl中查看USB设备

    haijun@zs-duhaijun:~$ ls /dev/ttyA*
    /dev/ttyACM0

    可以看出多了个/dev/ttyACM0设备

    卸载设备

    # 卸载指定设备
    PS C:\Users\haijun> usbipd detach -b 2-7
    # or 卸载全部设备
    usbipd detach -a

    再次查看设备状态

    PS C:\Users\haijun> usbipd list
    Connected:
    BUSID  VID:PID    DEVICE                                                        STATE
    2-1    17ef:60ff  USB 输入设备                                                  Not shared
    2-3    06cb:00fc  Synaptics UWP WBDI                                            Not shared
    2-4    174f:2454  Integrated Camera, Integrated IR Camera                       Not shared
    2-7    1a86:55d3  USB-Enhanced-SERIAL CH343 (COM4)                              Shared
    2-10   8087:0026  英特尔(R) 无线 Bluetooth(R)                                   Not shared

    可知设备变成Shared状态,说明卸载成功;

    如果想停止共享使用unbind命令,因为只要卸载了设备,Windows下就可以正常使用了,所以一般不需要使用unbind.

    如果不像每次usbpipd list时都看到以前共享的设备,但是目前又没有连接到电脑上的设备,可以使用unbind

    usbipd unbind -g <GUID> 

    安装esp32-idf开发环境

    安装vscode-esp-idf插件

  • 检查remote-ssh插件是否安装;
  • image-20231208225310680
  • 连接wsl;
  • 连接以后,安装ESP32-idf;
  • 注意:本地安装的插件不会自动安装到wsl中,所以在安装ESP32-idf插件时,将和c、cmake、python相关的插件一起安装到wsl中

    安装esp32开发环境

  • 在wsl环境中安装相关依赖
  • sudo apt-get install git wget flex bison gperf python3-pip python3-venv python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util
  • 在vscode中通过ctr+shift+p打开命令面板 -> 输入figconESP-IDF:Config ESP-IDF extension打开安装esp-idf安装界面。

    • 下载服务器尽量选择Espressif,因为它可以防止因为网络问题,导致下载失败;
    • esp-idf版本尽量选择最新的,即第一个(我原先选择过v5.1,可以正常下载,但是环境总有一点小问题:提示找不到编译链)
    • 后面的安装路径随意;
    • python版本默认就行
  • 等待安装完成
  • 安装时间和网络有关,可以通过终端的输出查看安装信息,有任何的报错均会显示。

    安装完成的界面如下

    如果要使用openocd,请按照提示设置操作。

    使用

    通过hello_worlddemo检验是否可以正常编译和下载

    hello_world.vscode/c_cpp_properties.json中的编译路径显示正常,编译一般就不会出错。

    下载时可能报以下错误:

    A fatal error occurred: Could not open /dev/ttyACM0, the port is busy or doesn't exist.
    ([Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: '
    /dev/ttyACM0'

    原因:通过查询USB设备权限知道,设备没有可执行权限

    haijun@zs-duhaijun:~$ ll /dev/ttyA*
    crw------- 1 root root 166, 0 Dec  9 23:56 /dev/ttyACM0

    解决:添加可执行权限

    haijun@zs-duhaijun:~$ sudo chmod 700 /dev/ttyACM0 
    [sudo] password for haijun: 
    haijun@zs-duhaijun:~$ ll /dev/ttyA*
    crwx------ 1 root root 166, 0 Dec 10 11:09 /dev/ttyACM0

    Windows和wsl编译环境来回切换

    如果从wsl切换到Windows,esp-idf的插件会报以下乱码

    Command failed: dfu-util --version
    'dfu-util' �����ڲ����ⲿ���Ҳ���ǿ����еij���
    �����������
    Error checking dfu-util version
    Error: Command failed: dfu-util --version
    'dfu-util' �����ڲ����ⲿ���Ҳ���ǿ����еij���
    �����������

    这应该是sp-idf的插件配置使用的是wsl那一套,导致环境不兼容。需要手动选择选择下环境

  • 通过ctr+shift+p打开命令面板 -> 输入figconESP-IDF:Config ESP-IDF extension打开安装esp-idf安装界面。

  • 点击USE EXISTING SETUP

  • 选择在Windows下的安装路径

  • 等待它重新安装虚拟环境