pyocd+daplink使用初步探索

wangbing · 80次点击 · 3周前

先说说daplink可以做的事情:
1 配合Keil开发环境直接在Keil中烧录固件到芯片,目前我司的IC基本都提供过FLM文件,需要的同学可以联系我司获取SDK或者芯片对应的FLM文件。

2 使用pyocd gdb server 配合gdb client做gdb调试

3 使用pyocd rtt 显示RTT日志

4 使用pyocd commander 替换Jlink Commander功能,实现不停机读写RAM,Flash,寄存器的内容,当然有一些操作需要停机操作,使用时会有相应提示。


使用步骤:

首先购买一个支持arm的daplink,淘宝上有若干选择。价格在数元、数十元、数百元不等。可自行购买测试。

然后

电脑环境必须安装python,版本必须python 3.8或者更高。

然后安装pyocd

pip install pyocd

安装完成后,命令行测试如下指令,如果OK则忽略后面的环境变量配置过程。

pyocd --version
0.36.0

如果以上测试指令表示未找到pyocd命令,则需要手动查找pyocd.exe并将pyocd.exe添加到系统PATH。这里不在赘述如何添加系统PATH。不会的同学请自行网络补课解决,添加到系统path后就可以再次运行如上指令了。


1 如何运行gdb server

pyocd gdbserver --target cortex_m --port 2331 --frequency 4m

其中pyocd gdbserver后的参数都是可以忽略的。不选择时--target时,默认为cortex_m 。即所有cortex_m系列的CPU都可以通用(cortex-m4, cortex-m4f, cortex-m33等等都测试过)。--port表示以哪个一个tcp端口打开gdbserver(不选则的话默认3333端口),后续在GDB client的target remote命令中需要这个端口号,--frequency表示选择通信clk速率,4m表示4,000,000hz。--frequency参数也是可以忽略的。

成功运行如下截图
image.png

如上运行到GDB Server started on port 2331 表示gdb server打开成功, 然后可以运行arm-none-eabi-gdb 打开gdb client,使用target remote 127.0.0.1:2331的方式来使用gdb调试了,如何使用gdb调试,请参考GDB调试入门-昂瑞微论坛BBS,其中对于Jlink相关的配置就不用再做了,使用pyocd+daplink来替代就好了。


2 如何运行pyocd commander

pyocd commander --target cortex_m

如果目标芯片就是cortex_m, 其中--target cortex_m可省略。

image.png

可以在“pyocd>”后面输入其内部支持的命令。如 “help” 打开所有帮助,“rw” 以word方式读取内存内容,rw地址后的长度必须是以字节为单位,4对齐。

image.png


3 如何打开RTT Logger

首先被监测芯片固件中必须打开添加rttlog功能,如果以SEGGER提供的SEGGER_RTT为例。

添加SEGGER_RTT.c SEGGER_RTT_printf.c并添加适当的包含路径,在初始化代码添加SEGGER_RTT_Init();

并使用int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...)打印日志。

上位机命令行为:

pyocd rtt --target cortex_m --address 0x20000000 --size 0x14000

如果目标芯片就是cortex_m 那么--target cortex_m就可以省略, --address 和 --size 可以简写为-a和-s,他们的表示RAM起始地址和字节大小。如果直接知道RTT数据结构在目标芯片的地址,可以直接让--address的值为该控制块的地址,否则可以指定RAM的起始地址和大小来自动搜索。

image.png如上匹配成功,自动打印rtt log的情况。

如果要直接指定地址,可以去map文件中查找_SEGGER_RTT结构体变量的内存地址。并指定给--address参数。当然 也可以使用范围+大小的方式来让工具自动搜索_SEGGER_RTT的地址。

如果匹配失败:则提示C Control block not found,此时要检查SEGGER_RTT源码是否添加成功,初始化是否调用,SEGGER_RTT_printf是否调用等等。
image.png


另外 rtt log可以直接保存到文件。参考pyocd  rtt --help打印出来的帮助。

image.png


其他尝试:

1 Ozone不能配合daplink只能使用Jlink,所以使用daplink时Ozone用不了。

2 是否有单独GUI工具可以提供类似JFlash+Jlink的下载程序功能。应该有,但需要提供FLM算法文件。据说算法文件以数据的方式集成到daplink本身的固件才能支持,这里笔者还未探索成功。

3 有没有什么办法让pyocd+daplink+gdb client中可以分析RTOS的每一个任务的任务栈信息,目前还没有比较可靠方案。据说每家OS平台应该会提供相应的py脚本配合gdb来实现多线程分析,需要重新编译gdb client端工具以添加python支持才可以,目前还未探索成功。

被收藏 1  ∙  1 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站