流程概览
在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 接外设。
- 串口 (Serial Port)
- Windows主机部分
- Windows主机,STM32MP157开发板同一个网络下
- STM32MP157通过USB连接网线转接口-通过以太网连接
- STM32MP157通过路由器连接(较为简单,但是受硬件(路由器)影响)
- Windows主机,STM32MP157开发板同一个网络下
- Ubuntu虚拟机部分
- 获取IP地址
- Ubuntu虚拟机:hostname -I获取IP
- MobaXterm:通过串口终端登录,运行 ifconfig/ ip addr,查看IP
(无路由器情况下)通过硬件网线转usb连接到电脑后的操作
注意: 硬件要一直打开,这样主机才会检测到硬件的以太网
以太网连接
- 初始操作:硬件网线转usb连接到主机上
- 总览思路:创建一个虚拟的内部交换机,令硬件的以太网与虚拟交换机进行桥接构成一个网桥,这样就构建了一个小的局域网用于,板子-主机-虚拟机,进行通信。然后本机共享网络到你构建的网桥用于网桥联网,虚拟机里面一个网卡设置要为桥接模式-桥接位置为你设置的网桥。这样这三个部分就都处于一个局域网,就可以进行通信了。主机的网卡充当的路由器的角色。
windows上的配置
-
创建虚拟交换机,Hyper-V管理器
注:此时网络连接会出现一个新的vEthernet,就是我们创建的虚拟机交换机
- 进行桥接
ctrl选中硬件网络和虚拟交换机右击桥接,之后就会出现现在的网桥
- 交换机配置路由器(一定要选中网桥)
- 防止防火墙阻拦虚拟机发起连接要进行的配置
-
防火墙-高级设置-入站规则-新建规则
-
具体配置
开始默认下一步 程序 保持默认的“所有程序”,点击“下一步”。 协议和端口 点击“协议类型”的下拉菜单,选择“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)
- 虚拟机/设置/添加网络适配器
- 虚拟机/设置/添加网络适配器
-
网络配置
-
网络连接中查看交换机名字
-
虚拟机中=>左上角编辑-虚拟网络编辑器-更改设置-桥接模式-然后如图操作更改自动为交换机
注:桥接位置一定要正确
-
-
(如果ip addr中网卡没有配置ip)然后在虚拟机中执行和电脑硬件一个网段的ip
sudo ip addr add 192.168.137.3/24 dev ens33sudo 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 -
- 注:直接root用户登录报错,应该用debian登录,默认密码temppwd登陆进去以后激活root用户-
-
-
STM32MP157通过USB的串口(不是OTG口)连接网线转接口连接到主机上
- 在Windows上,打开一个串口终端软件(MobaXterm汉化版)。配置正确的 COM 端口号(可以在Windows的设备管理器里查看)和波特率(JZ2440通常是 115200)。
- 具体操作
-
点击左边小人user sessions 或者会话session
-
选择串口serial-串行端口,波特率进行设置
-
- 具体操作
- 给STM32MP157开发板通电。串口终端窗口里开始飞速滚动输出大量的启动信息。这就是Linux内核的启动日志。
- 登录成功后,在串口终端里,手动输入 ifconfig,就可以找到这个网络接口eth0,自动分配的
接下来给板子配置静态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
- 在Windows上,打开一个串口终端软件(MobaXterm汉化版)。配置正确的 COM 端口号(可以在Windows的设备管理器里查看)和波特率(JZ2440通常是 115200)。
方法一、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见往期