Zephyr烧写调试环境切换到Windows

Creative Commons
本作品采用知识共享署名

本文说明如何在Windows10下搭建烧写和调试Zephyr的环境。

Zephyr编译环境切换到Windows一文中已经说明了在windows下面可以通过WSL安装Ubuntu发行版,然后按照Ubuntu上一样的方式编译出zephyr的image。但是由于WSL下烧写image的原因,Zephyr官方并不推荐使用WSL。本文基于Daplink调试器通过安装pyocd和arm-gcc来解决在Windows下Zephyr的烧写和调试的问题。

pyocd

安装python

pyocd依赖于python环境,因此先安装python,在 https://www.python.org/downloads/windows/ 链接中选择Windows x86-64 executable installer下载并安装

安装libusb

pyocd使用的pyusb会依赖libusb,pyocd官方推荐使用 https://github.com/libusb/libusb/releases/tag/v1.0.21 这个版本,下载后解压缩将MS64\dll\文件夹内的三个文件放到python.exe所在的目录下

安装pyocd

打开PowerShell执行

1
pip install -U pyocd  -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider

安装完后插入Daplink在PowerShell下执行下面命令

1
pyocd list

看到如下信息说明pyocd已经能找到daplink了

1
2
3
  #   Probe                                     Unique ID
--------------------------------------------------------------------------------------------------
0 MIMXRT1050-EVKB [mimxrt1050_hyperflash] 0227000054164e450053600606ee0024b4a1000197969900

烧写

烧写并不是什么大问题,在Zephyr编译环境切换到Windows一文中曾经说过可以通过MSC将image拖拽到虚拟U盘中完成烧写,这里提供pyocd命令烧写方式

1
pyocd flash -t mimxrt1050_quadspi zephyr.elf

调试

在Windows下要调试WSL内编译出来的zephyr.elf主要问题是解决debug信息里面文件路径的问题,在WSL下面编译出来的elf文件debug信息里面文件路径是/mnt开头的,例如我的Zephyr源文件放在Windows的E盘下面,那么WSL下面编译后debug信息中源文件路径就是/mnt/e, 这样在Windows下的gdb加载elf的时候会提示找不到/mnt/e下的源文件,解决方法见后文。

安装gdb

安装在windows下面运行的gdb,在https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads选择最新的 arm gcc toolchain下载,我选择的是gcc-arm-none-eabi-9-2020-q2-update-win32.zip, 下载后解压缩到合适的目录,我是放在

1
E:/westz/gcc-arm-none-eabi-9-2020-q2-update-win32

安装Vscode

  1. https://code.visualstudio.com/download 选择windows版本下载并安装VSCode
  2. 在VSCode中安装下面3个插件
    C/C++
    ARM
    Cortex-debug

配置调试

在VSCode中执行”文件->打开文件夹”选择zephyr和调试所在app的文件路径,例如我的zephyr代码放在E:/westz,就选择该目录
然后点击Debug按键,选择”创建 launch.json文件”,如下图
config
编辑launch.json如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
"configurations": [
{
"name": "Attach Debug",
"cwd": "${workspaceRoot}",
"executable": "./swiftio/src/HalSwiftIOBoard/build/zephyr/zephyr.elf",
"request": "attach",
"type": "cortex-debug",
"servertype": "pyocd",
"targetId":"mimxrt1050_quadspi",
"armToolchainPath": "E:/westz/gcc-arm-none-eabi-9-2020-q2-update-win32/bin/",
"preAttachCommands": ["set substitute-path /mnt/e/westz e:/westz"],
},
{
"name": "Launch Debug",
"cwd": "${workspaceRoot}",
"executable": "./swiftio/src/HalSwiftIOBoard/build/zephyr/zephyr.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "pyocd",
"targetId":"mimxrt1050_quadspi",
"armToolchainPath": "E:/westz/gcc-arm-none-eabi-9-2020-q2-update-win32/bin/",
"preLaunchCommands": ["set substitute-path /mnt/e/westz e:/westz"]
},
]

上面的配置完成后,在调试运行下拉菜单中可以看到两个选项,如下图:
list
分别说明选项的意义:

  • name: 调试配置名,也就是看到会被显示到调试运行下拉菜单的选项
  • cwd: 当前目录
  • executable: 要调试的elf文件
  • request:调试的方法,attach就是直接连上gdbserver进行调试,launch会先烧写elf再调试
  • type: 选择调试器,使用cortex-debug
  • servertype: 调试器类型pyocd,也支持其它的
  • targetId: 在pyocd下target
  • armToolchainPath: 指定使用gdb的路径
  • preAttachCommands/preLaunchCommands: 在调试前gdb执行的命令,这里使用set substitute-path /mnt/e/westz e:/westz就是为了应对elf在WSL下编译出来,通过gdb的set subsitute-path将/mnt/e自动转换成E:,这样VSCode就可以查找到要调试的代码。

编辑完后就可以点击右上角的绿色三角开始调试,调试界面如下,可以断点,单步,查看变量和堆栈等等
debug

VSCode的WSL远程访问

在费劲找出gdb转换路径的命令后突然发现VSCode现在支持远程管理WSL上的内容时,于是调试有了新的做法:通过VSCode远程连接访问WSL内的代码此时代码路径为/mnt/e,这样在windows host上使用pyocd连接daplink开gdbserver,然后在VSCode远程连接WSL通过WSL内gdb连接windows上的gdbserver,这样就可以直接进行调试了

  1. VSCode远程连接WSL,连接后会新开启一个VSCode窗口,可以认为这个VSCode就工作在WSL下面,如下图
    remote
  2. 在新开启的VSCode中安装Native debug插件,配置launch.json如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    "name": "WSL Attach Debug",
    "cwd": "${workspaceRoot}",
    "request": "launch",
    "type": "gdb",
    "target": "./swiftio/src/HalSwiftIOBoard/build/zephyr/zephyr.elf",

    "autorun": [
    "target remote 127.0.0.1:3333",
    "load ./swiftio/src/HalSwiftIOBoard/build/zephyr/zephyr.elf"
    ],
    "gdbpath": "/mnt/e/westz/gcc-arm-none-eabi-9-2020-q2-update/bin/arm-none-eabi-gdb"
    }
  3. 在新开启的VSCode中打开代码所在文件夹/mnt/e/west

  4. 在Windows上的PowerShell中执行下面命令,运行gdbserver

    1
    pyocd gdbserver --persist -t mimxrt1050_quadspi -bh
  5. 调试运行下拉菜单中选择WSL Attach Debug, 然后点击绿色三角符号开始调试运行

后记

到此Zephyr的开发环境已经全部迁移到Windows上,和在Ubuntu上开发没什么大的区别。主要的手段就是基于WSL提供linux环境进行编译,Windows上提供pyocd环境用于烧写和调试,由于在Ubuntu上也是一直使用VSCode作为调试前端,所以一套环境搭下来后只有搭建环境的成本,没有使用转换的成本。

参考

https://github.com/mbedmicro/pyOCD