共计 1990 个字符,预计需要花费 5 分钟才能阅读完成。
1. 前言
当咱们遇到问题的时候,能够加打印信息追踪流程,但更无效的形式是:调试。如果你应用的是 keil,能够借助 stlink 或者 jlink 进行调试。如果你是应用的 gnu 工具链,硬件反对 jlink
,那么咱们能够借助gdb+jlink
的形式进行调试;如果咱们硬件反对的是 stlink
,则能够借助gdb+openocd+stlink
进行调试。
2. 应用 GDB 调试 OneOS
GDB,全称 GNU Project debugger,是 UNIX 及 UNIX-like 下的弱小调试工具,同时也反对对嵌入式零碎进行调试。对嵌入式零碎进行调试时,是以近程调试的形式进行的,调试环境的软硬件连贯如下:
在上图的构造中,反对嵌入式芯片调试的 GDB Server 有多款,这里次要介绍 OpenOCD 和 J -Link GDB Server。
- J-Link GDB Server 由 SEGGER 公司推出,仅反对应用 Jlink 作为调试适配器进行调试
- OpenOCD,全称 Open On-Chip Debugger,是一款针对嵌入式芯片调试的开源软件,反对市面上大多数的调试适配器,例如 stlink、DAPlink、Jlink 等。OpenOCD 反对 GDB 查看 RTOS 线程,OneOS 已对其进行了适配。应用 OpenOCD 作为 GDB Server,能够查看 OneOS 所有线程的调用栈和栈上的长期变量,对于调试,能提供更多的信息
3.gdb 联合 stlink 调试
这里以万耦开发板 stm32f401-vet-oneos 为例演示调试过程,因为 OpenOCD 配合 Jlink 应用时,须要将 Jlink 的驱动切换成通用 usb 驱动(OpenOCD 不反对 Jlink 的原生驱动,如果须要,能够应用 zadig 这款开源软件将 Jlink 驱动切换成 WinUSB 或 libusb),为了不便起见,在应用 OpenOCD 调试时,调试适配器抉择 stlink。
3.1 获取 OpenOCD
下载预编译的 Windows 版本请点击 OpenOCD 下载。
3.2 目录构造
OpenOCD 编译后的二进制文件目录构造如下:
3.2 增加环境变量
OPENOCD_BIN_PATH="D:\Program\openocd\bin"
OPENOCD_SCRIPT_PATH="D:\Program\openocd\share\openocd\scripts"
3.3 配置文件 oneos.cfg
在 stm32f401-vet-oneos 工程目录下创立配置文件 oneos.cfg,文件内容如下:
# this need match your debug adaptor and target device
source [find interface/stlink-v2.cfg]
source [find target/stm32f4x.cfg]
# config openocd support OneOS
$_TARGETNAME configure -rtos oneos
# halt target after gdb attached
$_TARGETNAME configure -event gdb-attach {halt}
3.4 启动 openOCD
在 OneOS-Lite 代码根目录运行 OneOS-Cube,执行如下命令:
%OPENOCD_BIN_PATH%\openocd.exe -c "gdb_port 5000" -s %OPENOCD_SCRIPT_PATH% -f .\projects\stm32f401-vet-oneos\oneos.cfg
运行胜利后的界面如下,此时 OpenOCD 已配置实现:
4 启动 gdb 调试
在 OneOS-Lite 代码根目录下运行 OneOS-Cube,执行如下命令运行 GDB
arm-none-eabi-gdb.exe .\out\stm32f401-vet-oneos\oneos.elf
在 GDB 命令行交互界面中执行如下命令连贯 GDB Server,其中:5000 是 GDB Server 的 tcp 端口号,对应下面 OpenOCD 运行时指定的 gdb_port(如果应用 J -Link GDB Server,则端口抉择下面显示的 2331)
target remote localhost:5000
连贯胜利后,GDB 命令行交互界面如下
5. 开始调试 OneOS-Lite
- 查看以后线程调用栈和长期变量
- 查看所有正在运行的线程(J-Link GDB Server 不反对此命令)
- 切换到其余线程并查看调用栈与长期变量(J-Link GDB Server 不反对此命令)
- 打断点
b entry
- 从新加载
load
更多的 GDB 用法,请查看官网文档。
6. 关注 && 分割
gitee:https://gitee.com/cmcc-oneos/OneOS-Lite
docs:https://oneos-lite.com/
摘自:https://os.iot.10086.cn/oneos-doc-2.0/components/debug/OpenOCD/