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 devicesource [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/