Linux应用开发-4-STM32MP157开发板上使用VS Code 进行远程开发

190 阅读8分钟

流程概览

在Windows的VS Code里写代码,代码实时保存在Ubuntu虚拟机上,在VS Code的终端里一键编译,编译好的程序瞬间出现在STM32MP157上,然后可以直接在板子上运行和单步调试。

  • Windows 主机
    • 运行VS Code,提供高效的图形化编码和项目管理界面。
    • Visual Studio Code, Remote - SSH 插件。
  • Ubuntu 虚拟机
    • 提供一个稳定、高速的Linux环境,用于存放源代码、执行交叉编译、运行版本控制工具(Git)。
    • STM32MP157的交叉编译工具链 (arm-linux-gcc等)、make、Git、NFS服务或者ssh scp操作。
  • STM32MP157 开发板
    • 真实的目标硬件,用于运行和调试我们编译好的程序,验证硬件交互。
    • 运行自制Linux系统的硬件、SSH服务(Dropbear)、GDB调试(gdbserver)。

具体流程

环境准备与网络配置(概览)

  • 网络拓扑
    • Ubuntu虚拟机部分
      • Ubuntu虚拟机的网络适配器要设置两个网卡,一个为桥接模式用于硬件通信,一个为NAT模式用于访问互联网。
    • 板子部分
      • 串口 (Serial Port)
        • 可以查看启动日志,进行各种配置查看,通过MobaXterm
      • USB Device/OTG 口
        • 首次烧录必须通过此口;系统启动后仍可 Device 传文件、Host 接外设。
    • Windows主机部分
      • Windows主机,STM32MP157开发板同一个网络下
        • STM32MP157通过USB连接网线转接口-通过以太网连接
        • STM32MP157通过路由器连接(较为简单,但是受硬件(路由器)影响)
  • 获取IP地址
    • Ubuntu虚拟机:hostname -I获取IP
    • MobaXterm:通过串口终端登录,运行 ifconfig/ ip addr,查看IP

(无路由器情况下)通过硬件网线转usb连接到电脑后的操作

注意: 硬件要一直打开,这样主机才会检测到硬件的以太网

以太网连接
  • 初始操作:硬件网线转usb连接到主机上
  • 总览思路:创建一个虚拟的内部交换机,令硬件的以太网与虚拟交换机进行桥接构成一个网桥,这样就构建了一个小的局域网用于,板子-主机-虚拟机,进行通信。然后本机共享网络到你构建的网桥用于网桥联网,虚拟机里面一个网卡设置要为桥接模式-桥接位置为你设置的网桥。这样这三个部分就都处于一个局域网,就可以进行通信了。主机的网卡充当的路由器的角色。
windows上的配置
  • 创建虚拟交换机,Hyper-V管理器 image.png

    image.png

注:此时网络连接会出现一个新的vEthernet,就是我们创建的虚拟机交换机

  • 进行桥接 ctrl选中硬件网络和虚拟交换机右击桥接,之后就会出现现在的网桥 e5ff46a3-d236-461f-b516-dfa5fd10a9fd.png
  • 交换机配置路由器(一定要选中网桥)

5d698512-43b3-4245-8e86-98d07366c642.png

  • 防止防火墙阻拦虚拟机发起连接要进行的配置
    • 防火墙-高级设置-入站规则-新建规则 image.png

    • 具体配置

      开始默认下一步
      
      程序
      保持默认的“所有程序”,点击“下一步”。
      
      协议和端口
      点击“协议类型”的下拉菜单,选择“ICMPv4”。
      点击“下一步”。
      
      作用域 
      在“此规则应用于哪些远程 IP 地址?”部分,点选“下列 IP 地址”。
      点击下方的“添加...”按钮。
      在弹出的窗口中,输入可以代表您整个开发网络的 IP 地址范围或子网。最简单的方式是输入:
      192.168.5.0/24
      点击“确定”,然后点击“下一步”。
      192.168.5.0/24 告诉防火墙,这条规则只对来自 192.168.5.1 到 192.168.5.254 这个范围的所有设备的请求生效。
      
      操作
      保持默认的“允许连接”,点击“下一步”。
      
      配置文件
      保持默认的“域”、“专用”、“公用”三个都勾选,点击“下一步”。
      
      名称
      给规则起一个好记的名字,比如 Allow ICMP from DevNet。
      点击“完成”。
      
虚拟机上配置
  • 为了保持虚拟机和板子在同一个网段,又要通过网关下载东西,因此要配置双网卡(桥接模式+NAT)

    • 虚拟机/设置/添加网络适配器 image.png
  • 网络配置

    • 网络连接中查看交换机名字

      0ed603ec-e3d4-4c70-bbec-2727065f708a.png

    • 虚拟机中=>左上角编辑-虚拟网络编辑器-更改设置-桥接模式-然后如图操作更改自动为交换机 ff14bda5-7685-4714-b10c-6702b26923e0.png 注:桥接位置一定要正确

  • (如果ip addr中网卡没有配置ip)然后在虚拟机中执行和电脑硬件一个网段的ipsudo ip addr add 192.168.137.3/24 dev ens33 sudo ip link set ens33 up

  • 手动激活并配置网络

    # 激活桥接硬件连接网卡,以及进行上网的nat网卡
    ip link set ens33 up
    ip link set ens36 up
    dhclient ens33
    dhclient ens36
    
    
  • (为了长期通信要配置静态ip)编辑netplan-要保证ls /etc/netplan下面只有以下编辑的一个文件,其他的删除避免冲突,也可编辑启动和脚本sudo nano /etc/rc.local

    sudo nano 01-netcfg.yaml
    
    
    #以下是写入文件的内容
    network:
      version: 2
      renderer: networkd   # 使用 systemd-networkd 管理网卡
      ethernets:
        ens33:             # 桥接网卡,用于与开发板通信
          dhcp4: no
          addresses:
            - 192.168.137.3/24
          nameservers:
            addresses: [8.8.8.8, 114.114.114.114]
    
        ens36:             # NAT 网卡,用于上网
          dhcp4: yes
    #启动服务
    sudo systemctl enable systemd-networkd
    sudo systemctl start systemd-networkd
    #生成-应用服务
    sudo netplan generate
    sudo netplan apply
    
  • 检查

    • Windows的terminal中Ping说明连接成功,然后进行ssh root@ip即可

    • 上述完成后进入vscode连接的虚拟机中进行ping证明连接成功

    • MobaXterm上可以及进行ssh连接硬件,可以看到相应文件

      • 注:直接root用户登录报错,应该用debian登录,默认密码temppwd登陆进去以后激活root用户-sudo su -
  • STM32MP157通过USB的串口(不是OTG口)连接网线转接口连接到主机上

    • 在Windows上,打开一个串口终端软件(MobaXterm汉化版)。配置正确的 COM 端口号(可以在Windows的设备管理器里查看)和波特率(JZ2440通常是 115200)。
      • 具体操作
        • 点击左边小人user sessions 或者会话session

        • 选择串口serial-串行端口,波特率进行设置

          image.png

    • 给STM32MP157开发板通电。串口终端窗口里开始飞速滚动输出大量的启动信息。这就是Linux内核的启动日志。
    • 登录成功后,在串口终端里,手动输入 ifconfig,就可以找到这个网络接口eth0,自动分配的 image.png 接下来给板子配置静态ip(不必须)
      sudo nano /etc/network/interfaces
      #为了固定挂载连接,配置一个静态ip
      auto eth0
      iface eth0 inet static
          address 192.168.137.220
          netmask 255.255.255.0
          gateway 192.168.137.1
          dns-nameserver 114.114.114.114
      
方法一、NFS文件共享(高频调试)
  • 最初准备,虚拟机,Windows,硬件-都在同一个网段里面(见上述详细操作)

  • 在虚拟机配置NFS服务端

    • 安装NFS服务

      sudo apt update
      sudo apt install nfs-kernel-server
      
    • 创建共享目录:将是所有ARM项目的“根目录”

      mkdir -p ~/arm_projects
      
    • 配置共享: 编辑 /etc/exports 文件

      echo "/home/wang/arm_projects *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
      
    • 使配置生效

      sudo exportfs -a
      sudo systemctl restart nfs-kernel-server
      
  • 在STM32MP157开发板上配置NFS客户端

    • 挂载共享目录

      #没有则需要安装NFS
      apt update
      apt install nfs-common      
      # 创建一个挂载点
      mkdir -p /mnt/host_projects
      # 执行挂载命令
      mount -t nfs -o nolock <虚拟机IP>:/home/wang/arm_projects /mnt/host_projects
      
    • 验证: 运行 ls /mnt/host_projects,您应该能看到Ubuntu虚拟机上 ~/arm_projects 文件夹的内容。现在,您在虚拟机里对这个文件夹做的任何修改,都会立刻反映在STM32MP157的 /mnt/host_projects 目录里

    • 永久挂载:

      #编辑客户端虚拟机的 `/etc/fstab` 文件
      sudo nano /etc/fstab
      #在最后一行加入
      <虚拟机IP>:/home/wang/arm_projects  /mnt/host_projects  nfs  nolock,_netdev  0  0
      #手动测试,挂载地方会马上同步文件
      sudo mount -a
      
      
方法二、scp传输,占用资源更低
  • SSH的scp版本
    • VS Code通过 Remote - SSH 连接到虚拟机

      • 通过 File -> Open Folder...,打开刚刚创建的NFS共享目录 ~/arm_projects。
    • 编写与交叉编译

      #您的项目目录并执行 make
      cd ~/arm_projects/gpio_test
      make
      
    • 部署

      scp ./gpio_app root@192.168.10.2:/root/
      #scp: 复制命令。
      #./gpio_app: 要复制的源文件(位于当前目录)。
      #root@192.168.5.9: 目标设备,用户是 root,IP地址是 192.168.5.9
      #:/root/: 目标路径,表示要复制到开发板的 /root 目录下。
      #冒号 : 用于分隔目标主机和路径。
      
    • 运行与测试

      #登录到开发板
      ssh root@192.168.5.9
      #首先,赋予它执行权限
      chmod +x /root/gpio_app
      #运行程序
      /root/gpio_app
      

集成远程GDB调试

  • 在JZ2440终端中启动gdbserver
  • 在 /mnt/host_projects/gpio_led/ 目录下 gdbserver :2345 ./gpio_app
  • 在VS Code中配置 launch.json,一般创建路径/home/wang/.vscode见往期