深入解析AM43xx SoC调试架构:从JTAG、CoreSight到多核协同调试实战
1. 调试子系统:嵌入式开发的“透视镜”与“手术刀”
在嵌入式系统开发的世界里,调试子系统扮演的角色,远不止一个简单的“排错工具”。你可以把它想象成一套集成在芯片内部的、极其精密的“透视镜”和“手术刀”。当你的软件在复杂的SoC(片上系统)上运行时,这套系统能让你实时“看”到处理器内核的执行流、数据访问、乃至整个片上网络的通信状况,并且能在关键时刻“下刀”——暂停、单步、设置断点,甚至触发复杂的联动事件。对于AM43xx这类集成了Cortex-A9、Cortex-M3、PRU等多种异构处理器的复杂SoC来说,一个强大而灵活的调试架构,是项目能否按时交付、性能瓶颈能否被精准定位的关键。
这套架构的核心,围绕着几个业界标准与专有技术展开:JTAG作为物理层和状态机的基石,提供了最基础的芯片访问通道;ICEpick作为TI的专有路由器,是管理多核、多调试域的灵魂;而CoreSight作为ARM推出的标准化片上调试与跟踪架构,则提供了从程序执行跟踪到系统性能监控的一整套解决方案。理解这三者的协同工作方式,是驾驭现代SoC调试能力的必修课。无论是从事底层驱动开发、系统固件设计,还是进行深度的性能分析与优化,掌握这套调试子系统的原理与实操,都能让你从“盲人摸象”变为“庖丁解牛”。
2. 调试子系统整体架构与设计哲学
一个典型的SoC调试子系统,其设计目标是在不显著增加芯片面积和功耗的前提下,为开发者提供尽可能强大、灵活且非侵入(或低侵入)的观测与控制能力。TI AM43xx的调试子系统是一个绝佳的范本,它清晰地展示了如何将标准组件与定制化模块有机结合。
2.1 核心组件构成与功能解析
根据技术手册,AM43xx的调试子系统是一个功能模块的集合,我们可以将其分为几个逻辑层次来理解:
第一层:访问与路由层这是调试器与芯片内部世界的“海关”和“交通枢纽”。
- ICEPick-D™ JTAG路由器:这是TI的专有技术,是整个调试子系统的“守门人”和“调度中心”。它直接连接外部JTAG接口,管理着芯片内部所有支持JTAG的测试访问端口(TAP)。它的核心能力是“动态TAP插入”,允许调试器在运行时按需将某个处理器(如Cortex-A9或某个PRU)的TAP接入扫描链,而无需干扰其他TAP的状态。这就像在一个拥有多个房间的大楼里,ICEPick是一把总钥匙和中央控制系统,可以让你只打开需要进入的那个房间的门,而不是打开所有门。
- 调试访问端口(DAP):这是ARM CoreSight架构的标准组件。如果说JTAG/TAP是“串行控制总线”,那么DAP就是基于内存映射的“并行访问总线”。通过DAP,调试器可以像访问普通内存一样,读写处理器内核的寄存器、设置硬件断点、访问跟踪缓冲区等。DAP通常包含一个AHB-AP(用于访问系统内存)和一个APB-AP(用于访问调试组件自身的配置寄存器)。在AM43xx中,Cortex-A9子系统的所有调试组件(如PTM、ETB)都是通过DAP-APB来配置和访问的。
第二层:跟踪与观测层这是系统的“数据记录仪”和“监控探头”。
- 处理器跟踪子系统:核心是CoreSight PTM(程序跟踪宏单元)。它能以极低的带宽开销,连续记录Cortex-A9处理器的程序执行流(如分支、异常、上下文切换)。这些跟踪数据要么通过CS-TPIU(跟踪端口接口单元)输出到芯片引脚,供外部逻辑分析仪捕获;要么存入CS-ETB(64KB嵌入式跟踪缓冲区)中,供调试器事后读取。
- 系统跟踪子系统:核心是MIPI-STM(系统跟踪宏单元)。它用于收集来自系统其他部分的“软件仪器化”数据和硬件事件。例如,软件可以通过写特定内存地址来向STM发送调试信息;OCP总线监视器(OCP-WP)和网络互连统计收集器(NoC Statistics Collector)可以将总线事务匹配、性能统计等硬件事件发送给STM。STM同样可以将数据输出到引脚或ETB。
第三层:控制与联动层这是让各个调试部件协同工作的“神经系统”。
- 交叉触发单元(XTRIGGER):这是实现复杂调试场景的“魔法”。它允许一个处理器或模块产生的调试事件(如断点命中、跟踪缓冲区满)去触发另一个处理器或模块的动作(如开始跟踪、产生中断、进入调试状态)。例如,你可以设置当PRU0访问某个特定内存地址时(触发事件),让Cortex-A9立即暂停执行(触发动作),从而实现跨核的精确同步调试。
- 调试资源管理器(DRM):由于芯片引脚资源有限,调试、跟踪等功能需要复用有限的EMU引脚。DRM就像一个“引脚复用调度器”,负责根据当前调试模式(如仅JTAG、JTAG+跟踪输出)来配置这些引脚的功能。例如,当需要输出处理器跟踪数据时,DRM会将原本可能用作普通GPIO或EMU功能的引脚,切换为TPIU的跟踪数据输出引脚。
第四层:基础支撑层
- 电源、复位、时钟管理调试支持:这是确保调试可靠性的基石。ICEPick模块提供了对各个处理器电源域、时钟域的查看与控制能力。调试器可以强制某个域上电、打开时钟,并阻止其在调试会话期间被关断或门控,从而保证即使系统进入低功耗状态,调试连接依然稳定。
- 挂起机制:为了确保处理器进入调试状态时,与其紧密耦合的外设(如定时器、PWM)能同步暂停,防止状态不一致,SoC实现了挂起信号。相关外设可以配置为对处理器的调试挂起请求敏感,从而实现硬件级的同步。
注意:调试子系统本身也是一个复杂的“小系统”,它有自己的电源域(通常是常开的“Always-On”域或专门的“Emulation”域),以确保即使主处理器掉电,ETB中的跟踪数据或调试状态信息也不会丢失。这对于“死机后分析”的场景至关重要。
2.2 信号与接口:物理世界的连接
调试子系统通过有限的芯片引脚与外部世界交互,主要分为两类接口:
1. IEEE 1149.1 (JTAG) 接口这是最基础、最必需的调试接口,通常是一个14针或20针的接头。核心信号包括:
- TCK (Test Clock):测试时钟,由调试器提供,驱动JTAG状态机。
- TMS (Test Mode Select):测试模式选择,决定状态机的下一个状态。
- TDI (Test Data Input) / TDO (Test Data Output):测试数据输入/输出,构成扫描链。
- nTRST (Test Reset):测试逻辑复位(低有效),用于初始化整个调试逻辑。
- RTCK (Return Test Clock):返回测试时钟,用于在高速调试时实现时钟同步,避免时序问题。
- EMU[1:0] 或 EMU[4:0]:TI扩展的仿真引脚。它们功能多样,在ICEPick启动时用于配置启动模式(如是否进入等待复位模式),在运行时可用于交叉触发输入/输出,或在跟踪模式下被DRM重定义为跟踪数据输出引脚。
2. 跟踪端口当需要导出大量跟踪数据(每秒可达数百MB)时,会使用跟踪端口。在AM43xx上,跟踪端口与部分EMU引脚复用。TPIU或STM模块会将这些引脚驱动为高速的串行数据流(TRACEDATA[11:0],TRACECLK等)。外部需要一个专用的跟踪接收器(如TI的XDS560v2 Pro tracer)或高速逻辑分析仪配合适配器来捕获并解析这些数据。
实操心得:引脚配置陷阱手册中特别强调,dpm_emu[11:2]这些引脚是与应用功能复用的。这意味着,如果你在板级设计中将某个EMU引脚用作普通GPIO或外设功能,那么在需要用它进行跟踪输出前,必须通过芯片的控制模块(Control Module)的引脚复用寄存器,将其重新配置为调试功能。否则,你将无法看到任何跟踪数据输出,或者输出信号异常。这是一个硬件工程师和软件工程师需要紧密配合的地方,务必在原理图设计和早期软件初始化中确认。
3. ICEpick:多核调试的智能路由器
ICEPick是TI调试架构中极具特色的一环,它解决了多核SoC调试的一个核心难题:如何高效、灵活地管理众多调试对象。
3.1 动态TAP插入的工作原理
在没有ICEPick的简单系统中,所有JTAG TAP通常是串联成一条长长的扫描链。每次进行调试操作,数据都需要穿过整条链,效率低下,且无法单独控制某个TAP。ICEPick引入了一个“路由器”的概念。
- 初始状态:上电后,ICEPick根据
EMU[1:0]引脚电平决定启动模式。默认模式(1,1)下,只有ICEPick自身的TAP位于TDI->TDO的路径中,其他所有次级TAP(如Cortex-A9 TAP, PRU TAP)都处于“未连接”状态。 - 连接密钥:为了启用ICEPick的全部指令(特别是动态配置TAP的指令),调试器必须先通过JTAG向ICEPick的“连接寄存器”写入一个特定的密钥。这是一种安全机制,防止意外或恶意的调试访问。
- TAP编队:ICEPick内部维护着一个TAP列表(如表31-5所示)。每个次级TAP(如对应Cortex-A9子系统的TAP 12)都关联着芯片内的一个调试域。调试器通过ICEPick指令,可以动态地将一个或多个指定的TAP“插入”到当前活动的扫描链中,同时将其他TAP“旁路”。
- 独立访问:一旦某个TAP被插入,调试器就可以通过标准的JTAG指令(如
IRSCAN,DRSCAN)直接与该TAP所代表的处理器或调试组件通信,而不会影响链上其他TAP的指令寄存器(IR)状态。
为什么需要动态插入?
- 功耗与干扰最小化:只激活需要调试的处理器域,其他域可以保持低功耗状态,避免不必要的时钟和信号活动干扰调试。
- 调试会话独立:可以同时连接多个调试器(理论上),每个调试器通过不同的ICEPick实例(在更复杂的多芯片场景中)或不同的TAP集合,独立调试不同的内核,互不干扰。
- 简化扫描链:对于拥有数十个甚至上百个潜在TAP的大型SoC,一条固定的长扫描链在物理设计和时序收敛上都是噩梦。动态插入逻辑上缩短了链长。
3.2 电源、复位与时钟的调试控制
ICEPick的另一个强大功能是它对调试域电源状态的管理。这对于调试低功耗应用至关重要。
- 状态查询:调试器可以查询任何与ICEPick次级TAP关联的电源域的当前状态(开/关)、时钟状态(开/关),以及是否有“掉电事件”发生。
- 状态覆盖:调试器可以强制一个电源域上电并打开时钟,同时阻止该域在调试会话期间被软件或硬件电源管理逻辑关闭。这个功能被称为“调试唤醒”或“保持唤醒”。例如,当Cortex-A9进入深睡眠状态(CPU域断电)时,如果没有此功能,调试连接会立即断开。而通过ICEPick的覆盖,可以保持该域上电,让调试器能够检查睡眠前的状态,或单步执行唤醒流程。
- 等待复位(WIR)模式:这是一种极其有用的启动调试模式。通过配置
EMU[1:0]为(1,0),芯片在释放上电复位后,所有支持TAP的处理器内核将被保持在复位状态。调试器可以先连接进来,设置好断点、初始化内存等,然后再通过ICEPick指令“全局”或“局部”地释放某个处理器的复位,让其从预定地址开始执行。这保证了调试器能从第一条指令开始捕获处理器行为。
实操心得:WIR模式的使用时机WIR模式是进行Bootloader调试、早期硬件初始化代码调试的利器。传统的调试方式是在代码中设置一个“死循环”或“空操作”作为调试入口点,然后让CPU运行到那里再连接。这种方式可能因为早期代码的配置错误(如时钟、内存控制器)而导致CPU跑飞,根本无法停在预定位置。WIR模式让调试器掌握了复位的主动权,实现了真正的“从零开始”调试。但要注意,AM43xx中的PRU处理器不支持WIR模式,它们的调试需要其他方法。
4. CoreSight跟踪架构:洞察处理器执行的利器
ARM CoreSight是一套完整的、标准化的片上调试与跟踪解决方案。在AM43xx中,Cortex-A9 MPU子系统的调试和跟踪功能就是基于CoreSight构建的。
4.1 处理器跟踪(PTM)与嵌入式跟踪缓冲区(ETB)
PTM的工作是“压缩”记录处理器的执行历史。它不会记录每一条指令,而是记录程序流中的“变化点”,例如:
- 直接分支和跳转的目标地址。
- 间接分支(通过寄存器跳转)的目标地址。
- 异常入口和返回。
- 上下文ID切换(用于区分不同任务/进程)。
这些信息以高度压缩的格式输出,形成“程序跟踪”流。PTM还可以配置为记录数据访问的地址(数据地址跟踪),但不记录数据值本身,以平衡带宽和需求。
ETB是一个位于芯片上的64KB SRAM缓冲区。它通过ATB(高级跟踪总线)接收来自PTM(或STM)的跟踪数据流。其工作模式非常灵活:
- 环形缓冲区模式:持续记录,新数据覆盖旧数据。适用于捕获导致系统崩溃前一段时间内的执行历史。
- 触发窗口模式:可以配置为在特定触发事件(如断点命中)发生前、后或周围,记录固定量的数据。这可以精确定位问题发生瞬间的上下文。
跟踪数据流路径(如图31-3所示):Cortex-A9 PTM->ATB->CoreSight Trace Funnel (CS-TF)->CS-ETB或CS-TPIU。 CS-TF是一个多路复用器,负责将多个跟踪源(此处PTM是端口0)的数据流合并到单一输出。在AM43xx中,端口7连接的是系统跟踪STM,这意味着处理器跟踪和系统跟踪可以独立配置,但不能同时输出到TPIU(因为只有一个TPIU)。它们可以同时输入到ETB,在ETB内混合。
4.2 跟踪端口与时钟管理
将高速的跟踪数据流导出到芯片外部,面临两个主要挑战:引脚数量和时钟。
TPIU引脚配置:TPIU支持可配置的10位或12位并行数据输出宽度(TRACEDATA[9:0]或[11:0]),外加一个时钟TRACECLK和一个控制信号TRACECTL。更宽的数据位宽意味着在相同时钟频率下能有更高的吞吐量,但会占用更多芯片引脚。
时钟生成与调谐:跟踪时钟的稳定性和精确性至关重要,它决定了外部接收器能否正确采样数据。
- PDLO方案:调试子系统内部有一个专用的可编程延迟线振荡器。其原理是通过调整内部延迟单元的级数来“粗调”频率,再通过一个分频器“细调”。PDLO的优势是独立于系统主时钟,且内置校准电路,可以持续监测并补偿因工艺、电压、温度变化引起的频率漂移。缺点是校准过程中可能会有几个时钟周期的停顿。
- DPLL方案:跟踪时钟也可以来源于系统的CORE DPLL,并通过时钟管理模块(CM)进行分频。这种方式时钟质量高且与系统时钟同源,易于同步。但缺点是当系统改变DPLL设置或进入低功耗模式时,可能会影响跟踪时钟。
实操心得:跟踪时钟选择
- 追求稳定性与独立性:如果系统时钟可能频繁变化(如动态电压频率调整DVFS),或者你需要一个与系统活动无关的固定跟踪速率,应选择PDLO方案。
- 追求简单与同步:如果系统时钟稳定,且你希望跟踪数据与系统事件在时间上更容易关联(例如,将跟踪数据与总线分析仪的数据对齐),可以选择DPLL方案,并注意配置合适的分频比,使跟踪时钟频率在外部接收器的支持范围内。
- DRM配置:最终选择哪个时钟源,以及配置TPIU/STM的数据位宽、引脚映射,都需要通过调试资源管理器(DRM)的寄存器进行编程。这部分配置通常由调试器软件(如Code Composer Studio)根据你的工程设置自动完成,但了解其底层机制有助于在出现问题时进行排查。
5. 系统仪器化与交叉触发:全景式系统调试
调试单个处理器往往不够,现代SoC是一个协同工作的系统。CoreSight架构通过系统仪器化和交叉触发提供了系统级的观测和控制能力。
5.1 系统跟踪(STM)与软件仪器化
MIPI-STM模块是系统跟踪的核心。它遵循MIPI STPv1.0协议,专门优化用于传输软件产生的消息。
- 软件仪器化:开发者可以在代码中插入对特定内存映射寄存器(MMR)的写操作。这些写操作会被总线识别为“仪器化事务”,并路由到STM。STM为这些消息自动添加时间戳,并通过其FIFO和端口输出。这相当于在代码中埋设了“探针”,可以输出变量值、函数入口/出口、状态标记等信息,对理解复杂软件的执行顺序和时序关系帮助极大。AM43xx支持多个主设备(Cortex-A9, PRU0/1, EDMA等)进行软件仪器化,每个主设备有唯一的Master-ID。
- 硬件事件跟踪:OCP-WP(总线监视点)和NoC统计收集器产生的硬件事件,也会被格式化为STM消息。例如,OCP-WP可以在监测到对某个关键地址范围的访问时,生成一条包含地址、主设备ID、事务类型等信息的跟踪消息。
STM数据输出:与PTM类似,STM数据可以输出到芯片引脚(STM_DATA[3:0],STM_CLK)供外部捕获,也可以重定向到内部的ETB进行片上存储。
5.2 交叉触发(Cross-Triggering)实战应用
交叉触发是调试子系统中最强大的协同调试功能。它通过一个集中的交叉触发矩阵(CTM)和分布在各子系统中的交叉触发接口(CTI)来实现。
工作原理:
- 事件产生:任何一个支持交叉触发的模块(如Cortex-A9的硬件断点、PTM、ETB满事件、OCP-WP匹配、甚至外部EMU引脚输入)都可以被配置为产生一个“触发事件”。
- 事件路由:该事件被发送到CTM。CTM内部有一个可编程的互联网络,可以将输入事件映射到输出触发线。
- 动作执行:另一端的模块(如另一个处理器、PTM、STM、OCP-WP)可以配置为“监听”某条触发线。当触发线有效时,该模块执行预定义的动作,如:请求处理器进入调试状态、产生一个中断、开始/停止跟踪、开始/停止总线监控等。
典型应用场景:
- 多核同步断点:在Cortex-A9上设置一个数据写入断点,当该断点命中时,通过交叉触发让PRU0也立即暂停。这用于调试A9与PRU之间的数据交互问题,确保能在数据被破坏的瞬间冻结两个处理器的状态。
- 触发式跟踪:配置OCP-WP监视对某个共享缓冲区的访问。一旦有写入操作(触发事件),立即通过交叉触发线通知PTM开始记录Cortex-A9的执行跟踪(动作)。这样就能捕获到“是谁、在什么时间、在什么代码上下文中”修改了这个关键缓冲区。
- 性能分析联动:配置当NoC统计收集器检测到L3互连延迟超过阈值时(事件),触发STM开始高频率记录软件标记(动作),从而关联系统性能瓶颈与具体的软件模块。
配置要点: 交叉触发的配置是“分布式”的。你需要分别配置:
- 源模块:在产生事件的模块(如Cortex-A9的CTI)中,配置将哪个内部事件(如
DBGREQ)映射到CTM的哪条输出通道(trigout)。 - CTM路由:在CTM(或SoC级别的XTRIGGER模块)中,配置将源通道连接到目标通道。在AM43xx中,XTRIGGER的配置通常是通过子系统级的寄存器完成的,而不是直接通过JTAG。
- 目标模块:在执行动作的模块(如PRU的调试逻辑或STM)中,配置监听CTM的哪条输入通道(
trigin),以及接收到触发信号后执行什么动作(如产生调试请求)。
重要提示:手册明确指出,XTRIGGER模块不能通过JTAG接口或任何设备处理器进行编程。它的配置是在子系统级别完成的。这意味着相关的配置寄存器可能位于各个子系统的私有配置空间内,需要查阅各个子系统的技术参考手册(TRM)来了解具体的编程模型。这通常是调试器软件或底层引导代码需要完成的工作。
6. 常见调试问题排查与实战技巧
在实际开发中,调试子系统本身也可能“生病”。以下是一些常见问题及排查思路。
6.1 调试器无法连接或识别设备
这是最令人头疼的问题。请按照以下步骤系统排查:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 调试器报告“No USB JTAG device found”或“Cannot find target” | 1. 硬件连接问题(线缆、接口) 2. 目标板未供电或电源异常 3. JTAG接口电平不匹配 4. nTRST/TCK等信号被板卡其他电路干扰 | 1.检查物理连接:更换USB线、JTAG仿真器,确保接口牢固。 2.测量电压:确认目标板核心电压、IO电压(通常1.8V或3.3V)正常,且仿真器与目标板共地。 3.检查信号:用示波器查看TCK是否有时钟,nTRST是否已释放(应为高电平),TMS在连接过程中是否有跳变。 4.检查引脚复用:确认用于JTAG的芯片引脚没有被错误地配置为其他功能(如GPIO输出)。在上电初期,这些引脚通常由内部上拉/下拉或硬件默认状态决定功能。 |
| 调试器能识别仿真器,但无法扫描到JTAG ID | 1. ICEPick未正确初始化或处于非默认启动模式 2. 目标处理器电源/时钟域关闭 3. JTAG链中存在损坏的器件 | 1.检查启动模式:测量EMU[1:0]引脚在上电复位释放时的电平,确保其为(1,1)(默认模式)。如果被拉低,ICEPick可能进入了保留模式或WIR模式,导致行为异常。2.强制上电:如果怀疑Cortex-A9等主域未上电,尝试在调试器连接命令中增加参数,强制ICEPick唤醒该域(如CCS中的“Connect Options”里勾选相关电源域控制)。 3.读取IDCODE:尝试使用最基础的JTAG指令手动扫描IDCODE寄存器。如果连ICEPick的ID都读不到,可能是硬件损坏或信号完整性极差。 |
| 连接不稳定,时而能连时而不能连 | 1. 电源噪声大 2. 时钟信号质量差(过冲、振铃) 3. 目标系统处于低功耗状态,调试域被意外关闭 | 1.电源去耦:检查目标板JTAG接口和芯片电源引脚附近的去耦电容是否完好。 2.信号完整性:检查JTAG信号线是否过长,是否有端接匹配。高速JTAG下,信号质量问题会放大。 3.禁用低功耗调试:在调试阶段,暂时在软件中禁用深度睡眠模式,或确保调试器已正确配置ICEPick以保持调试域上电。 |
6.2 跟踪功能无法工作
跟踪功能涉及环节多,配置复杂,容���出问题。
无跟踪数据输出:
- 确认引脚配置:这是最常见的原因。检查
dpm_emu[11:2]中用于跟踪输出的引脚,是否已通过控制模块(Control Module)正确配置为调试/跟踪功能,而不是GPIO或其他外设功能。 - 确认DRM配置:调试器需要正确编程DRM,以将TPIU或STM连接到正确的EMU引脚,并设置正确的数据宽度。确认调试器配置文件(.ccxml)中的跟踪设置与硬件设计一致。
- 检查时钟:用示波器测量
TRACECLK或STM_CLK引脚是否有时钟输出。如果没有,检查PDLO或DPLL的配置是否正确,时钟是否被使能。 - 确认跟踪源使能:确保PTM或STM模块本身已被使能,并且已正确配置(如设置了正确的跟踪协议、时钟分频等)。
- 确认引脚配置:这是最常见的原因。检查
跟踪数据错乱或丢失:
- 时钟速率不匹配:外部跟踪接收器(如XDS560v2 Pro Trace)的采样时钟速率必须与芯片输出的跟踪时钟速率严格匹配。在调试器中检查并设置正确的跟踪时钟频率。
- 缓冲区溢出:如果使用ETB,并且跟踪数据产生速率过快,64KB的缓冲区可能很快被填满并覆盖旧数据。考虑增加ETB的触发条件,只捕获关键窗口的数据,或者改用外部跟踪端口输出到更大容量的设备。
- 电源噪声:高速跟踪信号对电源完整性非常敏感。确保芯片的模拟/调试电源部分供电干净、稳定。
6.3 交叉触发不生效
- 事件未产生:首先确认源模块的调试事件是否真的被触发。例如,硬件断点是否确实命中?可以在源处理器上单独调试,确认断点能正常工作。
- 路由未配置:交叉触发涉及源CTI、CTM/XTRIGGER、目标CTI三处配置。缺一不可。仔细检查各部分的寄存器配置,确保事件输出通道、矩阵路由、动作输入通道都已正确连接。查阅具体的子系统TRM,确认交叉触发寄存器的地址和位域。
- 动作未执行:确认目标模块已配置为对相应的触发输入信号敏感,并且执行的动作是有效的。例如,如果目标是让一个处理器暂停,确保该处理器的调试请求(DBGREQ)功能是使能的。
- 电平/极性问题:注意触发信号是电平有效还是边沿有效,是高有效还是低有效。配置错误会导致无法检测。
6.4 低功耗模式下的调试问题
- 调试连接断开:当处理器进入深睡眠(电源域关闭)时,其调试逻辑也会掉电,导致JTAG连接丢失。解决方案:在调试低功耗代码时,务必利用ICEPick的电源覆盖功能。在调试器连接配置中,启用“Prevent power-down of debug domain”或类似选项。这样即使应用软件请求关断该域,ICEPick也会强制其保持上电。
- 唤醒后状态异常:有时处理器被唤醒后,调试逻辑可能没有正确重新初始化,导致单步、断点等功能异常。解决方案:尝试在唤醒后,通过调试器对处理器执行一次软复位(如果支持),或者重新建立调试连接。检查处理器的调试控制寄存器在唤醒后的状态。
- ETB数据保存:ETB位于仿真电源域,通常常开。但为了确保万无一失,在进行崩溃分析时,应在系统看门狗复位或手动复位前,先通过调试器将ETB的内容读取出来。一些高级的调试器支持“崩溃转储”自动保存功能。
最后的建议:深入使用SoC的调试子系统,最好的伙伴是一份详细的芯片勘误表(Errata Sheet)和该芯片系列的社区论坛。许多调试相关的古怪问题,可能是特定芯片版本存在的硬件缺陷,勘误表中会有描述和可能的规避方法。而社区论坛里,则充满了其他工程师踩过的坑和分享的宝贵经验。调试这样的复杂系统,一半靠知识,一半靠经验。
