OpenOCD很强大,根据RIOT官方的说法:
OpenOCD (the open on-chip debugger) is an open source tool for debugging and flashing microcontrollers. In RIOT we try to use this tool for as many platforms as possible to reduce the overhead of having to keep track of many different (and sometimes proprietary) tools.
由于集成了UrJTAG库, OpenOCD可以支持多种多样的jtag仿真器.启动后,自身会开设两个端口TCP端口3333和4444,分别用于提供gdb调试服务和telnet登录会话服务,openOCD在整个调试系统里面起到了上通下达的作用,是整个调试系统的枢纽所在,它的作用有点类似于GDBServer.但是个人认为比gdbserver强大的地方在于,OpenOCD可以提供裸机调试功能, GDBServer作为一枚可执行应用程序,其本身必须在Linux操作系统环境里面运行,所以GDBServer一般用在调试Linux下的用户态程序,对于裸机程序无能为例力.
今天,我们就以OpenOCD烧录ST32F411RE-nucleo为例,简单记录一下zephyr内核的烧写过程, 用到了4444 telnet端口.
step1:首先,开启OpenOCD服务,打开一个终端,执行:
/home/user/zephyr-1.5.0/sysroots/i686-pokysdk-linux/usr/bin/openocd -s /home/user/zephyr-1.5.0/sysroots/i686-pokysdk-linux/usr/share/openocd/scripts -f ./boards/arm/nucleo_f411re/support/openocd.cfg命令, 如果没有问题,输出会是这个样子:
此时, OpenOCD服务已经Ready, 3333和4444端口已经打开,正在等待客户端的连接.
step2:登录OpenOCD telnet服务,执行烧录命令
打开另外一个终端, 执行telnet localhost 4444命令, 登录成功能,得到下面的输出:
光标处于闪烁状态,等待用户输入命令.
step3:输入命令序列烧录.
对于不同的平台, OpenOCD支持的烧录命令是不同的,在zephyr SDK中,./boards/arm/ 目录下,每个平台目录都以环境变量的方式export自身相关的烧录命令,例如 对于本试验平台,相关定义在./soards/arm/nucleo_f411re/Makefile.board 中:
这里只定义了verify和烧录两个命令,其余命令和其他开发板相同, 烧录指令在zephyer sdk下有定义, 在./zephyr/scripts/support/openocd.sh文件,
-c “命令” 格式可以把命令列表集合起来,一次性传入给openOCD来执行,这样写在脚本里面可以不用telnet到4444端口,也可以在telnet 终端中逐条输入完成烧录,我们这里使用后面这种方式.
指令逐条执行完毕之后,输入shutdown, 就会退出telnet会话,然后查看串口, 程序已经开始运行.