本文以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 | ============================= test session starts ============================== |
使用
在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