Zephyr增加调试器参数

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

本文以pyocd为例简要说明如何为Zephyr调用的调试器增加参数。

Zephyr使用python脚本集成了各种调试器,并以统一的west命令呈现给用户,让使用者无需关心其细节。对于不同板子会使用不同的调试器,Zephyr也允许用户在board.cmake中通过board_runner_args为其添加参数,目前zephyr对不同的调试器并未支援所有的参数,同时调试器也在不停的更新,这会在一些我们想使用特定参数的情况下无法使用,本文以pyocd为例说明如何让zephyr支持pyocd的其它参数。

起因

pyocd默认并不支持一些flash的烧写算法,我们可以通过用户脚本的方式将flash算法放入pyocd,参考https://github.com/mbedmicro/pyOCD/blob/master/docs/user_scripts.md 。这需要用到–script 参数,但zephyr并不支持这个args,于是就打算修改让其支援。

修改

Zephyr调试器配置及原理一文中介绍了Zephyr中pyocd调试器最后是在zephyr/scripts/west_commands/runners/pyocd.py实现的,我们对pyocd参数的添加也就是在这个文件中

参数支援修改

最开始的修改只是为了添加–script这个参数,在修改后提交时,zephyr的member提了如下建议

Instead, can you take a look at the –tool-opt options that the jlink and nrfjprog runners support, and do something similar for pyocd?

也就是说,–tool-opt会被当初一个附件的参数选项,你要带入的参数都可以通过这个选项加入,这样一劳永逸。修改的主要内容如下:

do_add_parser方法解析参数–tool-opt,将其带入的字符串保存起来。
PyOcdBinaryRunner类初始化时增加tool_opt入参(也就是–tool-opt带入的字符串),并将其放入成员tool_opt_args。
create方法增加对tool_opt_args的处理。
flash方法传入参数tool_opt_args(west flash的时候就会将–tool-opt的内容送到pyocd)。
debug_debugserver方法传入参数tool_opt_args(west debug/debugserver的时候就会将–tool-opt的内容送到pyocd)。

具体可以参考https://github.com/zephyrproject-rtos/zephyr/pull/20957/files

单元测试添加

修改

当增加–tool-opt后,需要同步修改scripts/west_commands/tests/test_pyocd.py, 该文件是对pyocd.py进行测试的,主要目的是测试添加的选项带入输入的参数和输出到pyocd的脚本参数是否符合预期。修改是增加测试项TEST_TOOL_OPT和增加预期的测试结果,详细见https://github.com/zephyrproject-rtos/zephyr/pull/20957/files

测试方法

在scripts/west_commands下执行下面命令

1
PYTHONPATH=$PWD py.test

看到全部pass即可,如果不对检查测试脚本或是pyocd.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
============================= test session starts ==============================
platform linux -- Python 3.6.9, pytest-5.2.2, py-1.8.0, pluggy-0.13.0
rootdir: /home/frank/work/project/westz/zephyr/scripts/west_commands
collected 127 items

tests/test_blackmagicprobe.py ...... [ 4%]
tests/test_bossac.py ... [ 7%]
tests/test_build.py ............... [ 18%]
tests/test_dediprog.py ...... [ 23%]
tests/test_dfu_util.py ............ [ 33%]
tests/test_imports.py . [ 33%]
tests/test_nrfjprog.py ................................................. [ 72%]
............... [ 84%]
tests/test_pyocd.py ............ [ 93%]
tests/test_stm32flash.py ........ [100%]

=============================== warnings summary ===============================
/home/frank/.local/lib/python3.6/site-packages/pykwalify/core.py:7
/home/frank/.local/lib/python3.6/site-packages/pykwalify/core.py:7: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
import imp

-- Docs: https://docs.pytest.org/en/latest/warnings.html
======================= 127 passed, 1 warnings in 1.95s ========================

使用

在board.cmake中添加需要的参数,例如我想pyocd -script=${ZEPHYR_BASE}/boards/arm/mm_swiftio/burner/pyocd_user.py, 那么在board.cmake中添加下面这句即可

1
board_runner_args(pyocd "--tool-opt=--script=${ZEPHYR_BASE}/boards/arm/mm_swiftio/burner/pyocd_user.py")

后记

进行该修改本意是想在不修改pyocd的情况下,让zephyr可以加载FLM到pyocd,用于烧写目前pyocd不支援的flash,不过看起来目前zephyr不接收flm文件,如果有用得上的,可以参考这个PR https://github.com/zephyrproject-rtos/zephyr/pull/22536