公司动态
TDA3xx TESOC现场测试:汽车SoC功能安全与硬件诊断实战解析
1. 项目概述与背景在汽车电子尤其是高级驾驶辅助系统ADAS和自动驾驶领域芯片的长期可靠性与功能安全是产品设计的生命线。想象一下一辆搭载了视觉处理芯片的汽车在高速公路上行驶了数万公里后其内部的处理器逻辑或存储单元因老化、辐射或制造缺陷出现了偶发性的位翻转或逻辑错误而系统却对此一无所知这无疑是灾难性的。为了应对这种风险国际标准ISO 26262对汽车电子系统的功能安全提出了严格要求其中一项关键指标就是硬件诊断覆盖率。它要求系统必须具备在“现场”——也就是产品部署到终端用户手中后——主动检测硬件潜在故障的能力。传统的硬件测试依赖于产线端的自动化测试设备ATE但这无法覆盖产品生命周期内的所有故障。于是一种名为“片上测试仪”Tester On Chip, TESOC的硬件模块被集成到像德州仪器TITDA3xx这样的复杂SoC中。TESOC的本质是一个内置的、可软件控制的微型“测试引擎”。它内部固化了一套工厂预编程的测试向量可以理解为一系列精心设计的“考题”能够在系统启动、运行间隙或关闭时对指定的核心处理器如IPU、DSP、EVE及其关键存储器进行逻辑LBIST和存储MBIST结构测试。这就像给SoC配备了一位随行的“内科医生”可以定期对关键“器官”进行深度体检而无需将设备返厂。本文将以TDA3xx SoC的TESOC模块为蓝本抛开官方文档的框架式描述结合我过去在ADAS域控制器开发中的实际踩坑经验深入剖析TESOC现场测试的底层原理、设计考量并手把手带你走通基于PDK CSL API的完整编程实践。无论你是正在为功能安全认证焦头烂额的嵌入式软件工程师还是对汽车芯片可靠性机制感兴趣的技术爱好者这篇文章都将为你提供从理论到实操的完整路线图。2. TESOC核心架构与工作原理深度解析要玩转TESOC绝不能只停留在调用API的层面必须理解其硬件架构和设计哲学。这决定了你编程时的边界条件和潜在风险。2.1 逻辑域隔离测试的“手术室”原则TESOC设计中最精妙的一点是“逻辑域”Logical Domains概念。TDA3xx将整个芯片划分为多个独立的测试域例如DOMAIN0IPU、DOMAIN1EVE、DOMAIN2DSP1等。每个域包含一个或多个功能模块IP并归属于特定的电源域。为什么需要逻辑域因为LBIST和MBIST测试是“破坏性”的。测试过程中被测模块的逻辑状态和存储器内容会被完全打乱。如果直接在系统运行时对某个核心进行测试其正在运行的程序和数据会立刻崩溃导致系统死机。因此TESOC遵循一个核心原则测试必须在目标域完全断电Power Down的“手术室”环境下进行。具体实现流程如下软件发起由某个掌握总线控制权的主控核心如IPU通过配置PRCM电源复位控制模块将目标域例如EVE置于断电或深度休眠状态。硬件协同TESOC硬件会持续监测目标域的电源状态。只有当它确认该域已完全断电所有待处理事务已终止才会启动测试。输出隔离测试期间被测域的所有输出信号被硬件钳位或隔离确保测试过程不会干扰SoC其他部分的正常运行。测试执行TESOC从内部ROM中读取针对该域预存的压缩测试向量TDLs施加给被测逻辑或存储器。结果收集与恢复测试完成后TESOC生成完成中断。软件响应中断重新通过PRCM给目标域上电、解除复位使其恢复功能状态。这个“断电-测试-上电”的流程是理解所有TESOC操作模式的基石。它意味着测试时机的选择至关重要必须与系统的任务调度紧密配合。2.2 测试向量与切片灵活性与效率的平衡TESOC ROM中存储的测试向量并非一个不可分割的整体而是被组织成多个“切片”Slices。每个切片代表一小段独立的测试序列具有确定的执行时间。切片设计的价值在于提供了测试的“粒度”控制完整测试可以配置运行某个域的所有切片实现最大化的诊断覆盖率如表3所示IPU逻辑测试覆盖率达85%。部分测试当系统空闲窗口有限时例如DSP在两个任务间仅有30微秒的空闲可以只运行少数几个切片假设每个切片3微秒。虽然覆盖率不完整但能实现高频次的“健康抽查”。表2中的切片配置寄存器如TESOC_SLICE_CONFIG_DOM0[0] 0x003FFFF8就是一个位图bitmap。每一位代表一个切片置1表示该切片被选中执行。这种设计给予了软件极大的灵活性可以根据系统实时状态动态调整测试策略。一个关键细节官方文档提到MBIST测试要求被测模块运行在额定频率OPP_NOM。这是因为MBIST测试逻辑需要与存储器接口时钟同步在非标称频率下时序可能无法满足导致测试结果不可靠或测试失败。这是很多开发者容易忽略的硬件约束。2.3 中断与唤醒IPU自测试的“复活”机制TESOC的中断处理尤其是IPU自测试场景是整套机制中最需要小心设计的部分。普通场景测试其他域IPU作为主控配置TESOC对DSP1进行测试。IPU通过PRCM关闭DSP1电源。TESOC开始测试DSP1。测试完成TESOC产生TESOC_IRQ_DONE中断。IPU或其他已配置处理此中断的核心收到中断读取结果然后通过PRCM唤醒DSP1。 这个过程相对直观中断用于通知测试完成。特殊场景IPU自测试这是最复杂的情况因为测试执行者TESOC和被测对象IPU是同一个电源域。流程如下IPU配置TESOC对自身DOMAIN0进行测试。IPU配置PRCM准备让自身进入断电状态。但在这之前必须做一件至关重要的事配置TESOC完成中断作为IPU的唤醒事件Wake-up Event。IPU将自己断电。此时整个IPU域包括CPU掉电程序停止执行。TESOC开始测试IPU逻辑和存储器。测试完成TESOC产生中断。这个中断信号直接连接到IPU的本地唤醒发生器。唤醒发生器触发IPU域重新上电、复位并启动。ROM引导加载程序RBL开始执行。此时如果没有额外信息RBL会认为这是一次普通的上电复位进行完整的引导流程这将浪费大量时间。“快速启动”的奥秘为了解决上述问题TDA3xx引入了两个关键的控制器模块寄存器TESOC_LAST_RESET_INDICATOR[27:24]这是一个软件可写的“标志寄存器”。在IPU触发自测试前软件需要向其中写入特定值例如0xA告诉硬件“接下来的复位是我主动发起的TESOC测试不是意外掉电”。ROM_CPU0_BRANCH和ROM_CPU1_BRANCH这是两个“跳转地址寄存器”。软件在触发自测试前将希望复位后直接跳转执行的地址通常是应用程序入口或第二阶段引导加载程序SBL的入口写入这两个寄存器。当IPU因TESOC测试完成而被唤醒复位后RBL在启动初期会读取TESOC_LAST_RESET_INDICATOR寄存器。如果发现值是之前软件设置的特定模式并且硬件会在复位后将其修改为另一个值如0x5以示区分RBL就明白这是一次“测试后复位”。于是它跳过耗时的外设初始化、内存初始化等完整引导步骤直接根据ROM_CPUx_BRANCH寄存器中的地址跳转实现“秒级”恢复。这对于CAN通信等有严格启动时间要求的车载应用至关重要。一个真实的坑如果在IPU自测试时没有正确配置中断作为唤醒事件或者没有正确设置上述两个寄存器会导致IPU测试完成后无法唤醒或唤醒后陷入漫长的完整重启无法满足功能安全中对故障恢复时间的要求。3. TESOC现场测试的三种模式与策略选择理解了架构我们来看TESOC在系统生命周期中何时被使用。官方文档提到了三种模式但它们的实用性和复杂度天差地别。3.1 启动测试最推荐、最稳定的模式启动测试在系统上电初始化过程中进行。此时大多数硬件处于可控的初始状态没有复杂的应用上下文需要保存。优势复杂度低无需保存和恢复复杂的运行时状态Context Save/Restore。干扰少系统尚未进入多任务复杂运行状态调度简单。TI官方支持TI的Vision SDK及其引导程序SBL主要支持此模式。策略示例延迟启动测试并非所有核心都需要在启动瞬间测试。一个优化的策略是系统上电RBL运行。SBL启动首先对作为主控的IPU进行自测试LBISTMBIST。完成后利用快速启动机制恢复。SBL继续初始化系统基础服务。在需要启动DSP1、DSP2或EVE运行算法之前SBL或应用软件再逐一将它们断电进行TESOC测试测试完成后再加载其固件并启动。对于ISS图像传感器接口、DSS显示、VIP视频输入端口等外设模块可以在应用层打开摄像头或显示功能之前由应用触发其MBIST测试。这种“按需测试”的策略可以显著优化系统整体启动时间尤其适合对启动速度有严格要求的场景。3.2 运行时测试理论可行实践慎用运行时测试指在系统正常工作时利用某个核心的短暂空闲窗口对其进行测试。文档明确指出其**“通常不推荐”**。原因在于极高的软件复杂度破坏性测试LBIST/MBIST会摧毁核心的所有状态。这意味着在测试前必须将核心的完整上下文所有寄存器值、缓存内容、核心私有内存数据保存到共享内存中。精确调度需要精确预测该核心的下一个空闲窗口长度确保足够完成至少一个测试切片。如果测试被应用任务打断需要中止测试这又引入了状态恢复的复杂性。一致性挑战在多核系统中一个核心的突然断电测试可能会影响与其他核心之间的通信同步、共享资源访问等需要复杂的锁和同步机制。 因此除非有极其严苛的在线诊断覆盖率要求并且拥有强大的实时操作系统和精心设计的健康监控框架否则应避免使用运行时测试。3.3 关机测试作为补充的离线模式在系统收到关机指令后、完全断电前可以对部分或全部核心进行测试。测试结果可以存入非易失性存储器如Flash待下次启动时读取并采取相应措施如记录故障、限制功能等。优势不占用正常运行时和启动时的时间。挑战需要确保关机流程中有足够的剩余电量如电容储能完成测试。测试结果的存储和后续处理逻辑也需要额外设计。实操建议对于大多数ADAS项目将启动测试作为主要的诊断手段并充分利用延迟启动策略进行优化是平衡安全性与性能的最佳实践。运行时和关机测试可以作为特定需求下的补充方案但需要充分的评估和测试。4. 基于PDK CSL API的编程实践与避坑指南理论讲完我们进入实战环节。TI的Processor SDK提供了PDKPlatform Development Kit其中包含CSLChip Support Library层API封装了对TESOC等底层硬件的操作。下面我们结合代码和流程图详解编程步骤和注意事项。4.1 通用测试执行流程拆解下图展示了一个通用的TESOC现场测试执行序列我们将围绕它展开说明graph TD A[设备启动/应用运行] -- B{需要运行TESOC?}; B -- 是 -- C[配置TESOCbr/选择域与切片]; B -- 否 -- D[功能模式]; C -- E[配置PRCM使目标域进入IDLE]; E -- F{目标域已断电?}; F -- 是 -- G[TESOC开始现场测试]; F -- 否 -- E; G -- H{需要中止测试?}; H -- 是 -- I[TESOC中止当前切片]; I -- J[目标域恢复功能模式]; H -- 否 -- K[TESOC完成所有配置切片]; K -- L[产生完成中断]; L -- M[软件处理中断读取结果唤醒目标域]; M -- D;对应上述流程的PDK CSL API编程步骤使能TESOC时钟这是第一步但常被遗忘。TESOC模块本身需要时钟才能工作需通过PRCM配置。// 示例使用PM HAL电源管理硬件抽象层API使能TESOC时钟 status PMForceWakeupModule(PM_DEVICE_TESOC, PM_WKUP_ALL); if (status ! PM_SUCCESS) { // 错误处理 }检查TESOC状态确保TESOC当前不忙。#include drivers/tesoc.h status TESOCWaitUntilNotBusy(tesocBaseAddr, TIMEOUT_VALUE); if (status ! TESOC_PASS) { // TESOC正忙等待或处理 }解锁并清理TESOC寄存器TESOC的关键配置寄存器是锁定的需要先解锁。TESOCUnlockMMR(tesocBaseAddr); // 写入解锁模式0xA TESOCClearPrevState(tesocBaseAddr, domainLabel); // 清除之前测试的状态中断、结果等配置测试域和切片tesocTestCfg_t testCfg; testCfg.domain TESOC_DOMAIN_IPU; // 选择域例如IPU testCfg.testType TESOC_TEST_TYPE_LBIST; // 选择测试类型LBIST, MBIST, 或两者 // 获取该域该测试类型的默认切片配置 status TESOCGetDefaultSliceInfo(tesocBaseAddr, testCfg); // 你也可以手动修改 testCfg.sliceConfig[] 数组选择部分切片运行锁定配置并启动测试配置完成后锁定寄存器防止误修改。status TESOCConfigAndStart(tesocBaseAddr, testCfg); // 此API内部会执行写入切片配置 - 使能目标域 - 锁定寄存器 - 触发测试配置PRCM使目标域断电这是触发TESOC硬件开始测试的实际动作。TESOCConfigAndStart只是配置了TESOC它还在等待目标域断电的信号。// 这是一个复杂且易错的过程需要严格按照芯片手册操作 // 1. 禁用目标域的所有唤醒源除了TESOC中断如果是自测试 // 2. 配置目标域核心进入深度睡眠如Cortex-M的SLEEPDEEP // 3. 将目标域模块的时钟模式设置为硬件自动控制HW_AUTO // 4. 最后将目标域的电源状态控制寄存器设置为OFF // 具体寄存器操作请参考TDA3xx TRM中PRCM章节或使用PDK的PRCM API PRCMPowerDomainOff(domainId); // 示例性API实际更复杂关键点一旦执行完这一步目标域的CPU就会停止执行代码控制权暂时失去。对于测试其他域当前CPU如IPU会继续运行并等待中断对于IPU自测试IPU会直接断电。等待测试完成可以通过轮询或中断方式。轮询适用于测试其他域主控核心在等待。status TESOCWaitUntilNotBusy(tesocBaseAddr, TIMEOUT_VALUE);中断必须用于IPU自测试也可用于其他域测试。// 在启动测试前需要配置中断控制器和XBAR将TESOC_IRQ_DONE映射到CPU可处理的中断线 TESOCIntrEnable(tesocBaseAddr, TESOC_INTR_DONE); // 使能TESOC完成中断 // ... (配置XBAR和CPU中断控制器) ... // 在中断服务程序ISR中 void TESOC_ISR(void) { uint32_t intStatus TESOCGetIntrStatus(tesocBaseAddr); if (intStatus TESOC_INTR_DONE) { TESOCIntrClear(tesocBaseAddr, TESOC_INTR_DONE); // 清除中断 // 处理测试完成逻辑 } }读取并解析测试结果这是最容易出错的一步tesocAdvanceResult_t advanceResult; status TESOCGetAdvanceResult(tesocBaseAddr, testCfg, advanceResult); if (status TESOC_PASS) { for (int i 0; i advanceResult.numSlicesConfigured; i) { if (advanceResult.sliceStatus[i] TESOC_SLICE_STATUS_COMPLETED) { if (advanceResult.sliceResult[i] TESOC_SLICE_RESULT_PASS) { // 该切片测试通过 } else { // 该切片测试失败记录错误日志 // 可以使用 TESOCReadDiagnosticLog 读取详细的诊断信息 } } else { // 该切片未完成可能是测试被中止或发生了意外错误。 // **重要**未完成的切片其结果寄存器值可能是默认值1表示通过 // 但绝不能认为它通过了必须按失败或无效处理。 } } }核心避坑点必须结合sliceStatus切片状态和sliceResult切片结果来判断。TESOC按LSB到MSB的顺序执行切片。如果某个切片失败或测试被中止后续切片根本不会执行。但它们的sliceResult寄存器可能保持上电默认值1Pass。如果你只遍历sliceResult寄存器就会误判。正确做法是只检查那些你配置了要运行sliceConfig中对应位为1且状态为“已完成”的切片的结果。4.2 IPU自测试编程的特殊处理IPU自测试流程在通用流程基础上有几个生死攸关的额外步骤设置复位指示器和跳转地址在触发测试前// 1. 告诉控制器接下来的复位是TESOC测试引起的 HW_WR_FIELD32(SOC_CONTROL_MODULE_REG TESOC_LAST_RESET_INDICATOR, 27, 24, 0xA); // 写入魔数0xA // 2. 告诉ROM测试完成后跳转到哪里继续执行 uint32_t resumeAddr (uint32_t)myAppEntryAfterTesoc; // 你的应用恢复函数地址 HW_WR_REG32(SOC_CONTROL_MODULE_REG ROM_CPU0_BRANCH, resumeAddr); // 如果是双核IPU也需要设置CPU1的跳转地址 if (isDualCore) { HW_WR_REG32(SOC_CONTROL_MODULE_REG ROM_CPU1_BRANCH, resumeAddrForCore1); }将TESOC中断配置为IPU唤醒事件这是IPU能在测试完成后“复活”的关键。// 假设TESOC中断被映射到IPU的IRQ 67 uint32_t irqBit 67 - 32; // 计算在MEVT1寄存器中的位偏移IPU_WUGEN_MEVT1管理IRQ 32-63 HW_WR_REG32(LOCAL_PRCM_BASE IPU_WUGEN_MEVT1, (1 irqBit));在恢复函数中检查复位原因IPU被唤醒复位后首先执行的代码即myAppEntryAfterTesoc需要判断这次复位是否是预期的TESOC测试复位。void myAppEntryAfterTesoc(void) { uint32_t resetIndicator HW_RD_FIELD32(SOC_CONTROL_MODULE_REG TESOC_LAST_RESET_INDICATOR, 27, 24); if (resetIndicator 0x5) { // 硬件在TESOC复位后会将0xA改为0x5 // 确认是TESOC测试后的复位 // 1. 清除TESOC中断 TESOCIntrClear(tesocBaseAddr, TESOC_INTR_DONE); // 2. 读取并处理TESOC测试结果 processTesocResults(); // 3. 恢复正常的应用程序状态可能跳过部分初始化 appResume(); } else { // 是冷启动或其它复位执行完整的初始化流程 fullSystemInit(); } }4.3 常见问题排查与调试技巧在实际开发中你一定会遇到TESOC测试失败或行为异常的情况。以下是一些常见问题及排查思路问题现象可能原因排查步骤与解决方案测试根本无法启动TESOC一直处于BUSY或IDLE状态。1. TESOC模块时钟未使能。2. 目标域未成功进入断电状态。3. PRCM配置序列错误。1. 使用PM API或直接读PRCM寄存器确认TESOC时钟域已开启。2. 在触发断电前通过读PRCM的电源状态寄存器确认目标域是否已进入OFF或RET状态。3. 仔细核对TRM中目标域的下电序列确保每一步都正确特别是静态依赖关系的解除。IPU自测试后系统“死机”无法恢复。1. 未设置TESOC_LAST_RESET_INDICATOR和ROM_CPUx_BRANCH。2. TESOC中断未配置为IPU唤醒源。3. 跳转地址错误或不可执行。1. 检查在触发测试前是否正确写入了指示器和跳转地址寄存器。2. 检查IPU_WUGEN_MEVTx寄存器确认对应的TESOC中断位已被置位。3. 确保跳转地址是有效的、已初始化的内存地址通常是OCMC或DDR中已加载的代码段。测试结果误报失败尤其是MBIST。1. 被测模块未运行在额定频率OPP_NOM。2. DSP等核心在测试前未正确初始化或下电残留信号干扰。3. 测试过程中发生了不可屏蔽中断NMI或其他系统事件。1.确保在启动MBIST前通过DVFS API将目标模块的时钟设置为标称频率。这是最容易被忽略的一点2. 参考TI勘误表和建议在测试DSP前确保其已被PRCM完全下电复位。3. 在测试关键阶段暂时禁用全局中断。切片结果读取有误显示全部通过但感觉不可信。未正确解析结果将未执行的切片也当成了“通过”。严格使用TESOCGetAdvanceResultAPI并按照4.1节第8步描述的流程只判断状态为已完成的配置切片的结果。自己遍历寄存器时务必从LSB到MSB遇到失败或状态非“完成”即停止。诊断切片Diagnostic Slice失败。这是预期行为LBIST的诊断切片设计就是会“故意失败”以验证TESOC的错误检测功能是否正常。如果诊断切片报告失败说明TESOC的故障检测机制是工作的。你应该检查这个失败是否被正确记录。如果诊断切片报告通过反而可能意味着TESOC功能异常。调试技巧善用寄存器查看在调试器如CCS中实时监控TESOC的关键寄存器BUSY,INTR_STATUS,SLICE_STATUS,SLICE_RESULT以及PRCM的相关电源状态寄存器。分步测试先从一个最简单的域如IPU的LBIST开始使用完整的默认切片确保基础流程跑通。再逐步增加MBIST、多切片、多域测试。利用SBL参考代码TI Processor SDK中的SBLSecondary Boot Loader源码是学习TESOC使用的最佳范例。特别是sbl_tesoc.c等文件包含了完整的配置、执行和结果处理流程。时间测量用高精度定时器如CPTS或GPT测量从触发测试到收到中断的实际耗时与手册中表4的理论值对比可以辅助判断测试是否正常执行完毕。5. 集成到安全生命周期与最佳实践将TESOC集成到产品中不仅仅是调用几个API更需要将其融入整个功能安全生命周期。1. 测试策略定义启动时哪些核心必须测试测试完整性全部切片还是部分顺序如何运行时是否启用如果启用触发条件是什么空闲时间阈值、周期定时、特定事件上下文保存/恢复方案是什么关机和启动间如何存储和传递测试结果2. 安全机制设计看门狗与超时在等待TESOC测试完成时主控核心应设置看门狗。如果测试超时未返回应触发安全恢复流程如系统复位。结果处理与故障响应根据ISO 26262需要定义不同故障等级对应的响应。例如单次可恢复故障记录到故障日志尝试恢复核心并继续运行。多次故障或关键故障触发降级模式Limp Home如关闭部分ADAS功能仅保留基本驾驶辅助。启动时关键故障阻止系统启动通过仪表盘提示用户检修。测试完整性验证定期如每24小时或每次点火循环运行一次包含诊断切片的完整测试以验证TESOC自身功能的完好性。3. 性能与开销权衡时间开销表4给出了每个域完整测试的耗时IPU约4msDSP约14ms。你需要评估这些时间开销是否在你的启动时间预算内。如果超标考虑延迟启动或切片化测试。内存与代码开销TESOC驱动和测试调度逻辑会占用一定的Flash和RAM空间。在资源紧张的单核MCU上集成时需要考量。我个人在实际项目中的体会是TESOC的集成是一个“细活儿”。它不像普通的驱动加载就能用。你需要仔细阅读勘误表Silicon Errata特别是其中关于DSP测试前必须下电的说明你需要精确地控制电源序列你需要妥善处理IPU自测试后的快速启动你更需要设计一套健壮的结果监控和故障处理框架。第一次成功跑通IPU自测试并看到系统快速恢复时那种成就感是巨大的因为它意味着你为系统的可靠性打下了一根坚实的地基。记住在功能安全的世界里没有“差不多”只有“正确”和“错误”。每一个配置位每一个状态检查都关乎最终产品的安全等级。