5. openocd项目设置

  要在开发项目中使用OpenOCD,您需要做的不仅仅是将JTAG适配器硬件(加密狗)连接到开发板并启动OpenOCD服务器。您还需要配置您的OpenOCD服务器,以便它知道您的适配器和主板,并帮助您的工作。您可能还想将OpenOCD连接到GDB,可能使用Eclipse或其他GUI。

1.连接Jtag适配器

  目前最常见的情况是一个加密狗,一边是JTAG电缆(例如带有10针或20针IDC连接器的带状电缆),另一边是USB电缆。一些加密狗可能使用以太网而不是USB;旧的可能使用PC并行端口,甚至是串行端口。

  1. 首先关闭目标板的电源,并且没有连接到JTAG适配器。如果你想特别保险一点,那么拔掉电源。正确设置接地信号非常重要,除非您使用的是目标板和调试主机之间提供电流隔离的JTAG适配器。
  2. 确保它是正确的JTAG连接器。如果你的加密狗有一个20针的ARM连接器,你需要某种适配器将其连接到使用14针或10针连接器的板上…或者不使用ARM引脚的20针的连接器。同样,确保电压水平是兼容的。并非所有JTAG适配器都具有1.2伏板所需的电平转换器。
  3. 请确保电缆的方向正确,否则可能会损坏电路板。在大多数情况下,只有两种可能的方式连接电缆。将JTAG电缆从适配器连接到电路板。确保连接牢固。在最好的情况下,连接器上有防呆键,以防止您插入错误。这通常是使用板的公连接器外壳上的插槽完成的,该插槽必须与JTAG电缆的母连接器上的键相匹配。如果没有外壳,那么您必须仔细查看并确保电缆上的引脚1挂钩到板上的引脚1。带状电缆通常都是灰色的,除了在一个边缘的电线,这是红色的。红色的电线是引脚1。
    有时加密狗提供的电缆一端是彩色编码单线连接器的“章鱼”,而不是连接器块。在将一个JTAG引脚转换为另一个引脚时,这是很好的,但是设置起来很繁琐。使用这些与连接器引脚图,以帮助您匹配适配器信号到正确的板引脚。
  4. 连接JTAG电缆后,连接适配器的另一端。USB、并行或串行端口连接器将连接到用于运行OpenOCD的主机。对于以太网,请查阅文档和您的网络管理员。
    对于基于usb的JTAG适配器,此时可以进行简单的完整性检查:主机操作系统是否看到了JTAG适配器?如果您正在运行Linux,请尝试使用lsusb命令。如果该主机是MS-Windows主机,则需要在此之前安装驱动程序。
  5. 如果需要,连接适配器的电源。此步骤主要适用于非USB适配器,但有时USB适配器也需要额外的电源。
  6. 启动目标板。除非您只是让神奇的烟雾消失,否则您现在已经准备好设置OpenOCD服务器,以便您可以使用JTAG与该板一起工作。

使用telnet(在许多系统上是telnet localhost 4444)或者GDB与OpenOCD服务器对话。参见第20章[GDB和OpenOCD],第183页。

2. 项目目录

有许多方法可以配置OpenOCD并启动它。
一个简单方法是使用一个给定的板子将所有涉及的文件打包进一个单一的目录。当您从该目录启动OpenOCD时,它首先在那里搜索配置文件、脚本、通过半托管访问的文件以及您上传到目标板的代码。它也是编写文件的自然位置,例如从电路板下载的日志文件和数据。

3. 基础配置

配置OpenOCD有两种基本方法,还有多种方法可以混合使用。
区别就在于如何启动服务器:

  • 命令行上使用多个 -f filename-c command 选项
  • 没有选项,只使用当前目录下名字为 openocd.cfg 的用户配置文件

下面是一个示例openocd.cfg文件,用于使用基于Signalyzer ft2232的JTAG适配器与带有Atmel AT91SAM7X256微控制器的板进行设置:

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年10月)时,命令行方法在如何处理变量方面存在问题。例如,在-c "set VAR value"之后,或者在脚本中做同样的事情,变量VAR将没有可以在以后的脚本中测试的值。

这里,我们将重点讨论更简单的解决方案:一个用户配置文件,包括基本配置和任何TCL过程,以简化您的工作

4. 用户配置文件

用户配置文件将项目的所有部分捆绑在一起。以下其中一种最符合你的情况:

  • 理想情况下,几乎所有内容都来自其他人提供的配置文件。例如,OpenOCD分发一个脚本目录(可能在 /usr/share/openocd/scripts (Linux) )。电路板和工具供应商也可以提供这些,个人用户网站也可以。-s 命令行选项允许您指定在何处查找这些文件(参见第4章[运行openocd])。 上面的AT91SAM7X256示例就是这样工作的。
    三种主要类型的非用户配置文件在scripts目录中都有自己的子目录:

    1. interface —— 一个不同的调试适配器的目录
    2. board —— 一个不同板子的目录
    3. target —— 集成了cpu和其他JTAG处理器的芯片

    最好的情况是:只包含两个文件,它们处理其他所有内容。第一个是接口配置文件。第二个是特定于主板的,它设置JTAG tap和它们的GDB目标(通过推迟一些target.cfg文件),声明所有闪存,除了满足您的截止日期外,您什么也不用做:

source [find interface/olimex-jtag-tiny.cfg]
source [find board/csb337.cfg]

带有单个微控制器的电路板通常不需要超过目标配置文件,如AT91SAM7X256示例。这是因为它没有外部存储器(FLASH、 DDR RAM),并且板的差异被应用程序代码封装。

  • 也许您还不知道您的板子是什么样子的JTAG。一旦您知道要使用interface.cfg文件,您可能需要OpenOCD的帮助来发现电路板上的内容。一旦找到JTAG tap,您就可以搜索适当的目标和板配置文件…或者你自己写,从下往上写。参见[Autoprobing]

  • 您可以经常重用一些标准配置文件,但需要编写一些新的配置文件,可能是board.cfg文件。您将使用本用户指南后面描述的命令指南,并在下一章中使用这些指南。

    例如,可能有针对JTAG适配器和目标芯片的配置文件,但是您需要一个新的特定于主板的配置文件来访问特定的闪存芯片。
    或者您可能需要为围绕Cortex-M3内核构建的新芯片编写另一个目标芯片配置文件。

注意:当您编写新的配置文件时,请提交它们以便在下一个OpenOCD版本中包含它们。例如,board/newboard.cfg文件将帮助该板的下一个用户,target/newcpu.cfg文件将帮助支持使用该芯片的任何板的用户。

  • 您可能需要编写一些C代码。它可能像支持新的FT2232或基于parport的适配器一样简单;也有稍微复杂一点,比如NAND或NOR闪存控制器驱动程序;或者像支持一个新的芯片架构这样的大工作

尽可能重用现有的配置文件。首先查看scripts/boards区域,然后查看scripts/targets。您可能会找到一个很好的电路板配置示例。
在编写配置文件时,将可重用部分(该接口、芯片或主板的每个用户都需要的东西)与特定于您的环境和调试方法的部分分开。

  • 例如,调用reset init命令的gdb-attach事件处理程序将干扰调试早期引导代码,后者执行与reset-init事件处理程序相同的一些操作。
  • 同样,arm9 vector_catch 命令(或它的兄弟 xscale vector_catchcortex_m vector_catch)可以在某些调试会话期间节省时间,但也不要让每个人都使用它。在用户配置文件中保留这些调试辅助工具,以及消息传递和跟踪设置。(参见[软件调试消息和[追踪],第174页。)
  • 您可能需要重写一些默认值。例如,如果您的应用程序需要大量SRAM,您可能需要移动、收缩或备份目标的工作区域
  • TCP/IP端口配置是另一个特定于环境的例子,应该只出现在用户配置文件中。参见[TCP/IP端口],第33页。

5. Project-Specific Utilities(特定项目的实用工具)

一些特定于项目的实用程序例程可能会加快您的工作速度。编写它们,并将它们保存在项目的用户配置文件中。
例如,如果您正在使引导加载程序在板上工作,那么能够将“加载到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编写flash。(如果您正在使用基于flash的微控制器应用程序而不是引导加载程序,则可以使用类似的脚本。)

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. Target Software Changes(目标软件修改)

有时,您可能希望对正在开发的软件进行一些小的更改,以帮助更好地进行JTAG调试。例如,在C或汇编语言代码中,您可以使用#ifdef JTAG_DEBUG(或相反)来处理代码处理问题,如:

  • Watchdog Timers……看门狗计时器通常用于在某些应用程序任务没有定期重置计时器时自动重置系统。(假设如果任务无法运行,则系统已锁定。)当JTAG调试器停止系统时,该任务将无法运行并重置计时器…可能在调试过程中导致重置
    禁用这样的看门狗不是一个好主意,因为使用它们需要调试,就像固件的所有其他部分一样。然而,这可能是你唯一的选择。相反,寻找特定于芯片的方法,以在系统处于调试停止状态时停止看门狗计数。 在调试器启动脚本中设置非计数模式可能是最简单的。然而,您可能需要一种不同的方法,例如,当固件在调试半状态下保持不活动时,电机可能会受到物理损坏。这可能涉及一种固件模式,其中“非计数”模式在开始时被禁用,然后在结束时重新启用;看门狗复位可能会触发并使调试会话复杂化,但硬件(或人员)将受到保护。
  • ARM Semihosting……当与许多工具链提供的特殊运行时库链接时,您的目标代码可以使用调试主机上的I/O设施。该库提供了一组由OpenOCD处理的系统调用。它可以让调试器提供系统控制台和文件系统,帮助进行早期调试,或者为有时复杂的任务(如将系统固件安装到NAND或SPI闪存上)提供更强大的环境。
  • ARM Wait-For-Interrupt……许多ARM芯片使用核心时钟同步JTAG时钟。低功耗状态会停止内核时钟,从而阻止JTAG访问。任务环境中的空闲循环通常通过WFI指令进入那些低功耗状态(或其等效的协处理器,在ARMv7之前)。
    您可能希望在源代码中禁用该指令,或者以其他方式阻止使用该状态,以确保您可以随时获得JTAG访问例如,OpenOCD halt命令可能无法用于空闲的处理器。
  • Delay after reset……并不是所有的芯片都能很好地支持复位后的调试器访问;许多LPC2xxx芯片在这里有问题。类似地,在启动时重新配置用于JTAG访问的引脚的应用程序也将阻止调试器访问。
    要使用这样的电路板,在复位后的第一件事就是启用短延迟环路在“真正的”启动之前。例如,一秒钟的延迟对于JTAG调试器来说通常已经足够了,这样就可以调试早期的代码执行或替换固件。
  • Debug Communications Channel (DCC)……一些处理器包括通过JTAG发送消息的机制。许多ARM内核支持这些,其他厂商的一些内核也支持。(OpenOCD可能能够在内部使用这个DCC,加速一些操作,比如向内存写入)。您的应用程序可能希望通过JTAG传递各种调试消息,方法是链接OpenOCD提供的一个小代码库,并使用那里的实用程序发送各种消息。参见[软件调试消息和跟踪],第174页。

7. Target Hardware Setup(目标板硬件启动)

芯片供应商通常提供高度可配置的软件开发板,这样他们就可以支持产品板可能需要的所有选项。确保任何跳线或开关与您正在使用的系统配置相匹配。
常见问题包括:

  • JTAG setup :单板可能支持多个JTAG配置。示例包括控制nTRST和/或nSRST信号上的上拉和下拉的跳线,以及连接器的选择(例如,基板上两个头中的哪一个,或子卡上的一个)。对于一些德州仪器板,您可能需要跳接EMU0和EMU1信号(OpenOCD目前无法控制)。
  • Boot Modes:复杂的芯片通常使用外部跳线帽支持多种boot模式,确保配置是正确的。比如许多NXP的i.MX板子在使用存储在NAND Flash中的第二阶段bootloader程序时,通常会跳转到“ATX mode”使用片上ROM启动。
    这种显式配置很常见,并不局限于从NAND引导。你可能还需要设置跳线,以便使用从MMC/SD卡加载的代码启动;外置SPI Flash; 以太网、UART或USB链路;Nor Flash;OneNAND Flash;一些外部主机;或者其他各种来源。
  • Memory Addressing:支持多种启动模式的电路板也可能有跳线来配置内存寻址。例如,一个板,跳线外部芯片选择0(用于引导)来寻址大型SRAM(必须通过JTAG预加载),NOR闪存或NAND闪存。当它被跳转到地址NAND闪存时,该板也必须被告知开始从片上ROM启动。
    您的board.cfg文件也可能需要被告知此跳线配置,以便它可以知道是否使用闪存库声明NOR闪存或使用NAND设备声明NAND闪存;同样,在其reset-init处理程序中执行哪个handler。
    一个密切相关的问题是总线宽度。跳线器可能需要区分用于启动的闪存的8位或16位总线访问。
  • Peripheral Access:…开发板通常提供对芯片上每个外设的访问,有时是多种模式(例如通过提供多个音频编解码器芯片)。这与引脚多路复用的软件配置相互作用,例如,给定的引脚可以路由到MMC/SD控制器或GPIO控制器。它还经常与配置跳线交互。一个跳线可用于将信号路由到MMC/SD卡插槽或扩展总线(这可能反过来影响启动);其他可能控制使用的音频或视频编解码器。

另外,您当然应该有reset-init事件处理程序来设置硬件以匹配跳线配置。这尤其包括用于为CPU时钟的振荡器或锁相环,以及访问外部存储器和外设所需的任何存储器控制器。如果没有这样的处理程序,你将无法访问这些资源,没有工作的目标固件可以做那个设置…当您试图调试目标固件时,这可能会很尴尬。即使有一个ROM引导加载程序可以处理一些问题,它也很少提供对所有主板特定功能的完全访问。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值