使用XMOS目标系统
术语
下面定义了一些专业术语:
- 主机计算机(或主机):在其上安装了 XTC 工具的台式机或笔记本电脑。
- 主机工具(或工具):随 XTC 工具一同提供,可从命令行界面启动的程序。
- 目标系统(或目标):装载有 XMOS 设备的一个或多个印刷电路板。
- 目标程序:利用 XTC 工具构建,在目标系统上运行的程序。
引言
为了方便与 XMOS 目标系统的交互,我们提供了一整套主机计算机工具。目标系统通常是一个装载了一个或多个 XMOS 设备的单板。目标程序(即由 xcc 工具生成的带有 .xe 后缀的文件),可通过 xrun 工具下载至目标 RAM 并执行。使用 xgdb 工具可以对目标程序进行符号调试。目标程序亦可通过 xflash 工具烧录至非易失性闪存中。这些工具均需借助 XMOS xTAG 通过 USB 2.0 将目标系统与主机连接。
核心特性
XTC 工具集提供了以下特性:
-
重置目标、下载并运行目标程序,并可选地支持主机-IO 和 xscope 操作
-
将目标程序烧录到目标系统的闪存中
-
导出目标的当前状态(不重置目标)
-
提供目标的符号调试(无论是下载到 RAM 中还是从闪存启动的程序)
-
可从系统重置状态开始调试目标,或将调试器附加到已运行的程序
-
已部署的程序中可保留主机-IO 和 Xscope API 调用,工具在通过 xTAG 连接时可选地启用主机-IO
-
-
为开发者提供 API,以便在主机计算机上向目标传输应用数据及其反向操作
-
提供目标的基于样本的性能分析
-
管理连接至主机的所有 XTAG
-
列出 xTAG 并识别连接的目标系统类型
-
对所有工具而言,可通过列表索引或唯一标识符指定 xTAG
-
若主机仅连接了一个 xTAG,则无需提供标识符
-
目标系统
工具支持三代 XMOS 目标系统:
-
xCORE(XS1 指令集架构)
-
xCORE-200(XS2A 指令集架构)
-
xcore.ai(XS3A 指令集架构)
评估板可通过多种渠道获得,如 Farnell。
xTAG
xTAG 是连接主机与目标的物理接口。工具支持两种 xTAG:xTAG v3.0和 xTAG v4.0。这两种 xTAG 均通过 USB 2.0 高速(Micro-B)接口连接至主机,并通过该接口为 xTAG 提供电源。xTAG3 通过专有的 xSYS 接口与目标板连接,而 xTAG4 则通过 xSYS2 接口与目标板连接。
xSYS 和 xSYS2 均提供 4 线 IEEE1149.1 JTAG 接口和全双工串行 xCONNECT 链路接口,以及其他一些控制信号。注意,可选的 JTAG 信号 nTRST 没有引脚。
当 xTAG 连接到主机时,它会监听某些特定主机程序(xrun、xgdb、xflash 或 xburn)的连接请求。首次连接时会向 xTAG 下载固件,以支持目标相关操作。除非 xTAG 断电重启,否则不会在后续连接时重新下载固件。
连接到 xTAG 所需的时间可能因固件下载和主机操作系统可能引入的延迟而变化,尤其是当连接多个 xTAG 时,这一时间可能会更长。在连接建立时会加锁,可能会暂停其他独立主机工具的执行,这些工具各自使用不同的 xTAG。连接建立后,锁定会被释放。自动化测试系统应确保为 xTAG 响应设置足 够长的超时时间,以应对可能需要经验来确定的最坏情况。
如果 xTAG 之前用于早期的 Tools 15 版本,首次连接时会尝试安装本版本所需的固件。此过程中 xTAG 将自动重启,LED 会显示相应的状态变化。
注意 1:如果 xTAG 之前用于 Tools 15 版本之前的工具版本,在使用 Tools 15 连接之前必须手动断电重启。
注意 2:如果主机重启,可能会导致无法识别已连接的 xTAG。此时需要对 xTAG 断电重启。一些 USB 集线器支持断电重启其下游端口,这在远程实验室环境中非常有用。但请注意,Windows 10 Pro 不支持此功能。
xTAG v3.0
xTAG v3.0 提供 xSYS 接口(IDC 20 引脚,0.1 英寸)并支持 XS1 和 XS2 目标平台。它只支持 3.3V 的目标IO电平。
xTAG v4.0
xTAG v4.0 提供 xSYS2 接口(Amphenol Minitek127 20 引脚,0.05 英寸)并支持 XS2 和 XS3(xcore.ai)目标平台。它能自动且独立地支持 1.8V 和 3.3V 的目标电压,适用于 JTAG 和 xCONNECT Link 接口。
xCONNECT Link 是可选的 - 如果未连接,可在目标板上使用更小尺寸的连接器。为了尽可能降低连接器成本,生产编程和测试时可以使用 Tag-Connect Plug-Of-Nails。只需连接 IEEE1149.1 JTAG 信号即可。
在 Windows 10 Pro 上使用 xTAG
在 Windows 10 Pro 主机上,XTC 安装程序会设置一个 XTAG 服务。该服务会在安装完成后以及每次主机启动时自动启动,无需额外管理。
在 Windows 10 Pro 上,无法在 XTC Tools 15 系列版本与早期版本之间切换并使用需要访问 xTAG 的主机工具。
在 Windows 10 Pro 上,xTAG 的唯一标识符以大写显示,但工具对大小写不敏感,因此在工具支持的所有操作系统类型之间,驱动工具的脚本可以无缝切换使用。
主机工具
与目标系统交互的主机工具有 xrun、xgdb、xflash 和 xburn。
除非另有说明,本节中的示例假设单个 xTAG 和目标系统连接到主机计算机。
xrun
xrun 程序用于:
-
列出连接到主机计算机的 xTAG 和目标系统
-
将目标程序下载到 RAM 并运行
-
将目标程序下载到 RAM 并运行,同时管理主机-IO
-
将目标程序下载到 RAM 并运行,同时捕获 xscope 数据至文件
-
转储目标状态,可通过
.xe目标程序以符号形式展示,或不使用.xe以原始数据形式展示
列出已连接的 xTAG
使用命令 xrun -l 可列出连接到主机计算机的 xTAG。当首次将 xTAG 插入主机时,红色 LED 应以微弱 状态亮起。执行 xrun -l 命令时,LED 应变化状态。如果主机未识别 xTAG,应将其拔出几秒钟后再重新插入。如果 xTAG 未被列出,请检查其是否存在。在 Linux 主机上,运行以下命令:
在 Windows 主机上,打开设备管理器并展开通用串行总线设备列表。
启动目标程序
要在目标系统上启动目标程序,可以执行以下命令:
xrun 命令执行后会立即退出,目标程序则会持续运行。若目标程序运行出错,则可以通过 xgdb 进行附加调试。
启用主机-IO 功能的目标程序启动方式如下:
或启用 xCONNECT Link 主机-IO 功能的方式如下:
$ xrun –-xscope my_program.xe
xgdb
xgdb 是基于开源工具 gdb 开发的变体,它不仅支持标准的 gdb 命令行选项和命令,还增加了一些额外的命令选项和内置命令,专门用于与 XMOS 目标设备配合使用。
它不仅包含 xrun 的全部功能,还能:
-
对下载的程序进行交互式符号调试。
-
执行针对目标设备的脚本化操作。
-
附加到正在运行的目标设备上,无论是从闪存启动还是通过
xrun或xgdb下载并启动的程序。
只有在源代码单元(即 .c、.cpp 或 .xc 文件)使用 -g 选项编译时,才能进行符号调试。使用 -O 选项减少 xcc 的优化级别可以提高调试性,但可能会影响程序的行为。
调试目标程序
通过以下命令,可以启动对 my_program.xe 程序的调试会话,该命令会连接到目标设备,下载程序,并根据构建程序时使用的目标 XN 初始化设备:
$ xgdb -ex "connect" -ex "load" my_program.xe
如果愿意,可以在 (gdb) 提示符下输入 -ex 选项提供的命令。
只需提供一次 load 命令。
用户必须输入命令以启动程序运行:
(gdb) continue
在启动程序之前,可以输入调试命令。例如,可以通过 break 命令设置断点。
一旦开始运行目标程序,(gdb) 提示符将不再可用。主机-IO 可能会显示在控制台上。程序一旦启动,可以通过按下 Ctrl-C 来停止,此时会报告停止位置并显示 (gdb) 提示符。
使用以下命令可以列出每个活跃的逻辑核心:
(gdb) info threads
每个活跃的逻辑核心都会被分配一个唯一的“gdb 线程”编号。系统中所有瓦片的活跃逻辑核心都会被列出。注意,“gdb 线程”编号的分配并不固定,每次目标停止时都可能发生变化。可以使用 thread 命令来选择进一步检查的逻辑核心。例如:
可以使用 where 命令来显示逻辑核心的回溯(调用栈),例如:
(gdb) where
标准 gdb 命令可以用来检查局部和全局变量。详情请参考 gdb 文档。
附加到目标设备
在某些情况下,可能需要在不重置目标系统的情况下检查其状态。可以“附加”到一个正在运行的目标上。例如:
$ xgdb -ex attach my_program.xe
xgdb 会停止所有瓦片并提供 (gdb) 提示符。可以按照前一节的说明执行 xgdb 命令。
与目标交互
工具通过 JTAG 接口与目标建立连接、重置目标并向 RAM 下载程序。它用于与目标进行交互,如提取寄存器状态、设置断点等。还用于监控目标,以便检测程序是否终止、目标是否遇到致命异常以及中断目标等。它还可用于处理主机-IO。
调试模式
每个瓦片在下载程序、达到断点、终止目标程序以及在 xgdb 控制台执行 Ctrl-C 操作中断时,都会进入调试模式。在某些情况下,为了转发主机-IO 数据,它也会进入调试模式。当瓦片进入调试模式时,其所有逻辑核心将被暂停。
异常
工具 xrun 和 xgdb 在异常处理程序的入口点设置断点。当目标遇到致命异常(例如,由于除以零),工具会报告异常发生。通常可以使用 xgdb 来通过符号调试来查找原因,通常是通过显示回溯。
请注意,如果瓦片意外进入调试模式,会生成 SIGTRAP 消息。这可能在对瓦片执行某些低级操作时发生。目标程序没有遇到异常。
使用 xrun 启动
如果目标程序是通过 xrun 启动的,而没有指定任何可选参数,xrun 将加载并运行程序,然后立即退出,让目标程序继续运行。如果提供了 -io 选项或任何 -xscope 选项给 xrun,它将不会退出,直到目标程序终止,详见下文。
终止
如果某个瓦片的控制流程到达 main() 的结尾,那么该瓦片将终止并等待。当所有瓦片的控制流程都到达 main() 的结尾,并且目标程序是通过提供 -io 选项或任何 -xscope 选项的 xrun 启动的,xrun 会话将在程序终止时结束。如果程序是通过 xgdb 启动的,那么在终止时会报告“程序正常退出”。
如果某个瓦片调用 exit() 并传递非零值,那么 xrun 将返回该值作为进程退出代码。所有瓦片必须在 xrun 结束之前终止。只有一个瓦片应该调用 exit()。如果是通过 xgdb 启动的,退出代码将在控制台上显示。
主机-IO
如果目标程序调用了 stdio.h 中的标准库IO函数,如 printf()、fprintf()、fopen()、fread() 和 fwrite(),并且程序是通过 xgdb 启动的,或者是通过带 -io 或 -xscope 选项的 xrun 启动的,那么这些调用将被重定向,以在主机计算机的文件系统(或其控制台,对于 stdin、stdout 和 stderr 文件)上执行操作。数据将通过 JTAG 接口在目标和主机之间传输。为了传输数据,执行调用的瓦片将进入调试模式,从而暂停其所有逻辑核心的执行。
当程序部署以从闪存启动时,这些调用可以保留在程序中。如果稍后使用 xrun 或 xgdb 与这样的系统一起使用,IO 将被重定向到主机计算机。然而,这会增加运行时和内存使用的部署成本;每次调用都会先处理其参数,然后再检查内部状态以确定是否连接了 xrun 或 xgdb。
请注意,stdio.h 和本节中提到的其他头文件可以在 Linux 主机上的工具安装目录的 target/include 子目录中找到,或在 Windows 主机上的 target\include 中找到。
启用主机-IO 的示例 xrun 命令:
$ xrun –adapter-id DFW7DTYY –io test.xe