一、About Jim-Tcl
OpenOCD使用一个名为Jim-Tcl的小型“Tcl解释器”。 这种编程语言提供了一个简单且可扩展的 命令解释器。
本指南中提供的所有命令都是对 Jim-TCL 的扩展。 您可以将它们用作简单的命令,而无需学习 关于Tcl的很多事情。 或者,您可以使用它们编写 Tcl 程序。
您可以在其网站 http://jim.tcl.tk 上了解有关Jim的更多信息。 有一个活跃且响应迅速的社区,请加入邮件列表 如果您有任何问题。Jim-Tcl 维护者也潜伏在 OpenOCD邮件列表。
Jim vs. Tcl Jim-Tcl是众所周知的Tcl
语言的精简版本, 可以在这里找到:http://www.tcl.tk。吉姆-Tcl 还有很长的路要走 更少的功能。Jim-Tcl是几十个.C 文件和 .H 文件和 实现基本的 Tcl 命令集。相比之下:Tcl 8.6 是一个 4.2 MB .zip包含 1540 个文件的文件。
缺少的功能
我们的做法是:添加/克隆真正的Tcl功能,如果/何时 需要。我们欢迎 Jim-Tcl 的改进,而不是膨胀。也在那里 是大量可选的 Jim-Tcl 功能,这些功能不是 在 OpenOCD 中启用。
脚本
OpenOCD 配置脚本是 Jim-Tcl 脚本。OpenOCD的 今天的命令解释器是(较新的)的混合体 Jim-Tcl 命令和(较旧的)原始命令解释器。
在 OpenOCD telnet 命令行(或通过 GDB 监视器命令)的命令
可以键入 Tcl for() 循环,设置变量等。 已实现本指南中记录的一些命令 作为 Tcl 脚本,从服务器内部的文件。startup.tcl
历史笔记
Jim-Tcl在2008年春天被引入OpenOCD。2010年秋季, 在OpenOCD 0.5发布之前,OpenOCD改用Jim-Tcl。 作为 Git 子模块,大大简化了 Jim-Tcl 的升级 从 Jim-TCL 中的新功能和错误修复中受益。
需要Tcl速成吗?
边学边用
二、运行
正确安装 OpenOCD 会设置您的操作系统以授予其访问权限 到调试适配器。在 Linux 上,这通常涉及安装文件 所以OpenOCD有权限。示例规则文件 适用于许多常见适配器的适配器在目录中随 OpenOCD 一起提供。微软视窗需求 每个外围设备的复杂且令人困惑的驱动程序配置。此类问题 对于每个操作系统都是唯一的,本用户指南中未详细说明。/etc/udev/rules.d,contrib
然后稍后您将调用 OpenOCD 服务器,其中包含各种选项 告诉它每个调试会话应该如何工作。 该选项显示:–help
bash$ openocd --help --help | -h display this help --version | -v display OpenOCD version --file | -f use configuration file <name> --search | -s dir to search for config files and scripts --debug | -d set debug level to 3 | -d<n> set debug level to <level> --log_output | -l redirect log output to file <name> --command | -c run <command>
如果您不提供任何或选项, OpenOCD 尝试读取配置文件 。 指定一个或多个不同的 配置文件,使用选项。例如:-f-copenocd.cfg-f
openocd -f config1.cfg -f config2.cfg -f config3.cfg
那么这些配置的文件的来源如下:
- the current directory,
- any search dir specified on the command line using the option, -s
- any search dir specified using the command, add_script_search_dir
- a directory in the environment variable (if set), OPENOCD_SCRIPTS
- %APPDATA%/OpenOCD (only on Windows),
- $HOME/Library/Preferences/org.openocd (only on Darwin),
- X D G C O N F I G H O M E / o p e n o c d ( XDG_CONFIG_HOME/openocd (XDGCONFIGHOME/openocd(XDG_CONFIG_HOME defaults to ), $HOME/.config
- $HOME/.openocd,
- the site wide script library and $pkgdatadir/site
- the OpenOCD-supplied script library . $pkgdatadir/scripts
将使用第一个找到的具有匹配文件名的文件。
注意:不要尝试使用 包括“#”字符。该字符开始 Tcl 注释。
简单设置,无需定制
在最好的情况下,您可以使用其中一个脚本中的两个脚本 库,连接你的JTAG适配器,然后启动服务器…和 您的JTAG设置将“开箱即用”。总是尝试 首先重用这些脚本,但假设您需要更多 自定义即使这有效。请参阅 OpenOCD 项目设置。
’
如果您找到适用于 JTAG 适配器和电路板的脚本,或者 目标,你也许能够连接你的JTAG适配器,然后启动 具有以下其中一项的服务器:
openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg openocd -f interface/ftdi/ADAPTER.cfg -f board/MYBOARD.cfg
您可能还需要配置存在哪些复位信号, 使用或类似的东西。 如果一切顺利,您将看到类似-c ‘reset_config trst_and_srst’
Open On-Chip Debugger 0.4.0 (2010-01-14-15:06) For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : JTAG tap: lm3s.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
看到“tap/device found”消息,并且没有警告,这意味 JTAG通信正在工作。这是一个关键的里程碑,但是 您可能需要更多特定于项目的设置。
OpenOCD在启动时做了什么
-c command-f file.cfgopenocd.cfg
OpenOCD启动,处理在命令行上提供的配置命令,或者,如果没有给出 或 选项,则在 中。 请参阅配置阶段。
在配置阶段结束时,它验证JTAG扫描使用这些命令定义的链;
您的配置应该确保此操作始终成功。 通常,OpenOCD然后开始作为服务器运行。 或者,可以使用命令终止配置尽早暂存,执行工作(例如更新一些闪存), 然后在不充当服务器的情况下关闭。
一旦OpenOCD开始作为服务器运行,它就会等待来自 客户端(Telnet、GDB、RPC)并处理通过 发出的命令 那些渠道。
如果遇到问题,可以通过以下方式启用内部调试消息 选项。-d
也可以使用命令行开关将 Jim-Tcl 命令与配置脚本交错。-c
启用调试输出(在报告问题或处理 OpenOCD 时) 本身),使用命令行开关。这将设置为“3”,输出最多的信息, 包括调试消息。默认设置为“2”,仅输出 信息性消息、警告和错误。您也可以更改此设置 在 Telnet 或 GDB 会话中使用进行设置(请参阅debug_level)。-ddebug_leveldebug_level
您可以使用开关将服务器的所有输出重定向到文件。-l
注意!OpenOCD将启动GDB和telnet服务器,即使它不能与目标建立连接。一般来说,有可能 JTAG控制器在目标设置之前无响应。
例如 GDB 初始化脚本中的 GDB 监视器命令正确执行。
三、OpenOCD项目设置
要在开发项目中使用 OpenOCD,您需要做的不仅仅是 只需将JTAG适配器硬件(加密狗)连接到开发板 并启动 OpenOCD 服务器。 您还需要配置您的 OpenOCD 服务器,以便它知道 关于您的适配器和主板,并帮助您的工作。 您可能还想将OpenOCD连接到GDB,可能 使用 Eclipse 或其他一些 GUI。
1 连接JTAG适配器
今天最常见的情况是一侧带有JTAG电缆的加密狗 (例如带有 10 针或 20 针 IDC 连接器的带状电缆) 另一边是一根 USB 电缆。 一些加密狗使用以太网代替 USB; 较旧的可能使用PC并行端口,甚至串行端口。
从关闭目标板的电源开始, 并且没有连接到您的JTAG适配器。 如果您特别偏执,请拔掉电路板的电源。 正确设置地面信号很重要, 除非您使用的是 JTAG 适配器,它提供 目标板和 调试主机。
确保它是正确类型的JTAG连接器。如果您的加密狗有一个 20 针 ARM 连接器,您需要某种 适配器将其连接到 使用 14 针或 10 针连接器的电路板 …或转至 20 针 不使用 ARM 引脚排列的连接器。
同样,请确保电压电平兼容。 并非所有JTAG适配器都具有工作所需的电平转换器 带 1.2 伏板。
确保电缆方向正确,否则您可能会 损坏您的主板。在大多数情况下,只有两种可能 连接电缆的方法。 将JTAG电缆从适配器连接到电路板。 确保它已牢固连接。
在最好的情况下,连接器以物理方式固定防止您插入错误。 这通常是使用主板公连接器上的插槽完成的 外壳,必须与JTAG电缆母连接器上的键匹配。 如果没有住房,那么您必须仔细查看 确保电缆上的引脚 1 连接到板上的引脚 1。 带状电缆通常都是灰色的,除了一根电线 边缘,为红色。红线是引脚 1。
有时加密狗提供的电缆一端是“章鱼” 颜色编码的单线连接器,而不是连接器块。 当从一个JTAG引脚排列转换为另一个JTAG引脚排列时,这些都很棒, 但设置起来很繁琐。 将这些与连接器引脚图一起使用,以帮助您匹配 适配器向右侧主板引脚发出信号。
连接JTAG电缆后,连接适配器的另一端。 USB、并行或串行端口连接器将连接到主机 你正在使用运行OpenOCD。 对于以太网,请参阅文档和网络管理员。
对于基于USB的JTAG适配器,此时您可以进行简单的健全性检查: 主机操作系统是否看到 JTAG 适配器?如果您正在运行 Linux,请尝试该命令。如果该主机是 MS-Windows主机,您需要在OpenOCD工作之前安装驱动程序。lsusb
如果需要,请连接适配器的电源。此步骤主要适用于非 USB 适配器, 但有时 USB 适配器需要额外的电源。
打开目标板的电源。除非你只是让魔法烟雾逸出, 您现在可以设置 OpenOCD 服务器了 所以你可以使用JTAG来使用该板。
使用 OpenOCD 服务器与 OpenOCD 服务器交谈 远程登录(在许多系统上)或 GDB。 请参阅 GDB 和 OpenOCD。telnet localhost 4444
2 项目目录
您可以通过多种方式配置 OpenOCD 并启动它。
组织它们的简单方法涉及保持 使用给定板工作的单个目录。 当您从该目录启动 OpenOCD 时, 它首先在那里搜索配置文件、脚本、 通过半托管访问的文件, 以及您上传到目标板的代码。 它也是写入文件的自然位置, 例如您从开发板下载的日志文件和数据。
3 配置基础
有两种配置OpenOCD的基本方法,以及 您可以通过多种方式混合它们。 将区别视为启动服务器的方式:
- 命令行上的许多或选项-f file-c command
- 没有选项,但当前目录中有一个名为openocd.cfg
下面是设置的示例文件 使用基于 Signalyzer FT2232 的 JTAG 适配器进行通信 带有 Atmel AT91SAM7X256 微控制器的主板:openocd.cfg
source [find interface/ftdi/signalyzer.cfg] # GDB can also flash my flash! gdb_memory_map enable gdb_flash_program enable source [find target/sam7x256.cfg]
以下是该配置的等效命令行:
openocd -f interface/ftdi/signalyzer.cfg \ -c "gdb_memory_map enable" \ -c "gdb_flash_program enable" \ -f target/sam7x256.cfg
您可以将如此长的命令行包装在 shell 脚本中,每个都支持不同的开发任务。 可以使用特定的固件版本重新刷新主板。 另一个可能会设置特定的调试或运行时环境。
重要:在撰写本文时(2009 年 <> 月),命令行方法具有它如何处理变量的问题。 例如,在之后或执行在脚本中相同,变量将没有值 可以在以后的脚本中进行测试。-c "set VAR value"VAR
在这里,我们将专注于更简单的解决方案:一个用户配置 文件,包括基本配置和任何 TCL 过程 以简化您的工作。
4 用户配置文件
用户配置文件将项目的所有部分联系在一起在一个地方。 以下情况之一将最符合您的情况:
理想情况下,几乎所有内容都来自配置文件由其他人提供。 例如,OpenOCD 分发一个目录 (可能在 Linux 上)。
Board和tool 供应商也可以提供这些,个人也可以 用户网站;命令行选项让你说 在哪里可以找到这些文件。(请参阅跑步。 上面的 AT91SAM7X256 示例以这种方式工作。scripts/usr/share/openocd/scripts-s
三种主要类型的非用户配置文件都有其 目录中自己的子目录:scripts
- interface– 每个不同的调试适配器一个;
- board – 每个不同的板一个
- target – 集成CPU和其他JTAG TAPS的芯片
最好的情况:只包含两个文件,它们处理其他所有内容。
第一个是接口配置文件。
第二个是特定于电路板的,它设置JTAG TAPS和 他们的 GDB 目标(通过推迟到某个文件),声明所有闪存,除了 满足您的最后期限:target.cfg
- source [find interface/olimex-jtag-tiny.cfg]
- source [find board/csb337.cfg]
具有单个微控制器的电路板通常不需要更多目标配置文件,如 AT91SAM7X256 示例中所示。 那是因为没有外部存储器(闪存,DDR RAM),并且电路板差异由应用程序代码封装。
也许你还不知道你的电路板在JTAG看来是什么样子的。 一旦你知道要使用的文件,你可以 需要 OpenOCD 的帮助来发现板上的内容。 找到JTAG TAP,只需搜索合适的 目标和板 配置文件或者自下而上地写你自己的。 请参阅自动探测。interface.cfg
您通常可以重用一些标准配置文件,但是需要写一些新的,可能是一个文件。 您将使用本用户指南后面描述的命令, 并在下一章中使用指南。board.cfg
例如,可能有JTAG适配器的配置文件 和目标芯片,但您需要一个新的特定于板的配置文件允许访问您的特定闪存芯片。 或者您可能需要编写另一个目标芯片配置文件用于围绕 Cortex-M3 内核构建的新芯片。
注意:当您编写新的配置文件时,请提交它们将包含在下一个 OpenOCD 版本中。 例如,文件将有助于该主板的下一个用户,以及将帮助支持使用该芯片的任何主板的用户。board/newboard.cfgtarget/newcpu.cfg
您可能需要编写一些 C 代码。 它可能像支持新的FT2232或parport一样简单基于适配器;涉及更多,如NAND或NOR闪存 控制器驱动程序;或支持等大工作 新的芯片架构。
尽可能重用现有的配置文件。 首先查看该区域,然后. 您可能会发现电路板配置是一个很好的示例。scripts/boardsscripts/targets
编写配置文件时,分隔可重用部分 (该接口、芯片或电路板的每个用户都需要的东西) 从特定于您的环境和调试方法。
例如,调用该命令将干扰调试早期启动代码,执行一些相同的操作事件处理程序所做的。gdb-attachreset initreset-init
同样,该命令(或其同级和)可以节省时间在某些调试会话中,但也不要让每个人都使用它。 将这些类型的调试辅助工具保留在用户配置文件中,以及消息传递和跟踪设置。 (请参阅软件调试消息和跟踪。arm9 vector_catchxscale vector_catchcortex_m vector_catch
您可能需要覆盖某些默认值。 例如,您可能需要移动、收缩或备份目标的 工作区域,如果您的应用需要大量的SRAM。
TCP/IP 端口配置是另一个例子 是特定于环境的,并且应仅出现在 用户配置文件。请参阅 TCP/IP 端口。
5 项目特定实用程序
一些特定于项目的实用程序例行公事可能会加快您的工作速度。 编写它们,并将它们保存在项目的用户配置文件中。
例如,如果您正在板子上调试bootloader,很高兴能够调试“之后 加载到 RAM“部分与挑剔的早期分开设置DDR RAM控制器和时钟的代码。 像这样的脚本,或者更能感知 GDB 的兄弟, 可能有助于:
proc ramboot { } { # Reset, running the target's "reset-init" scripts # to initialize clocks and the DDR RAM controller. # Leave the CPU halted. reset init # Load CONFIG_SKIP_LOWLEVEL_INIT version into DDR RAM. load_image u-boot.bin 0x20000000 # Start running. resume 0x20000000 }
然后,一旦该代码正常工作,您将需要制作它 从NOR闪存启动;不同的实用程序会有所帮助。 或者,一些开发人员使用 GDB 写入闪存。 (如果您正在使用闪存,则可以使用类似的脚本 基于微控制器应用程序,而不是引导加载程序。
proc newboot { } { # Reset, leaving the CPU halted. The "reset-init" event # proc gives faster access to the CPU and to NOR flash; # "reset halt" would be slower. reset init # Write standard version of U-Boot into the first two # sectors of NOR flash ... the standard version should # do the same lowlevel init as "reset-init". flash protect 0 0 1 off flash erase_sector 0 0 1 flash write_bank 0 u-boot.bin 0x0 flash protect 0 0 1 on # Reboot from scratch using that new boot loader. reset run }
引导时可能需要更复杂的实用程序过程 来自nand。 这通常涉及一个额外的引导加载程序阶段,从片上SRAM运行以执行DDR RAM设置,以便可以加载 主引导加载程序代码(不适合该 SRAM)。
其他帮助程序脚本可用于编写生产系统映像,涉及的不仅仅是一个三阶段引导加载程序。
6 目标软件变更
有时您可能想对软件进行一些小的更改 您正在开发,以帮助使JTAG调试更好地工作。 例如,在 C 或汇编语言代码中,您可能会 在代码周围使用(或其相反) 处理以下问题:#ifdef JTAG_DEBUG
看门狗定时器… 看门狗定时器通常用于在以下情况下自动复位系统 某些应用程序任务不会定期重置计时器。(的 假设如果任务无法运行,系统已锁定。 当JTAG调试器停止系统时,该任务将无法运行 并重置计时器…可能导致在 您的调试会话。
禁用此类看门狗很少是一个好主意,因为它们的使用 需要像固件的所有其他部分一样进行调试。 然而,这可能是你唯一的选择。
而是寻找特定于芯片的方法来阻止看门狗计数 当系统处于调试停止状态时。设置起来可能最简单 调试器启动脚本中的非计数模式。但是,您可以 需要一种不同的方法,例如,当电机可以是物理的 固件在调试暂停状态下保持非活动状态而损坏。那可能 涉及禁用“非计数”模式的固件模式类型 在开始时,然后在结束时重新启用;监视器重置可能会触发 并使调试会话复杂化,但硬件(或人员)将是 保护。1
ARM半托管…当与提供许多的特殊运行时库链接时 工具链2, 目标代码可以使用调试主机上的 I/O 工具。那个图书馆 提供一小组由 OpenOCD 处理的系统调用。 它可以让调试器提供您的系统控制台和文件系统, 帮助早期调试或提供功能更强大的环境 用于有时复杂的任务,例如将系统固件安装到 NAND 或 SPI 闪存。
ARM 等待中断… 许多ARM芯片使用内核时钟同步JTAG时钟。 低功耗状态会阻止内核时钟,从而阻止JTAG访问。 任务环境中的空闲循环通常会进入这些低功耗状态 通过指令(或其等效协处理器,在 ARMv7 之前)。WFI
您可能希望在源代码中禁用该指令, 或以其他方式阻止使用该状态, 以确保您可以随时获得JTAG访问权限。3 例如,OpenOCD 命令可能不会 否则适用于空闲处理器。halt
复位后延迟… 并非所有芯片都很好地支持调试器访问 重置后立即;许多LPC2xxx芯片在这里都存在问题。 同样,重新配置引脚的应用程序用于 启动时的JTAG访问也将阻止调试器访问。
要使用这样的电路板,请在重置后的第一件事,在“真正的”启动活动之前启用一个短暂的延迟循环。 例如,一秒的延迟通常绰绰有余 连接JTAG调试器的时间,以便 可以调试早期代码执行 或者可以更换固件。
调试通信通道 (DCC)… 一些处理器包括通过JTAG发送消息的机制。 许多 ARM 内核支持这些,其他供应商的一些内核也支持这些内核。 (OpenOCD也许能够在内部使用这个DCC,加速一些 写入内存等操作。
应用程序可能需要传递各种调试消息 通过JTAG,通过链接到OpenOCD提供的小型代码库并使用那里的实用程序发送 各种消息。 请参阅软件调试消息和跟踪。
7 目标硬件设置
芯片供应商通常提供软件开发板高度可配置,因此可以支持所有选项 产品主板可能需要的。确保任何跳线或开关与您的系统配置相匹配 与之合作。
常见问题包括:
- JTAG设置… 电路板可能支持多个JTAG配置。 示例包括控制上拉与下拉的跳线 在 nTRST 和/或 nSRST 信号上,以及连接器的选择 (例如,基板上的两个针座中的哪一个, 或来自母卡的一个)。 对于某些德州仪器板,您可能需要跳线 EMU0 和 EMU1 信号(OpenOCD 目前无法控制)。
- 启动模式… 复杂芯片通常支持多种开机模式,可控 通过外部跳线。确保此设置正确。 例如,恩智浦的许多 i.MX 板需要跳线 到“ATX模式”以开始使用片上ROM启动,当 使用存储在NAND闪存芯片中的第二阶段引导加载程序代码。
这种显式配置很常见,不限于 从 NAND 引导。您可能还需要将跳线设置为 使用从 MMC/SD 卡加载的代码开始启动;外部 SPI闪存;以太网、UART 或 USB 链路;无闪存;壹南德 闪光;一些外部主机;或其他各种来源。 - 内存寻址… 支持多种启动模式的主板也可能具有跳线 以配置内存寻址。一块板,例如跳线 外部芯片选择 0(用于引导)以解决任一问题 大型SRAM(必须通过JTAG预加载),NOR闪存, 或 NAND 闪存。当它被跳线以解决NAND闪存时,那 还必须告知主板从片上ROM开始启动。
您的文件可能还需要告诉此跳线 配置,以便它可以知道是否声明NOR闪存 使用或改为声明 NAND 闪存;同样,在哪个探头中执行 它的处理程序。board.cfgflash banknand devicereset-init
一个密切相关的问题是总线宽度。跳线可能需要 区分闪存的 8 位或 16 位总线访问 用于开始启动。
- 外设接入… 开发板通常提供对每个外设的访问 在芯片上,有时以多种模式(例如通过提供 多个音频编解码器芯片)。 这与软件交互 引脚多路复用的配置,例如 给定的引脚可以路由到 MMC/SD 控制器 或 GPIO 控制器。它还经常与 配置跳线。一个跳线可用于路由 向 MMC/SD 卡插槽或扩展总线( 可能反过来影响启动);其他人可能会控制哪个 使用音频或视频编解码器。
另外,您当然应该有事件处理程序 设置硬件以匹配该跳线配置。 这尤其包括用于时钟的任何振荡器或PLL。 CPU 以及访问外部所需的任何内存控制器 内存和外围设备。没有这样的处理程序,你就不会 能够在不工作目标固件的情况下访问这些资源 可以进行该设置…当你很尴尬时,这可能会很尴尬 尝试调试该目标固件。即使有 ROM 引导加载程序处理一些问题,它很少提供完整的 访问所有特定于主板的功能。reset-init