OpenOCD(四):OpenOCD服务器配置

一、服务器配置

此处的命令通常在openocd.cfg文件中找到,用于指定使用的TCP/IP端口以及应如何支持GDB。

1 配置阶段

当OpenOCD服务器进程启动时,它进入配置阶段,这是唯一可以发出某些命令、配置命令的时间。通常,配置命令仅在启动脚本中可用。

在本手册中,配置命令的定义以配置命令的形式呈现,而不是可以交互发出的命令。运行时帮助命令还突出显示配置命令,以及可能随时发出的命令。

这些配置命令包括声明TAP、闪存组、用于JTAG通信的接口和其他基本设置。服务器必须离开配置阶段,然后才能访问或激活TAP。在它离开此阶段后,配置命令可能不再发出。

命令:命令模式【命令名称】
返回命令允许的命令模式:“any”、“config”或“exec”。如果未指定命令,则返回当前命令模式。如果给定了未知命令,则返回“未知”。命令可以是多个令牌。(命令随时有效)

在本文档中,模式被描述为阶段,'config’和’exec’模式对应配置阶段和运行阶段。'any’表示命令可以在任何一个阶段执行。请参见配置阶段,和请参见进入运行阶段。

2 进入运行阶段

OpenOCD在离开配置阶段后要做的第一件事是验证它是否可以与已配置的扫描链(TAP列表)通信。如果它找不到它期望找到的TAP,或者找到不应该存在的TAP,它将发出警告。在这一点上,您应该没有看到任何错误。如果您看到错误,请通过更正用于配置服务器的命令来解决这些错误。常见错误包括使用太快的初始JTAG速度,以及没有为扫描链上的TAP提供正确的IDCODE值。

一旦OpenOCD进入运行阶段,许多命令就可用了。其中许多与您可能声明的调试目标有关。例如,在成功实例化目标之前,mww命令将不可用。如果要使用这些命令,可能需要强制进入运行阶段。

配置命令:init
此命令终止配置阶段,进入运行阶段。当您需要让启动脚本管理任务(如重置目标、编程闪存等)时,这将有所帮助。要在启动时重置CPU,请使用-c命令行开关在配置脚本末尾或OpenOCD命令行末尾添加“init”和“reset”。

如果此命令未出现在任何启动/配置文件中,OpenOCD将在处理所有配置文件和/或命令行选项后为您执行该命令。

注意:此命令通常发生在openocd.cfg文件末尾附近,以强制OpenOCD“初始化”并使目标就绪。例如:如果您的openocd.cfg文件需要读/写目标上的内存,则init必须出现在内存读/写命令之前。这包括nand探测器。

init调用以下OpenOCD内部命令初始化相应的子系统:

  • Config Command: target init
  • Command: transport init
  • Command: dap init
  • Config Command: flash init
  • Config Command: nand init
  • Config Command: pld init
  • Command: tpiu init

最后,init执行TCL列表post_init_commands中指定的所有命令。命令的执行顺序与它们在列表中的顺序相同。如果其中一个命令失败,则会传播错误,OpenOCD也会失败。

lappend post_init_commands {echo "OpenOCD successfully initialized."}
lappend post_init_commands {echo "Have fun with OpenOCD !"}

配置命令:noinit
防止OpenOCD在启动结束时隐式init调用。允许通过telnet或Tcl连接发出配置命令。配置完成后,使用init进入运行阶段。

可覆盖过程:jtag_init
这在服务器启动时调用,以验证它是否可以与已配置的扫描链(TAP列表)通信。

默认实现首先尝试jtag arp_init,它在检查扫描链之前仅使用轻量级JTAG重置。如果失败,它将再次尝试,使用可覆盖过程init_reset中的更硬重置。

实现必须在返回之前验证JTAG扫描链。这可以通过调用jtag arp_init(或jtag arp_init-reset)来完成。

3 TCP/IP端口

OpenOCD服务器接受多种语法的远程命令。每个语法都使用不同的TCP/IP端口,您只能在配置期间(在打开这些端口之前)指定该端口。

出于包括安全在内的原因,您可能希望阻止使用其中一个或多个端口进行远程访问。在这种情况下,只需将相关端口号指定为“禁用”。如果禁用通过TCP/IP的所有访问,则需要使用命令行-管道选项。

配置命令:gdb_port [number]
通常,gdb侦听TCP/IP端口,但GDB也可以通过管道(stdin/out或命名管道)通信。“gdb_port”这个名称被卡住了,因为它可能涵盖了90%以上的正常用例。

没有参数报告GDB端口。“管道”表示侦听stdin输出到stdout,整数是基本端口号,“禁用”禁用gdb服务器。

使用“管道”时,还可以使用log_output将日志输出重定向到文件,以免泛洪stdin/out管道。

任何其他字符串都被解释为要侦听的命名管道。输出管道与输入管道名称相同,但附加了“o”,例如/var/gdb、/var/gdbo。

第一个目标的GDB端口将是基本端口,第二个目标将侦听gdb_port + 1,依此类推。如果在配置阶段未指定,则端口号默认为3333。当number不是数值时,递增它以计算下一个端口号是行不通的。在这种情况下,请使用命令target create或$target_name configuration的选项-gdb-port为每个目标指定适当的编号。请参见选项-gdb-port。

注意:使用“gdb_port管道”时,建议增加gdb中的默认远程超时(使用“set remotetimeout”)。超时不足可能会导致初始化失败,并显示“未知远程qXfer应答:确定”。

配置命令:tcl_port [number]
指定或查询用于简化RPC连接的端口,客户端可使用该连接发出TCL命令并从Tcl引擎获取输出。打算作为机器接口。如果在配置阶段未指定,则端口号默认为6666。当指定为“禁用”时,此服务将不激活。

配置命令:tcl_port [number]
指定或查询要侦听传入telnet连接的端口。此端口用于通过TCL命令与一个人交互。如果在配置阶段未指定,则端口号默认为4444。当指定为“禁用”时,此服务将不激活。

4 GDB配置

如果需要,您可以重新配置一些GDB行为。此处列出的是静态的和全局的。有关配置单个目标的信息,请参阅目标配置。有关配置特定于目标的事件处理,请参见目标事件。

命令:gdb_breakpoint_override [hard|soft|disable]
强制gdb中断命令的断点类型。如果默认的OpenOCD和GDB行为不够,此选项支持GDB GUI,这些GUI不区分硬断点和软断点。如果已为闪存区域设置内存映射,GDB通常使用硬件断点。

配置命令:gdb_flash_program (enable|disable)
设置为启用,以使OpenOCD在接收到vFlash数据包时对闪存进行编程。默认行为为enable。

配置命令:gdb_memory_map (enable|disable)
设置为启用,以使OpenOCD在请求时将内存配置发送到GDB。然后,GDB将知道何时设置硬件断点,并使用GDB加载命令编程闪存。还必须启用gdb_flash_程序启用,才能使闪存编程工作。默认行为为enable。请参见gdb_flash_程序。

配置命令:gdb_memory_map (enable|disable)
指定数据中止是否导致GDB内存读取数据包报告错误。默认行为为禁用;使用启用查看报告的这些错误。

配置命令:gdb_memory_map (enable|disable)
指定GDB寄存器读/写数据包请求的寄存器访问是否报告错误。默认行为为禁用;使用启用查看报告的这些错误。

配置命令:gdb_target_description (enable|disable)
设置为启用,以使OpenOCD通过qXfer将目标描述发送到gdb:功能:读取数据包。默认行为为enable。

命令:gdb_target_description (enable|disable)
将目标描述文件保存到本地文件系统。

文件名为target_name.xml。

5 事件轮询

硬件调试器是异步系统的一部分,在异步系统中,重要事件随时可能发生。OpenOCD服务器需要检测其中的一些事件,以便它可以通过TCL命令行或GDB报告这些事件。

此类事件的示例包括:

  • 其中一个目标可以停止运行…它可能会触发代码断点或数据观察点,或者停止自己。
  • 消息可以通过“调试消息”通道发送…许多目标支持通过JTAG发送的此类消息,供调试人员或工具接收。
  • 断电…某些适配器可以检测到这些事件。
  • 重置未通过JTAG发出…这种重置源可以包括按钮按下或其他系统硬件,有时包括目标本身(可能通过看门狗)。
  • 调试检测有时支持事件触发,如“跟踪缓冲区已满”(因此可以快速清空)或其他信号(与代码行为相关)。
  • 这些事件都不是通过标准JTAG信号发出的。然而,JTAG连接器的大多数约定包括电压电平和系统复位(SRST)信号检测。一些连接器+ 还包括仪表信号,当这些信号是输入时,这可能暗示事件。

一般来说,OpenOCD需要定期检查这些事件,要么通过查看JTAG连接器上的信号状态,要么通过向各种活动目标发送同步的“告诉我您的状态”JTAG请求。有一个命令可以管理和监控该轮询,这通常是在后台完成的。

  • 命令:poll [on|off]
    轮询当前目标的当前状态。(另请参见目标Curstate。)如果该目标处于调试模式,则将打印有关当前状态的体系结构特定信息。可选参数允许启用和禁用后台轮询。

您可以从TCL命令shell中使用此功能,也可以从GDB中使用监视器轮询命令。在使用GDB时,请保持启用后台轮询。

> poll
background polling: on
target state: halted
target halted in ARM state due to debug-request, \
               current mode: Supervisor
cpsr: 0x800000d3 pc: 0x11081bfc
MMU: disabled, D-Cache: disabled, I-Cache: enabled
>

猜你喜欢

转载自blog.csdn.net/weixin_45264425/article/details/132028050
今日推荐