1. 项目概述与核心价值在嵌入式系统尤其是像飞思卡尔MSC8251这样的高性能多核数字信号处理器设计中系统复位后的初始配置是决定整个硬件平台能否正确启动并进入预期工作状态的第一步也是最关键的一步。这个过程远不止是给芯片“通个电”那么简单它更像是在芯片“开机”瞬间由硬件自动执行的一段“开机自检”加“初始设置”程序。这段程序的核心就是复位配置字。复位配置字通常被称为RCW是一组在芯片上电或硬复位时被锁存并生效的配置数据。它定义了处理器最底层的硬件行为系统时钟从哪里来、以什么频率运行高速串行接口是工作在PCIe模式还是RapidIO模式速率是多少哪些引脚被复用为以太网口哪些用作TDM总线甚至决定了系统从哪个接口启动、设备在总线上的ID是什么。可以说RCW是芯片硬件行为的“基因编码”。对于MSC8251这样集成了多个DSP核心、高速SerDes、网络加速引擎的复杂SoCRCW的配置直接关系到整个系统的性能、稳定性和功能实现。一个配置错误的RCW轻则导致外设无法识别、通信失败重则让系统根本无法启动给调试带来巨大困难。因此深入理解MSC8251的RCW加载机制和编程模型不仅仅是阅读手册的例行公事而是每一位负责底层驱动、BSP开发或硬件设计的嵌入式工程师必须掌握的“内功”。本文将从实际工程角度出发结合手册中的技术细节为你彻底拆解MSC8251的复位配置流程。我会详细解释五种不同的RCW加载方式I2C EEPROM、复用引脚、精简引脚、硬编码各自的适用场景、硬件连接和时序要求并深入剖析RCWLR和RCWHR这两个核心寄存器的每一个关键字段。更重要的是我会分享在真实项目中配置和调试RCW时积累的经验、常见的“坑”以及排查问题的思路让你不仅能看懂手册更能玩转配置为你的MSC8251项目打下最坚实的地基。2. RCW加载机制深度解析MSC8251提供了五种灵活的RCW加载方式由芯片复位期间采样到的RCW_SRC[0:2]这三个输入引脚的电平状态决定。这五种方式各有优劣适用于不同的开发阶段和产品形态。理解它们的工作原理是进行正确硬件设计和软件配置的前提。2.1 RCW加载源选择与复位时序在系统上电或PORESET上电复位信号有效时MSC8251会采样RCW_SRC[0:2]引脚的状态这个采样值不仅决定了RCW的来源也影响了整个复位序列的持续时间。复位序列时长分析手册中的Table 5-4提供了关键信息。以常见的100MHzCLKIN时钟为例当RCW_SRC为000011100101时复位序列持续17426个CLKIN周期约0.174毫秒。这些模式对应从外部引脚加载或使用硬编码配置过程相对简单快速。当RCW_SRC为001或010时复位序列长达255156个CLKIN周期约2.552毫秒。这两种模式对应从I2C EEPROM加载RCW。时间长的原因在于芯片需要启动内部的I2C引导序列器通过I2C总线从外部EEPROM中读取数据这个过程涉及总线通信和协议处理耗时自然更长。注意这里的复位序列时长特指从PORESET信号撤销到HRESET信号撤销之间的时间。SRESET软复位信号会在HRESET撤销后再延迟21或36个周期才撤销。在设计复位电路或编写启动代码时必须确保在HRESET有效期间完成所有必要的硬件初始化并等待足够长的时间让RCW加载完全生效才能进行下一步操作。五种加载模式速览RCW_SRC 001 或 010从I2C EEPROM加载。这是最灵活、最常用的生产模式。配置数据存储在外部EEPROM中易于在板卡生产后通过编程器或在线更新进行修改无需改动硬件。RCW_SRC 000从外部复用引脚加载。将64位RCW的全部数据通过16根数据线RC[15:0]分四次通过4个RCW_LSEL选通信号锁存进来。这种方式硬件连接稍复杂但无需外部存储器适用于对成本敏感且配置固定的场景。RCW_SRC 011从外部精简引脚加载。仅通过部分引脚RC[21:10]和RC[3:0]输入有限的配置信息如SerDes参考时钟、启动端口等其余位使用芯片内部的硬编码默认值。这是引脚复用和默认配置的折中方案。RCW_SRC 100 或 101使用硬编码默认配置。芯片使用内部预烧录的两组固定RCW值之一。这是最简单的模式无需任何外部电路但配置完全固定仅适用于原型验证或极其特定的应用。2.2 从I2C EEPROM加载的工程实践这是最复杂但也最强大的模式支持单设备和多设备系统。其核心是利用芯片内部的I2C引导序列器在HRESET仍有效期间即内核还未运行前自动完成EEPROM数据的读取。2.2.1 单设备加载电路与流程硬件连接相对直接如图5-4所示。关键点在于STOP_BS引脚必须在上电复位期间被拉低以告知芯片“你是主设备且需要从EEPROM加载”。EEPROM的I2C从地址必须设置为0b10100000x50。EEPROM数据格式详解这是最容易出错的地方。I2C引导序列器对EEPROM中的数据格式有严格要求前导码必须是连续的3个字节0xAA,0x55,0xAA。芯片会校验这个“魔数”错误则加载失败系统会卡在复位状态。保留字节在每个配置字RCW数据之前必须有3个字节的保留字段其值必须为0xFF。这不是有效数据而是格式占位符。配置字数据紧接着保留字节的4个字节才是真正的32位RCW数据高位在前大端序。数据结构总共需要读取两个这样的“保留字配置字”数据结构分别对应RCWLR低字和RCWHR高字。因此一个完整的、有效的EEPROM数据映像应该是这样的假设RCWLR0x12345678 RCWHR0x9ABCDEF0地址: 数据 (Hex) 0x0000: AA 55 AA // 前导码 0x0003: FF FF FF // 第一个RCWRCWLR前的保留字节 0x0006: 12 34 56 78 // RCWLR 数据 (32位) 0x000A: FF FF FF // 第二个RCWRCWHR前的保留字节 0x000D: 9A BC DE F0 // RCWHR 数据 (32位)实操心得务必使用支持二进制编辑的编程器或软件来准备这个EEPROM映像。常见的错误包括忘记前导码、保留字节填0、数据顺序弄反小端序、或者只烧录了数据而没烧录前导码和保留字节。在焊接前最好用编程器单独验证一下EEPROM的内容是否符合这个格式。2.2.2 多设备加载主从模式与“菊花链”在由多个MSC8251组成的系统中例如多核处理板卡为了节省EEPROM和布线可以采用一个EEPROM为多个设备提供RCW。这时就需要区分复位主设备和复位从设备。复位主设备它的STOP_BS引脚在复位期间被拉低。它负责首先读取自己的RCW然后扮演一个“虚拟EEPROM”的角色。复位从设备它们的STOP_BS引脚在复位期间通过上拉电阻保持高电平。它们会等待主设备释放其STOP_BS信号后才尝试从I2C总线读取自己的RCW并且它们使用的从地址是0b10101110x57。多设备加载流程三阶段主设备自加载上电后复位主设备STOP_BS0像单设备一样从地址0x50的EEPROM中读取自己的RCW。同时它通过硬件逻辑图5-5中的Decoder保持所有从设备的STOP_BS为高使其I2C控制器处于空闲状态。主设备读取从设备配置主设备完成自加载并退出复位后其运行的内核代码通常是BootROM或用户预加载的引导代码需要主动去EEPROM中读取所有从设备的RCW数据并存储在自身内存中。主设备模拟EEPROM并释放从设备主设备将自己的I2C控制器配置为从模式模拟一个地址为0x57的EEPROM。然后它按照预定的顺序通常与硬件连接顺序一致依次将对应从设备的STOP_BS信号拉低再释放。当一个从设备的STOP_BS被释放后它会立即尝试从地址0x57读取RCW而此时主设备就将之前存储的对应从设备的RCW数据返回给它。如此循环直到所有从设备都获得配置。避坑指南多设备加载的硬件设计和软件配合非常关键。首先所有设备的RCW_SRC配置必须相同。其次从设备的STOP_BS上拉电阻阻值需要参考数据手册确保稳定高电平。最重要的是复位主设备中运行的引导代码必须实现上述第2、3阶段的逻辑否则从设备将永远等不到自己的RCW而启动失败。飞思卡尔通常会提供参考的BootROM代码或示例务必仔细研究。2.3 从外部引脚加载的硬件设计考量当选择从外部引脚加载时硬件电路的设计直接决定了RCW的值。复用引脚模式RCW_SRC000此模式使用16根数据线RC[15:0]和4根通道选择线RCW_LSEL[0:3]由RC[20:17]复用而来来传输64位RCW。其工作原理类似于一个4选1的复用器RCW_LSEL0有效时RC[15:0]被锁存为RCWLR[15:0]。RCW_LSEL1有效时RC[15:0]被锁存为RCWLR[31:16]。RCW_LSEL2有效时RC[15:0]被锁存为RCWHR[15:0]。RCW_LSEL3有效时RC[15:0]被锁存为RCWHR[31:16]。设计时你需要用FPGA、CPLD或简单的逻辑电路如锁存器来产生这4个选通信号并按照正确的时序参考手册图5-2将RCW的四个16位片段依次送到RC[15:0]总线上。这种方式硬件成本比I2C EEPROM高但速度最快且配置在硬件层面完全固定。精简引脚模式RCW_SRC011此模式是复用引脚模式的简化版。你只需要通过RC[21:10]和RC[3:0]这16个引脚输入部分关键配置其余位采用芯片内部的硬编码值。具体映射关系见手册Table 5-5和Table 5-6。 例如RC[14]同时决定了SerDes1和SerDes2的参考时钟SCLK1和SCLK2RC[13:10]决定了MODCK的低4位高2位固定为0。这种模式适用于那些只需要改变少量关键参数如时钟、启动端口其他配置接受默认值的场景可以节省引脚和外部电路。2.4 硬编码默认配置的适用场景当RCW_SRC[0:2]设置为100或101时芯片使用内部预定义的两组RCW值。这两组值在手册Table 5-7和Table 5-8中有明确定义。RCW_SRC100MODCK字段为000000。RCW_SRC101MODCK字段为000001。这两组配置通常将SerDes端口预设为常用的模式如Port1为4x RapidIO 3.125GHz Port2为PCIe 1x SGMII并启用RGMII以太网。硬编码模式的最大价值在于芯片调试和最小系统验证。当你刚刚拿到一块新板卡EEPROM还没编程或者外部引脚电路还没调试通时可以通过将RCW_SRC引脚设置为100或101让芯片以一个“已知良好”的配置启动。这样你至少可以通过默认的调试接口如UART如果已连接与芯片通信为后续的完整配置和驱动加载创造条件。它相当于芯片的“安全模式”。3. 复位配置字寄存器详解与配置策略RCW被加载后其值会被映射到两个只读的内存映射寄存器RCWLR和RCWHR。软件可以通过读取这些寄存器来确认当前的硬件配置。理解每个字段的含义是进行正确系统设计的基础。3.1 RCWLR关键字段配置指南RCWLR主要控制系统时钟、SerDes协议等底层硬件配置。3.1.1 时钟输出与模式配置CLKO (Bits 31-30)选择CLKOUT引脚输出的时钟源。这对于为板卡上其他芯片提供同步时钟非常有用。例如选择00输出PLL0分频后的时钟。MODCK (Bits 5-0)这是最重要的字段之一它定义了系统的时钟操作模式直接关系到内核、总线、外设的时钟频率和分频比。必须根据你输入的CLKIN频率以及期望的内核频率查阅手册第7章“Clocks”中的表格精确计算并设置此值。一个错误的MODCK值会导致系统时钟紊乱无法启动。3.1.2 SerDes协议与参考时钟配置S1P (Bits 23-20)和S2P (Bits 28-24)分别配置SerDes Port 1和Port 2的协议。这是RCW配置的核心决定了这两个高速串行端口是作为PCIe、RapidIO还是SGMII用于千兆以太网来使用。重要提示手册Note明确指出虽然可以编程让两个端口的S1P和S2P字段都选择SGMII1或SGMII2但芯片内部的多路复用器最终只将两个物理连接路由到QUICC引擎控制器。如果S1P和S2P都配置了SGMII那么SGMII1如果被选中总是连接到SerDes Port 1SGMII2总是连接到Port 2。这意味着你不能通过配置让Port 1输出SGMII2。设计硬件原理图时必须根据这个固定的映射关系来连接PHY芯片。SCLK1 (Bit 16)和SCLK2 (Bit 17)选择SerDes Port 1和Port 2的参考时钟频率可选100MHz或125MHz。关键限制手册强调100MHz参考时钟可以用于除了3.125 Gbaud RapidIO之外的所有协议和频率。而125MHz参考时钟则适用于所有情况没有例外。因此如果你的设计中需要使用3.125Gbps的RapidIO则必须为对应的SerDes端口提供125MHz的参考时钟并将此位设置为1。这是一个硬性规定违反会导致链路训练失败。3.2 RCWHR关键字段配置指南RCWHR主要控制启动、设备标识和高级功能。3.2.1 启动与设备标识BPRT (Bits 27-24)启动端口选择。这个字段决定了芯片在复位后从哪个接口去获取并执行后续的引导代码如U-Boot。选项非常丰富包括I2C、SPI、RapidIO、RGMII和SGMII。例如选择0101表示从SGMII1接口启动不带I2C。如果你选择RapidIO作为启动端口必须确保对应的SerDes端口S1P/S2P被配置为有效的RapidIO协议。DEVID (Bits 8-3)设备ID。在多设备系统中如多核板卡或RapidIO网络这个6位ID用于唯一标识本设备。主设备或设备0的ID通常为0从设备则为1-63。这个ID会被用于RapidIO通信中的源/目标ID寻址至关重要。RM (Bit 18)复位主设备标志。在从I2C EEPROM启动的多设备系统中必须将一个且仅一个设备的此位设置为1其他设备设置为0。3.2.2 外设与接口配置GE1 (Bit 12)和GE2 (Bit 11)这两个位控制引脚复用。MSC8251的某些引脚可以在TDM时分复用接口和RGMII千兆以太网接口之间复用。GE10对应的引脚用作TDM2和TDM3。GE11对应的引脚用作RGMII1。GE2同理控制TDM0/TDM1与RGMII2的复用。你需要根据板卡实际连接的物理设备是TDM编解码器还是以太网PHY来正确设置此位。RIO (Bit 23)RapidIO主机访问使能。当此位置1时许系统启动后通过RapidIO接口访问本设备的内存。这在多处理器共享内存的系统中常用。RPT (Bit 22)RapidIO直通使能。这涉及到RapidIO交换功能。如果此位置1则本设备可以作为一个简单的RapidIO交换机将从一个端口收到的据包转发到另一个端口。3.3 寄存器配置实战一个典型网络处理配置示例假设我们要配置一个MSC8251用于网络处理应用SerDes Port 1作为4x RapidIO 3.125 Gbps接口用于连接其他处理器或交换芯片。SerDes Port 2配置为PCIe 1x SGMII1 SGMII2模式其中PCIe用于连接主机两个SGMII用于连接两个千兆以太网PHY。时钟CLKIN为100MHz内核需要运行在较高频率查表后设置MODCK为0x0A。SerDes参考时钟使用125MHz以支持3.125G RapidIO。启动从SPI Flash启动。设备ID设为0主设备。引脚复用使能GE1和GE2将引脚用于RGMII以太网。根据手册Table 5-9和5-10我们可以计算出RCW的值RCWLR:CLKO00,S2P01010(PCIe 1x/SGMII1/SGMII2),S1P0011(RapidIO 4x 3.125 GHz)SCLK21(125MHz),SCLK11(125MHz)MODCK001010(0x0A)假设其他保留位为0PLL1DIS0。计算过程S2P占5位(28:24)值010100x0AS1P占4位(23:20)值00110x3。需要将它们移位到正确位置。最终RCWLR 0x0000_0A31 | (0x0A 24) | (0x3 20) | (117) | (116) | (0x0A)。需要仔细按位计算。RCWHR:BPRT0011(SPI启动)RIO1,RPT0,RHE0RM1(假设是单设备或主设备)GE11,GE21DEVID000000CTLS1(大型系统通用传输)最终RCWHR 0x0180_0C40(此为示例需精确计算)。得到这两个32位值后你就可以按照第2章描述的方式将其编程到EEPROM或设置为外部引脚电平。注意事项手动计算RCW值极易出错特别是位域移位和合并。强烈建议使用飞思卡尔官方提供的配置工具如CodeWarrior内的配置工具或独立的RCW配置器来生成RCW值。这些工具通常有图形化界面你只需勾选所需功能工具会自动生成正确的十六进制值和对应的EEPROM二进制文件并能导出C头文件供软件读取验证可以避免大量低级错误。4. 复位状态与控制寄存器编程模型除了配置寄存器MSC8251还提供了一组用于监控复位状态和发起软件复位的寄存器位于基地址0xFFF24800。这些寄存器在驱动开发和系统调试中非常有用。4.1 复位状态寄存器系统诊断的“黑匣子”RSR寄存器是一个“粘性”状态寄存器它记录了自上次上电复位以来发生的所有复位事件。所谓“粘性”是指这些状态位一旦被置位就会一直保持直到你向该位写入1才能清除写入0无效。这就像一个飞行数据记录仪帮你追溯系统发生了什么问题。关键状态位解析RCWSRC (Bits 31-29)只读字段存储了本次启动时采样的RCW_SRC[0:2]引脚值。软件可以通过读取它来确认RCW是从哪个源加载的用于诊断配置加载问题。SW0-SW7 (Bits 23-16)8个看门狗定时器超时标志。如果某个看门狗超时导致复位对应的位会被置1。BSF (Bit 14)引导序列失败标志。如果从I2C EEPROM加载RCW失败如前导码错误、I2C通信失败此位会被置1。这是排查I2C启动问题的第一线索。SWSR (Bit 13),SWHR (Bit 12),HRS (Bit 0),SRS (Bit 1)分别指示软件软复位、软件硬复位、硬复位事件、软复位事件是否发生。注意一次看门狗复位会同时触发硬复位和软复位流程因此SWx、HRS和SRS可能同时被置位。RM (Bit 11)只读指示本设备在当前系统中是否是复位主设备。使用场景当系统异常复位后在初始化代码中尽早读取并保存RSR的值然后清除状态位。通过分析这些位可以判断复位原因是看门狗、软件触发、还是外部信号抑或是RCW加载失败从而快速定位问题根源。4.2 复位控制与保护寄存器安全的软件复位RCR寄存器允许运行在核心上的软件主动发起一次软复位或硬复位。这是一个非常强大的功能但也非常危险——误写此寄存器会导致系统立即复位可能造成数据丢失或事务中断。为了防止意外写入芯片设计了RPR和RCER寄存器进行保护。使能写操作要向RCR写入必须首先向RPR寄存器写入特定的解锁值0x52535445ASCII码“RSTE”。这个操作会同时设置RCER[CRE]位为1表示RCR可写。发起复位在RCR可写后向SWSR位写1发起软复位或向SWHR位写1发起硬复位。禁用写操作向RCER[CRE]位写1可以再次禁用对RCR的写操作增加安全性。软件复位流程示例C语言伪代码// 假设寄存器基地址已定义 #define RPR (*(volatile uint32_t *)(0xFFF24818)) #define RCR (*(volatile uint32_t *)(0xFFF2481C)) #define RCER (*(volatile uint32_t *)(0xFFF24820)) void trigger_software_reset(void) { // 1. 解锁复位控制寄存器 RPR 0x52535445; // 写入“RSTE” // 2. (可选) 确认已解锁 // while ((RCER 0x1) 0); // 等待CRE位被置1 // 3. 发起软复位 RCR 0x1; // 写入1到SWSR位bit 0 // 执行此语句后芯片将立即开始软复位流程下一条指令永远不会被执行 }严重警告如手册Note所述通过RCR发起复位时设备会立即进入复位模式当前正在进行的总线事务例如这次写RCR的传输可能无法正常终止。如果是由一个外部主机如另一个处理器来发起此复位必须充分考虑后果确保不会破坏系统其他部分的状态。通常软件复位操作应由本设备内核在可控条件下发起。5. 常见问题排查与调试心得基于多年的项目经验MSC8251的复位配置环节是问题高发区。下面将常见问题、排查思路和调试技巧整理成表并提供一些实战心得。5.1 RCW加载失败问题排查表问题现象可能原因排查步骤与解决方法系统无法启动停留在复位状态。1.RCW_SRC引脚电平错误。2. I2C EEPROM数据格式错误或内容为空。3. I2C EEPROM硬件连接问题地址、上拉电阻。4. 从引脚加载时时序或电平不满足要求。1. 用示波器或逻辑分析仪测量RCW_SRC[0:2]在PORESET有效期间的电压确保电平稳定且符合预期模式。2. 将EEPROM拆下用编程器读取内容核对前导码0xAA55AA、保留字0xFFFFFF以及RCW数据是否正确。这是最高频的问题点。3. 检查I2C总线的SDA、SCL线上拉电阻通常4.7kΩ是否焊接测量EEPROM的地址引脚电平是否与预期地址匹配0x50或0x57。4. 对于引脚加载用逻辑分析仪捕获RCW_LSEL和RC信号对照手册图5-2检查时序是否符合要求建立/保持时间。系统能启动但SerDes链路无法训练成功如PCIe链路不到Gen1 RapidIO链路不UP。1. SerDes参考时钟SCLK1/2频率或质量不达标。2.S1P/S2P协议配置错误。3. PCB布线不符合高速信号要求。1.首要检查确认为SerDes提供的参考时钟是100MHz还是125MHz并与RCWLR中SCLK1/2位的设置严格一致。用频谱仪测量时钟频率和抖动。2. 读取RCWLR寄存器确认S1P/S2P字段值是否与硬件设计是PCIe还是RapidIO匹配。3. 检查PCB的SerDes差分对是否做到阻抗控制通常100Ω、等长、远离干扰源。多设备系统中从设备启动失败。1. 主从设备RCW_SRC设置不一致。2. 从设备STOP_BS引脚上拉不足或主设备控制逻辑错误。3. 主设备引导代码未实现多设备加逻辑。1. 确认所有设备的RCW_SRC引脚配置相同。2. 测量从设备STOP_BS引脚在复位期间的电压确保为稳定的高电平0.7*VDD。检查主设备控制STOP_SLV_BS的逻辑电路或GPIO代码。3.这是关键确保运行在主设备上的引导代码BootROM或你的二级引导程序包含了读取从设备RCW并模拟EEPROM响应的逻辑。参考飞思卡尔提供的示例代码。软件读取的RCWLR/RCWHR值与预期不符。1. RCW源配置错误实际加载了非预期的配置。2. 寄存器映射地址或访问方式错误。3. 芯片版本差异。1. 读取RSR[RCWSRC]确认实际加载源。与RCW_SRC引脚设置对比。2. 确认使用正确的寄存器基地址0xFFF24800进行访问。确保内存控制器已初始化对该地址空间的访问能到达目标。3. 核对芯片数据手册的修订版本确认寄存器定义是否有更新。5.2 调试技巧与最佳实践利用硬编码模式进行“最小化”调试在新板卡首次上电时优先将RCW_SRC设置为100或101使用芯片内部硬编码配置。这样可以排除外部EEPROM或配置电路故障的影响先让芯片跑起来。通过调试串口如果默认配置支持打印信息确认内核和基础外设工作正常。编写RCW验证代码在系统初始化早期添加代码读取并打印RCWLR、RCWHR和RSR的值。将这些值与你的预期配置进行对比。可以将这些值以十六进制形式通过串口输出或者存储在某个共享内存区域供调试工具读取。这个简单的步骤能为后续调试节省大量时间。关注电源时序和复位信号MSC8251对电源轨的上电顺序和复位信号PORESET,HRESET的时序有严格要求。确保电源管理芯片的时序符合数据手册中的Power-On Reset序列要求。PORESET必须在所有核心电源稳定后保持足够长时间的低电平。使用示波器多通道同时测量关键电源电压和复位信号是排查疑难杂症尤其是偶尔启动失败的终极手段。EEPROM编程的可靠性批量生产时确保EEPROM编程流程可靠。除了校验数据建议在编程后增加一道“回读比对”的工序。对于I2C EEPROM注意其写周期时间连续写入多个字节时需要在页写结束后等待足够的时间通常5-10ms再进行下一步操作或验证否则回读可能得到旧数据。文档与版本管理将最终确定的RCW值、对应的EEPROM二进制文件、以及生成该RCW的配置工具截图或配置文件纳入正式的硬件设计文档和软件版本库。任何对硬件配置的修改都必须同步更新这些记录。这在团队协作和后期维护中至关重要。复位配置是MSC8251系统设计的基石看似繁琐的细节背后是确保复杂SoC按设计意图正确初始化的保障。花时间彻底理解它在调试时就能有的放矢而不是盲目地尝试。记住一个稳定的启动配置是整个项目成功的一半。