深入解析MSC8144E多核DSP复位机制:从PORESET到RCW加载的实战指南
1. 项目概述与核心价值在嵌入式系统开发尤其是涉及复杂多核DSP或SoC的硬件设计时最让人头疼的往往不是算法实现而是系统“起不来”。我见过太多工程师代码写得漂亮硬件焊接无误但一上电芯片就是一片死寂或者运行状态飘忽不定。问题的根源十有八九出在对复位机制的理解不透彻上。复位这个看似简单的“重启”动作在像飞思卡尔MSC8144E这样的高性能多核DSP内部实则是一场精密编排的“交响乐”任何一个音符信号时序或配置位出错整场演出都会失败。MSC8144E的复位系统远不止拉低一个引脚那么简单。它区分了上电复位PORESET、硬复位HRESET和软复位SRESET每种复位触发的内部清理程度和后续流程截然不同。更关键的是芯片在复位阶段如何获取“启动说明书”——即复位配置字RCW这直接决定了处理器内核以何种频率运行、哪些高速SerDes接口被启用、从哪里加载引导程序等核心参数。配置错了轻则性能不达标重则根本无法启动。本文将结合手册内容与我的实际调试经验为你彻底拆解MSC8144E的复位操作。我会从三种复位信号的物理意义与使用场景讲起深入分析上电复位的完整流程时序然后重点剖析RCW的加载机制——无论是从I2C EEPROM、外部引脚还是使用硬编码值并解读关键配置位的含义。最后我会分享如何通过寄存器查看复位状态以及在多设备系统中协调复位的实战技巧。理解这些你不仅能解决“板子不启动”的问题更能优化启动时间实现可靠的系统级冗余设计。2. 三种复位信号深度解析PORESET、HRESET与SRESET很多新手会混淆这三种复位简单认为“都是重启”。但在MSC8144E的架构里它们是分层、分级的作用于不同的逻辑域理解其差异是设计可靠复位电路的前提。2.1 上电复位PORESET系统的“总开关”PORESET是最高级别的复位通常由外部电源监控芯片或RC电路在电源稳定后产生。你可以把它想象成大楼的总电闸。拉下总电闸PORESET有效整栋楼芯片完全断电再上电所有房间寄存器、状态机、I/O都会回到最初的毛坯状态。核心特性与操作要点作用范围最广它初始化芯片内几乎所有逻辑包括时钟单元PLL、配置逻辑、内核、外设以及I/O状态大部分I/O被置为高阻态。配置采样时刻这是唯一会采样RCW_SRC[0:2]和CFG_CLKIN_RNG等复位配置输入引脚状态的复位。芯片通过这些引脚的值决定去哪里读取后续的详细“装修图纸”RCW。因此这些引脚的上拉/下拉电阻必须在PORESET有效期间保持稳定电平。时序要求严格手册要求在外部供电稳定后PORESET信号必须至少保持32个CLKIN时钟周期的低电平。这个时间是为了确保内部电源轨和基础逻辑稳定。在实际设计中我通常会使用专门的复位芯片如TI的TPS3823它能在监测到电源达到阈值后产生一个脉宽可控的低电平复位信号这比简单的RC电路更可靠能避免电源斜坡期间的毛刺导致误触发。与M3_RESET的关联手册特别提到M3_RESET信号用于辅助管理内核的时序应与PORESET保持一致并且需要上拉到VCCMM3IO (2.5V)。在设计PCB时这个上拉电阻不能遗漏且电源域要正确。2.2 硬复位HRESET系统的“大扫除”HRESET可以由外部引脚触发也可以由内部事件如看门狗超时、RapidIO错误产生。它相当于在不停电的情况下命令整栋楼进行一场彻底的大扫除把所有家具寄存器归位但建筑结构已加载的RCW配置、PLL锁定状态保持不变。核心特性与操作要点作用范围HRESET会复位大部分逻辑单元和寄存器但不会重新采样配置引脚也不会重新加载RCW。这意味着系统时钟配置、外设使能等由RCW决定的基础框架在HRESET后保持不变。这对于系统运行时因软件跑飞而需要恢复但又不想改变硬件基础配置的场景非常有用。与SRESET的联动当HRESET被触发时芯片内部会自动同时断言SRESET。也就是说一次硬复位事件实际上会让内核经历一次“硬复位软复位”的清理过程。外部电路HRESET引脚内部通常是弱上拉或需要外部上拉电阻。在释放HRESET从低变高后芯片内部会等待16个CLKIN周期才开始检测外部复位状态。这个设计是为了消除信号振铃确保复位释放的稳定性。2.3 软复位SRESET内核的“重启键”SRESET是影响范围最小的复位主要复位处理器内核和与之紧密相关的部分逻辑而不影响大多数外设和系统级配置。这就像只重启你办公室的电脑而不影响整栋楼的网络和照明。核心特性与操作要点作用范围最小它主要用于恢复内核的执行状态。外设如DMA、串口等可能保持原有状态除非它们也被特定地映射到软复位域。这对于调试、软件热更新或从某些可恢复的错误中跳出非常关键。内部持续时间当SRESET被断言无论是外部引脚还是内部软件触发芯片内部会固定保持SRESET有效512个CLKIN周期然后自动释放。这个固定的时长确保了内核有足够的时间完成复位序列。独立性与应用SRESET可以独立于HRESET发生。在系统运行中如果你想快速重启某个应用程序而不想干扰整个操作系统或外设服务触发一个针对该内核的软复位是常见做法。三种复位对比总结表特性PORESET (上电复位)HRESET (硬复位)SRESET (软复位)触发源外部电源监控电路外部引脚、内部看门狗、软件、RapidIO外部引脚、JTAG、软件配置采样是采样RCW_SRC,CFG_CLKIN_RNG等否否RCW重加载是完整加载否否PLL重锁定是重新锁定否已锁定则保持否影响范围全部逻辑、I/O、时钟、配置除配置逻辑和PLL外的大部分逻辑主要为处理器内核及紧耦合逻辑典型应用初次上电、彻底断电重启系统级错误恢复、软件看门狗复位内核调试、软件模块重启内部保持时间由外部控制至少32 CLKIN由配置加载时间决定固定512 CLKIN周期实操心得复位信号电路设计去耦与滤波复位信号线尤其是PORESET必须靠近芯片引脚放置并搭配100nF的陶瓷电容对地滤波以吸收板级噪声防止误触发。电平兼容确保驱动复位信号的电平与MSC8144E的I/O电压VDDIO兼容。如果使用FPGA或CPLD产生复位需注意电平转换。时序隔离在多芯片系统中若要实现主从芯片的顺序复位可以使用简单的RC延时电路或逻辑门来错开各芯片的PORESET释放时间避免同时启动带来的大电流冲击和总线竞争。3. 上电复位PORESET全流程拆解与实战要点理解了信号分类我们深入最复杂、也最重要的上电复位流程。这是芯片从“硅片”变成“智能设备”的第一步。手册中的图5-1是核心我们结合文字描述和我的调试经验将其转化为可操作的步骤。3.1 完整流程步骤详解假设我们设计了一个电路使用I2C EEPROM型号如AT24C02来提供RCW。以下是芯片视角的启动日记供电与复位断言板卡上电电源芯片输出达到稳定规格。此时复位管理芯片保持PORESET引脚为低电平有效。同时HRESET和SRESET也被内部或外部电路保持为低。时钟与配置稳定我们为芯片提供稳定的CLKIN时钟例如66MHz晶体。同时通过硬件上下拉电阻将RCW_SRC[0:2]设置为001表示从I2C EEPROM加载CLKIN≤44MHz或66-100MHzCFG_CLKIN_RNG根据实际时钟频率设置好。复位释放与采样在电源和时钟稳定至少32个CLKIN周期后外部电路释放PORESET拉高。芯片在PORESET上升沿瞬间“锁存”或“采样”RCW_SRC和CFG_CLKIN_RNG引脚的状态。这是一个关键节点此后改变这些引脚的电平将无效。启动配置加载芯片根据采样到的RCW_SRC知道自己要去I2C总线上找“说明书”。它开始驱动I2C时钟SCL和数据SDA按照特定的地址0b1010000和格式去读取EEPROM中的RCW。PLL锁定与时钟分发当第一个RCWRCW Low被加载后芯片读取其中的时钟配置位如MODCK随即启动系统主PLLPLL0开始锁定。此时HRESET依然被内部保持为低。配置完成与复位释放等待所有必需的RCW加载完毕并且所有PLL系统PLL、核心PLL等都报告锁定Lock后芯片内部释放HRESET变为高阻由上拉电阻拉高。再经过16个时钟周期芯片释放SRESET。就绪状态SRESET释放后内核开始从由RCW指定的引导地址如PCI、I2C或RapidIO获取第一条指令系统正式进入软件可控阶段。3.2 关键时序参数与计算手册表5-3提供了不同配置下的复位序列持续时间从PORESET释放到SRESET释放。这是评估系统启动时间的关键。以从I2C EEPROM加载CLKIN66MHz为例RCW_SRC[0:2]010CFG_CLKIN_RNG0(因为66MHz在44-66MHz范围内)查表得复位序列持续时间 107451个CLKIN周期计算实际时间时间 周期数 / 频率 107451 / 66 MHz ≈ 1628 µs (约1.63 ms)这意味着在这种配置下从上电完成到内核开始执行指令至少需要1.63毫秒。如果你的应用对启动时间有苛刻要求这个时间必须考虑在内。另一种情况使用硬编码配置RCW_SRC100且CLKIN67MHz查表得持续时间 34841个CLKIN周期计算时间34841 / 67 MHz ≈ 520 µs可以看到省去I2C读取过程启动时间缩短了约三分之二。注意事项复位失败排查如果系统卡在复位状态HRESET始终为低RC_LDFReset Configuration Load Fail信号是重要的调试抓手。这个信号在从I2C加载RCW失败时会拉低半个CLKIN周期。你可以用示波器单次触发捕捉这个信号。如果看到RC_LDF有脉冲说明I2C读取失败问题可能在于EEPROM的I2C地址不对不是0x50或0x57。EEPROM中的数据格式错误特别是前导码0xAA55AA或保留字段0xFFFFFF。I2C总线上的上拉电阻缺失或阻值不当导致信号完整性差。STOP_BS引脚电平在复位期间设置错误。4. 复位配置字RCW的加载机制详解RCW是MSC8144E启动的“灵魂”。它是一组32位x2高字和低字的配置数据决定了芯片最底层的硬件行为。加载它的方式灵活多样适应不同成本和复杂度的系统。4.1 RCW的三种来源与硬件连接4.1.1 从I2C EEPROM加载这是最常用、最灵活的方式适用于配置需要频繁更改或产品需要区分版本的场景。硬件连接如图5-5所示将MSC8144E的I2C引脚SCL, SDA连接到EEPROM如AT24C02/04/08。关键点STOP_BS引脚必须在整个上电和硬复位序列期间被外部电路拉低以告知芯片“你是配置的发起者Initiator”。EEPROM数据格式EEPROM中的数据不是随意写入的。它必须遵循严格的格式前导码Preamble3字节固定值0xAA55AA。用于同步和验证。保留字段每个配置字高/低前3字节必须填充0xFFFFFF。配置数据紧接着的4字节才是真正的RCW Low或RCW High数据采用**大端序Big-Endian**存储。地址与协议作为复位发起者芯片使用地址0b10100000x50去访问EEPROM。它只读取前两个数据结构即RCW Low和High读完后I2C模块即进入复位状态直到HRESET释放。4.1.2 从外部引脚加载简化RCW对于成本敏感或配置固定的应用可以使用简化模式。此时RCW_SRC[0:2]设置为011。硬件连接如图5-6所示将17个外部引脚RC[0:16]通过上拉或下拉电阻设置为特定电平。这些引脚在非复位状态下是其他功能的GPIO但在PORESET期间被采样为RCW的一部分比特位。工作原理芯片只从这17个引脚读取部分配置手册表5-6和5-7详细列出了哪些位来自引脚哪些位使用硬编码默认值。例如RC[16]和RC[3]共同决定RapidIO是否使能。这种方式成本最低但灵活性也最差。4.1.3 使用硬编码配置当RCW_SRC[0:2]设置为100,101,110,111时芯片直接使用内部预烧录的四组配置之一。这完全省去了外部元件但配置是固定的由芯片型号决定。你需要查阅芯片的数据手册或勘误表来确定具体是哪组配置。4.2 多设备系统中的RCW加载主从模式在由多个MSC8144E构成的系统中如多核处理板让每个芯片都挂一个EEPROM既浪费成本又增加布线复杂度。MSC8144E支持主从Initiator-Target模式让一个主芯片从公共EEPROM读取所有从芯片的RCW然后模拟EEPROM分发给从芯片。硬件连接如图5-4所示所有芯片的I2C总线SCL, SDA并联到同一个EEPROM。关键在于STOP_BS引脚主芯片Initiator其STOP_BS在复位期间被拉低。从芯片Targets其STOP_BS在复位期间被拉高通常通过上拉电阻。工作流程阶段一主芯片作为复位发起者用自己的地址0x50从EEPROM读取自己的RCW。阶段二主芯片启动后运行一段内置或自定义的引导代码ROM Code。这段代码会再次访问EEPROM读取所有从芯片的RCW数据并存储在自身内存中。阶段三主芯片将自己的I2C控制器配置为“从设备”模式模拟一个地址为0b10101110x57的EEPROM。然后它按顺序依次释放各个从芯片的STOP_BS信号通常通过GPIO控制。阶段四被释放的从芯片开始启动流程它试图从地址0x57的“EEPROM”实际上是主芯片读取自己的RCW。主芯片根据请求将对应的RCW数据返回给从芯片。设计难点这个流程需要主芯片在启动后能正确执行那段分发RCW的代码。这段代码可能存放在主芯片的Boot ROM中也可能需要你通过主芯片的启动接口如PCI提前加载进去。时序协调和错误处理如某个从芯片应答超时是调试的重点。实操心得EEPROM选型与编程容量与地址常用的AT24C02256字节足够存放RCW仅需几十字节。确保EEPROM的硬件地址引脚A0, A1, A2正确接地使其响应0x50地址。编程工具批量生产时建议使用专门的EEPROM编程器在贴片前烧录。在研发阶段可以先将EEPROM焊接到一个转接板上用USB-I2C工具如FTDI的FT232H配合i2c-toolsLinux或类似软件进行烧写和验证。数据验证烧录后务必回读整个EEPROM内容并与生成的二进制文件进行逐字节比对。I2C通信易受干扰一个比特错误就可能导致启动失败。5. 复位配置字RCW关键字段解析与配置实践RCW寄存器RCWLR和RCWHR是只读的它反映了复位期间加载的配置。理解每个字段的含义是进行硬件设计的基础。这里我们分析几个最关键的字段。5.1 RCWLR低字寄存器核心字段CLKO (Bits 31-30)选择CLKOUT引脚输出的时钟源。这对于需要给外围芯片提供同步时钟的场景非常有用。例如设置为00则CLKOUT输出Clock2通常与某个总线时钟相关。SCLK (Bits 22-20)SerDes时钟模式。这是高速串行接口RapidIO, SGMII的基石。它决定了SerDes参考时钟频率和倍频后的线速率。例如001: Ref. Clock 100 MHz, RapidIO/SGMII 1.25 GHz。这是最常见的SGMII千兆以太网配置。100: Ref. Clock 125 MHz, RapidIO 3.125 GHz。用于高速RapidIO互联。配置错误后果如果实际接的晶振是125MHz但SCLK配置为100MHz模式SerDes PLL无法正确锁定导致以太网或RapidIO链路无法建立。RIOE (Bit 19) 1x (Bit 18) SGMII1/2 (Bits 17,16)这三个字段控制SerDes通道的分配。RIOE1使能RapidIO SerDes通道供电。1x1RapidIO使用1x模式单通道1x0为4x模式四通道。SGMII11/SGMII21使能对应的SGMII以太网通道。重要限制SerDes的四个通道是共享的。你不能同时使能所有功能。例如一个典型的分配是通道0和1用于RapidIO 2x通道2和3用于两个SGMII。这需要在RCW中精确配置并确保物理连接一致。SPCI, SDDR, SM3 (Bits 12,11,10)分别为PCI、DDR和M3辅助内核选择时钟源。选择系统PLLPLL0还是全局PLLPLL2会影响这些模块的时钟频率和相位关系需参考时钟树设计。MODCK (Bits 5-0)时钟模式。这是定义内核时钟CCB时钟与输入时钟CLKIN倍频关系的关键字段。它的值决定了PLL的倍频系数。计算方式在时钟章节通常需要根据你期望的内核频率和CLKIN频率来查表设置。5.2 RCWHR高字寄存器核心字段RM (Bit 30)复位发起者模式。在多设备从单个EEPROM加载时必须将此位置1并将BPRT引导端口设置为I2C。对于单设备此位为0。BPRT (Bits 28-23)引导端口选择。这是RCW中最重要的字段之一决定了内核复位后从哪里取第一条指令。000010: 从PCI总线引导默认。001000: 从I2C总线引导常用于无PCI的嵌入式环境。001001: 从RapidIO接口引导用于多处理器集群。010011: 从以太网1MII模式引导。011000: 从以太网1SGMII模式引导注意选择SGMII引导时必须确保RCWLR[1x]位为0即RapidIO为4x模式或禁用因为SGMII和RapidIO 1x模式会冲突。PIN_MUX (Bits 13-10)引脚复用配置。MSC8144E的许多引脚功能是复用的如GPIO、UART、定时器。这个字段决定了第一组复用引脚的功能分配必须在硬件设计前就确定好。DEVID (Bits 9-4)设备ID。在多设备系统中用于区分不同的目标设备。主芯片在模拟EEPROM时会根据请求的从设备ID返回对应的RCW。5.3 配置生成与验证流程确定需求列出所有硬件需求内核目标频率、DDR型号与速度、使用哪些高速接口RapidIO x? SGMII x?、引导方式、引脚复用方案。查阅手册根据需求查阅《Clocks》章节确定MODCK值查阅《External Signals》章节确定PIN_MUX值。填写RCW表格制作一个Excel或文本表格将RCWLR和RCWHR的每个位根据手册描述填好。这是一个细活建议进行交叉检查。生成二进制文件将填写好的64位RCW高32位低32位按照EEPROM格式前导码0xAA55AA 3字节0xFFFFFF 4字节RCW Low 3字节0xFFFFFF 4字节RCW High转换为二进制文件。注意字节序大端。硬件验证在焊接EEPROM前最好能用编程器验证其内容。上电后如果系统能启动可以通过调试器如JTAG读取RCWLR和RCWHR寄存器与你的配置值对比确保完全一致。6. 复位编程模型状态监控与控制系统运行起来后我们有时需要知道“刚才发生了什么复位”或者主动触发一次复位。这就要用到复位相关的内存映射寄存器基地址为0xFFF24800。6.1 复位状态寄存器RSR—— 系统诊断的“黑匣子”RSR寄存器就像一个复位事件记录仪任何原因导致的复位都会在这里留下痕迹。它是累积性的除了上电复位会清零意味着多次复位事件会同时置位多个标志位。关键状态位RSTSRC (Bits 31-29)记录本次启动的RCW来源I2C、引脚、硬编码非常利于判断配置是否按预期加载。RIO (Bit 23)RapidIO接口触发的硬复位。如果这个位被置1说明高速串行链路出现了严重错误需要检查链路训练和信号完整性。SW0-SW4 (Bits 2, 3, 20-22)软件看门狗定时器0-4超时标志。哪个看门狗超时了一目了然便于定位软件任务卡死的位置。BSF (Bit 16)I2C引导序列器失败标志。如果从I2C加载RCW失败此位置1。这是一个“粘性”位需要写1清除。SWSR/SWHR (Bits 13,12)软件触发的软/硬复位标志。JS (Bit 8)JTAG触发的软复位标志。SRS/HRS (Bits 1,0)软/硬复位状态标志。任何软/硬复位事件都会置位它们同样需要写1清除。使用场景系统异常重启后引导程序的第一段代码就应该去读取RSR寄存器将状态值保存到非易失性存储器如SPI Flash的特定区域或通过串口打印出来。这样在后续调试时就能知道上次重启是看门狗导致的还是外部干扰触发了硬复位极大缩短问题定位时间。6.2 复位控制寄存器RCR与使能寄存器RCER—— 主动复位管理除了被动响应软件也可以主动发起复位。RCR (Reset Control Register)向特定的位写1可以触发相应的复位。例如写SWHR位可以发起一个软件硬复位。RCER (Reset Control Enable Register)这是RCR的使能锁。为了防止误写必须先向RCER的对应位写1使能然后在同一个写操作中向RCR的对应位写1才能触发复位。这是一个安全机制。软件复位操作示例伪代码#define RCR_BASE 0xFFF24800 volatile uint32_t *rcr (uint32_t*)(RCR_BASE 0x0C); // RCR偏移0x0C volatile uint32_t *rcer (uint32_t*)(RCR_BASE 0x10); // RCER偏移0x10 // 触发一个软件硬复位 *rcer 0x00001000; // 使能SWHR控制位 (Bit 12) *rcr 0x00001000; // 触发软件硬复位 // 执行完上述两条指令后系统将立即进入硬复位流程注意事项调试接口的复位在进行JTAG调试时调试器可能会发出JTAG软复位通过JS位。这种复位通常不会影响调试连接本身但会复位内核。你需要了解你的调试工具如Lauterbach Trace32, DS-5的复位行为配置避免在单步调试时意外触发全面复位导致失去连接。7. 常见问题排查与实战技巧基于多年的调试经验我总结了一份MSC8144E复位相关问题的排查清单希望能帮你快速定位问题。7.1 问题排查速查表现象可能原因排查步骤上电后无任何反应HRESET一直为低1. RCW加载失败2. 时钟问题3. 电源问题1. 测量RC_LDF信号是否有脉冲。2. 用示波器检查CLKIN是否有稳定时钟幅度频率是否正确。3. 检查所有电源轨电压是否在容差范围内尤其是内核电压和PLL模拟电压。4. 检查PORESET引脚时序是否满足32个CLKIN周期。系统偶尔启动失败概率性1. 电源时序问题2. 复位信号毛刺3. I2C总线干扰1. 用示波器长时间捕获上电时序看电源、时钟、复位信号是否每次都能满足建立/保持时间。2. 检查复位信号线附近是否有高速信号线加强滤波。3. 检查I2C总线的上拉电阻通常4.7kΩSDA/SCL走线是否过长有无串扰。能启动但以太网/RapidIO不工作1. RCW中SerDes配置错误2. 参考时钟错误3. 物理链路问题1. 通过调试器读取RCWLR核对SCLK,RIOE,1x,SGMII1/2等字段。2. 测量SerDes参考时钟引脚如SD_REF_CLK的时钟频率和质量。3. 检查SerDes通道的差分对是否阻抗匹配有无短路/开路。多设备系统中从设备启动失败1.STOP_BS引脚电平错误2. 主设备分发RCW代码未运行3. I2C地址冲突1. 测量从设备STOP_BS引脚在复位期间是否为高电平。2. 确认主设备已成功启动并运行了RCW分发代码。3. 用逻辑分析仪抓取I2C总线看主设备是否在正确模拟地址0x57以及从设备是否发起请求。软件运行时看门狗频繁复位1. 看门狗超时时间设置太短2. 喂狗任务优先级过低或阻塞3. 系统负载过重1. 检查RSR寄存器确认是哪个看门狗超时SW0-SW4。2. 增加看门狗超时周期。3. 提高喂狗任务优先级确保其在任何情况下都能被执行。4. 优化软件性能减少关中断时间。7.2 实战调试技巧“最小系统”法当新板卡第一次上电时先不要连接所有外设。尝试使用最简单的硬编码RCW配置RCW_SRC100等并配置为从I2C引导即使没有EEPROMI2C引导失败后会超时但你能看到芯片尝试访问I2C的SCL/SDA活动。这能排除SerDes、DDR等复杂外设的影响先确认芯片最基本的核心如CCB总线能否启动。善用指示灯在关键信号如PORESET、HRESET、SRESET、RC_LDF上连接LED指示灯通过缓冲器可以直观地看到复位流程进行到哪一步卡住了。逻辑分析仪是利器准备一个支持I2C、SPI协议解码的逻辑分析仪。在上电瞬间捕捉PORESET、HRESET、SRESET的时序关系以及I2C总线上是否有正确的读EEPROM波形前导码0xAA55AA。这比盲目猜测高效得多。寄存器读取验证一旦芯片能通过JTAG或简单的串口调试器连接第一时间读取RCWLR、RCWHR和RSR寄存器。将读出的值与你的预期配置逐位对比任何不一致都是线索。关注电源完整性MSC8144E这类多核DSP对电源纹波非常敏感。在复位和启动阶段用示波器最好带带宽限制功能仔细测量各电源引脚特别是AVDD、SVDD等模拟电源的纹波确保其在数据手册规定的范围内。较大的纹波可能导致PLL无法锁定或逻辑状态异常。