瑞萨RA8M2双核架构与CoreSight调试实战解析

📅 2026/6/28 13:52:48
瑞萨RA8M2双核架构与CoreSight调试实战解析
1. 项目概述为什么需要深入了解RA8M2的双核与调试系统如果你正在为下一个嵌入式项目选型或者已经拿到了瑞萨RA8M2的开发板那么你很可能已经听说过它那颗强大的“心脏”——由Arm Cortex-M85和Cortex-M33组成的双核处理器。但数据手册上密密麻麻的寄存器列表和功能框图是不是让你觉得有点无从下手别担心今天我们就抛开那些官方的、教科书式的描述从一个一线开发者的角度来彻底拆解RA8M2的CPU与调试架构。我会告诉你这些技术规格到底意味着什么在实际开发中你会遇到哪些坑以及如何真正发挥出这套硬件的全部潜力。RA8M2瞄准的是那些对性能和安全有双重严苛要求的场景比如需要运行复杂算法如机器学习推理、高级电机控制同时又必须保障功能安全的工业设备或者需要同时处理实时控制与高层级应用协议如无线通信栈、图形界面的智能物联网终端。它的核心价值就在于通过Cortex-M85和Cortex-M33这一高一低的组合实现了性能与能效、通用计算与实时控制的完美分工。而与之配套的CoreSight调试系统则是你能否高效驾驭这颗复杂芯片的关键。理解它你就能精准定位最难缠的Bug优化最底层的性能瓶颈不理解它你可能连程序为什么跑飞了都找不到原因。接下来的内容我会假设你已经有了一定的Arm Cortex-M开发经验至少玩过M3/M4/M7这类单核MCU。我们将一起深入内核看看M85的Helium向量扩展MVE到底能带来多少性能红利双核之间如何优雅地“打招呼”与协同工作以及面对那套复杂的、带安全认证的调试系统时如何配置你的调试器才能既安全又高效。这不仅仅是技术规格的罗列更是我踩过无数坑之后总结出的实战指南。2. 核心架构深度解析M85与M33如何分工协作拿到一颗双核MCU第一个问题永远是这两个核心到底谁干什么活RA8M2的答案非常清晰CPU0 (Cortex-M85) 是性能担当CPU1 (Cortex-M33) 是实时与安全卫士。这种分工不是随意的而是基于两者架构特性的深思熟虑。2.1 Cortex-M85性能怪兽的细节与考量M85是Arm在Cortex-M系列中目前的性能巅峰你可以把它理解为M7的全面增强版并首次引入了Armv8.1-M架构和Helium技术MVE M-profile Vector Extension。1. 浮点与向量计算单元FPU MVEM85的FPU支持半精度half、单精度single和双精度double标量浮点运算完全符合IEEE 754-2008标准。这意味着你在做高精度数学运算如PID控制、坐标变换时无需担心精度损失或额外的软件仿真开销。但更关键的是它的MVEHelium。M85支持整数、半精度和单精度浮点的向量操作。简单来说它允许一条指令同时处理多个数据SIMD。例如一个单精度浮点向量加法指令可以一次完成4个float数的相加。这对于音频处理FIR滤波器、图像处理像素运算、传感器数据批处理如IMU数据融合等场景性能提升是数量级的。实操心得编译器支持是关键。你需要使用支持Armv8.1-M架构且开启了Helium优化的工具链如Arm GNU Toolchain或Arm Compiler 6。在代码中对于循环密集的计算尝试使用编译器提供的向量内联函数intrinsics或让编译器自动向量化使用-O3 -mcpucortex-m85 -mfloat-abihard -mfpuauto类似的标志。实测中一个简单的FIR滤波器启用Helium优化后性能提升可达3-5倍。2. 内存子系统Cache与TCM的平衡艺术M85配备了16KB指令CacheI-Cache和16KB数据CacheD-Cache均带ECC校验。Cache对于提升从外部Flash尤其是QSPI内存映射模式执行代码的性能至关重要。但RA8M2更慷慨的地方在于它为M85提供了128KB的ITCM指令紧耦合内存和128KB的DTCM数据紧耦合内存同样带ECC。这里就涉及一个重要的设计抉择什么代码/数据该放TCM什么该放CacheTCM具有确定性的零等待周期访问延迟。它是存放最关键的实时中断服务程序ISR、时间敏感的循环代码、以及需要极低延迟访问的数据如通信缓冲区、控制环状态变量的理想位置。例如一个电机控制的PWM中断服务函数其执行时间必须绝对可预测放在ITCM里能保证无论Cache状态如何其取指速度都是最快的。Cache用于加速对大型、非连续或访问模式不规则的内存区域的访问比如从外部SDRAM中读取大量数据或者执行存储在外部Flash中的大型应用程序代码。Cache是“聪明”的它会根据你的访问模式动态缓存热点数据。在RA8M2中TCM的使能ITCMCR.EN / DTCMCR.EN和ECC的初始化由OFS1.INITECCEN决定是在启动早期由硬件或启动代码完成的且一旦使能不能再改写。这意味着你必须在系统设计初期就规划好TCM的用途。3. 安全与内存保护Armv8-M Security ExtensionM85完整支持Armv8-M安全扩展包括SAU (Security Attribution Unit)8个区域。用于在软件层面定义内存和外围设备的安全属性安全/非安全。这是实现TrustZone for Armv8-M的基础。MPU (Memory Protection Unit)分为安全MPUMPU_S和非安全MPUMPU_NS各8个区域。即使在安全状态下MPU_S也能对安全内存进行进一步的访问规则保护例如防止安全内核代码意外写入关键数据区。4. 调试能力DebugM85的调试组件非常强大是高效开发的保障ETM-M85 (Embedded Trace Macrocell)支持指令跟踪可以记录处理器执行过的指令流。这对于复现复杂的、非确定性的Bug比如由竞态条件引发的故障是无价之宝。DWT (Data Watchpoint and Trace)提供了8个比较器可以设置硬件数据观察点当特定地址的数据被读写时触发调试事件和性能计数如周期计数、指令退役计数。BPU (Breakpoint Unit)8个指令比较器用于设置硬件断点。ITM (Instrumentation Trace Macrocell)用于软件生成调试信息如printf重定向到ITM端口对系统实时性影响极小。2.2 Cortex-M33可靠的实时与安全协处理器CPU1的Cortex-M33是一个经过市场验证的、平衡了性能、能效与安全的处理器。在RA8M2中它扮演着几个关键角色1. 实时任务处理与隔离M33可以专门用于处理高优先级的实时任务如电机控制、数字电源环路、通信协议栈的底层驱动等。通过将实时任务与M85上运行的非实时或复杂应用如用户界面、AI推理在物理核心上分离可以极大地提高系统的实时响应性和确定性。两个核心通过共享内存如通用RAM和硬件信号量进行通信。2. 安全子系统TrustZone的执行者虽然M85也支持安全扩展但在双核系统中一种常见的架构模式是将M33配置为专门的安全核心运行所有的安全敏感代码如加密服务、密钥管理、安全启动验证而M85则运行在非安全世界处理丰富的应用程序。RA8M2的硬件设计支持这种模式CPU1的安全扩展SECEXT可以通过OTP一次性可编程存储器禁用。只有当CPU1的安全扩展被启用时它才能被选为主CPU。这为系统安全架构提供了灵活性。3. 内存子系统差异M33的缓存配置与M85不同分为16KB代码总线缓存C-Cache和16KB系统总线缓存S-Cache。TCM方面它提供64KB的CTCM代码TCM和64KB的STCM系统TCM。这种配置同样强调了实时性和确定性但规模略小于M85反映了其作为“协处理器”的定位。4. 调试组件M33的调试组件ETM-M33, DWT(4个比较器), BPU, ITM与M85类似但可能版本稍旧如ETM为Architecture version 4.2。关键在于两个核心的调试系统是独立的但又可以通过Cross Trigger Interface (CTI)和Cross Trigger Matrix (CTM)联动。这意味着你可以在一个核心上设置断点触发另一个核心也暂停这对于调试双核间的同步问题至关重要。2.3 双核启动与协作机制解析RA8M2的双核启动流程是理解其运行模式的基础。1. 主CPUPrimary CPU选择系统复位释放后默认由CPU0 (Cortex-M85)作为主CPU首先启动。这是由硬件决定的默认行为。但是启动固件命令boot firmware command可以改变这一设置选择CPU1作为主CPU。选择CPU1为主CPU的前提是其安全扩展SECEXT必须被启用。2. 从CPUSecondary CPU的激活主CPU启动后从CPU处于电源门控power gating状态即深度休眠以节省功耗。主CPU需要通过写CPUnACTCSR寄存器n0或1来显式激活从CPU。激活后从CPU的状态由CPUnWAITCR.CPUWAIT位决定如果CPUWAIT1从CPU进入等待状态Wait State。此时主CPU可以安全地将代码和数据预先加载到从CPU的TCM中。这是一个非常重要的优化步骤可以确保从CPU一启动就能以最高速度运行关键代码避免从慢速Flash取指的延迟。如果CPUWAIT0从CPU被激活后立即开始执行程序。3. 向量表基址安全向量表主CPU固定从0x0200_0000开始而从CPU的起始地址由CPUnINITVTOR寄存器指定。这允许两个核心从不同的安全镜像启动。非安全向量表对于两个CPU通常都固定在0x0000_0000。唯一的例外是当CPU1的安全扩展被禁用时其非安全向量表基址也由CPUnINITVTOR决定。这种设计为复杂的双核操作系统如运行FreeRTOS SMP或一个核跑RTOS另一个核跑裸机提供了底层支持。3. 低功耗模式实战Sleep与Deep Sleep的精细控制对于电池供电或高能效要求的设备低功耗设计是必修课。RA8M2的每个CPU都支持Sleep和Deep Sleep两种模式但细节决定成败。3.1 Sleep模式与Deep Sleep模式的区别Sleep模式CPU时钟停止但内部寄存器、Cache和TCM内容保持外设如定时器、通信接口通常继续运行。唤醒延迟极短适用于需要快速响应中断的间歇性工作场景。Deep Sleep模式比Sleep模式更省电。除了CPU时钟停止CPU0的TCM访问会被禁止SysTick定时器也会停止。CPU可能进入电源门控状态对于CPU0取决于CPDLPSTATE设置。唤醒源比特有的Sleep模式更受限只有特定中断和所有复位源能唤醒。关键陷阱看门狗WDT在低功耗模式下的行为。这是最容易出问题的地方。RA8M2有独立看门狗IWDT和各CPU专属的看门狗WDT0/WDT1。它们是否在低功耗模式下继续计数取决于其启动模式和特定的控制位。以CPU0的WDT0为例手册中给出了清晰的逻辑自动启动模式OFS0.WDTSTRT0 0如果OFS0.WDTSTPCTL0 1则当CPU0进入Sleep/Deep Sleep时WDT0停止计数。如果OFS0.WDTSTPCTL0 0则WDT0继续计数。寄存器启动模式OFS0.WDTSTRT0 1如果WDT0.WDTCSTPR.SLCSTP 1则当CPU0进入Sleep/Deep Sleep时WDT0停止计数。如果WDT0.WDTCSTPR.SLCSTP 0则WDT0继续计数。这意味着什么如果你的应用需要进入长时间的Deep Sleep并且希望看门狗暂停以免误复位你必须正确配置上述位。反之如果你希望看门狗即使在低功耗模式下也能作为系统“守夜人”防止软件死锁导致无法唤醒则需要配置为继续计数。配置错误会导致两种后果1) 预期外的系统复位2) 低功耗模式下不必要的功耗浪费看门狗电路仍在工作。避坑指南在编写低功耗管理代码时务必抽象出一个统一的enter_low_power_mode(mode, wdt_behavior)函数。在这个函数里根据传入的wdt_behaviorHALT或CONTINUE和当前看门狗的配置模式去正确设置WDTSTPCTL或WDTCSTPR.SLCSTP位。并在唤醒后根据情况重新初始化看门狗。永远不要假设默认行为。3.2 唤醒源管理从Sleep/Deep Sleep模式唤醒主要依靠中断和复位。中断唤醒需要特别注意在执行WFI/WFE指令前必须正确配置IELSRn寄存器Interrupt Event Link Setting Register将特定的中断源链接到唤醒事件上。不是所有中断都能唤醒Deep Sleep模式需要查阅手册中的表如提到的Table 14.5。复位唤醒包括引脚复位、看门狗复位、软件复位等。需要注意的是如果看门狗在低功耗模式下被配置为停止那么它将无法产生复位信号来唤醒系统。此时必须依赖其他唤醒源如RTC闹钟、外部引脚中断等。双核低功耗协调当双核系统中一个核心进入Deep Sleep尤其是电源门控时另一个核心如果要访问其TCM将会导致访问错误或总线挂起。因此在让一个核心进入深度休眠前必须通过核间通信机制如共享内存中的标志位确保另一个核心不再需要访问其私有资源。4. CoreSight调试子系统从连接到高级追踪RA8M2集成了完整的Arm CoreSight调试架构功能强大但配置也相对复杂。理解它是进行高效调试和性能分析的前提。4.1 调试连接与认证Authentication安全第一为了防止未授权的调试访问RA8M2引入了多级安全保护这是很多传统MCU所没有的。1. 保护等级Protection Level, PL与认证等级Authentication Level, ALPL (软件设置)定义了芯片的调试策略。PL0禁止调试。最高安全级别。PL1允许非安全调试。调试器只能访问非安全资源。PL2允许安全与非安全调试。调试器可以访问所有资源。AL (实际生效的调试权限)通过JTAG/SWD接口进行“挑战-响应”认证后获得。AL0无调试权限。AL1仅非安全调试权限。AL2完全调试权限安全非安全。2. 认证流程的实战影响当你用调试器如J-Link DAPLink连接RA8M2时会发生以下情况芯片首先检查其设备生命周期状态DLM State。如果状态不是OEM例如是RMA返修状态则AL直接由DLM状态决定通常禁止调试AL0。如果DLM是OEM状态则检查PL。如果PL0默认是AL0无权限。此时调试器必须提供正确的AL1_KEY或AL2_KEY在芯片生产时烧录的密钥来完成挑战-响应认证才能提升到AL1或AL2。还有额外的锁定位LCKS和LCKNS可以分别禁止通过认证提升到AL2和AL1。这意味着什么在产品开发的不同阶段你需要不同的策略早期开发/原型阶段可以设置PL2并开放LCKS和LCKNS这样调试器连接即获得完全权限AL2最方便。量产固件测试阶段可以设置PL1并锁死LCKS禁止AL2。这样产线测试工具可以用AL1权限进行有限度的非安全调试和编程但无法触及安全区域保护了核心知识产权。产品出厂后设置PL0并锁死LCKS和LCKNS。此时芯片完全拒绝调试访问除非拥有在工厂烧录的密钥。这提供了最强的防逆向工程保护。配置心得PL、LCKS、LCKNS等位的设置通常通过启动固件命令Boot Firmware Command或操作特定的用户配置区如OFS来完成。务必在开发早期就规划好调试安全策略并编写相应的生产流程脚本。一旦LCKS/LCKNS被锁死通常就不可逆了。3. 软件使能调试绕过认证除了硬件认证RA8M2也支持通过软件直接使能调试。通过设置OFS1.SWDBG 0并设置相应的DBGAUTH0寄存器位如DBGEN0使能CPU0侵入式调试可以直接开启调试功能且不受DLM和PL限制。这为工厂生产测试提供了另一种灵活性。但要注意如果调试功能已通过JTAG/SWD认证启用则无法通过软件禁用。4.2 调试组件详解与使用场景1. 串行线输出SWO与跟踪端口TPIUSWO这是一种单引脚、低速的调试信息输出通道。它常用来输出ITM的 instrumentation trace如printf调试信息和DWT的性能计数数据如CPU周期计数器、异常开销。它的优势是只需要多占用一个引脚与TDO复用成本低。TPIU并行跟踪端口支持最多4位数据线TDATA[3:0]和一位时钟线TCLK。它用于输出高速的ETM指令跟踪流。要捕获完整的指令执行历史必须使用TPIU和外部跟踪捕获设备如ULINKplus J-Trace。RA8M2的TPIU Formatter输出被排除意味着它主要使用SWO进行跟踪输出ETM跟踪数据也通过SWO通道输出需要调试器支持。2. 嵌入式跟踪缓冲区ETF Embedded Trace FIFO这是一个8KB大小的片上跟踪缓冲区。当使用SWO输出跟踪数据但调试器主机来不及实时接收时数据会先暂存在ETF中。这对于在复杂代码段进行短时间、高分辨率的跟踪非常有用可以避免数据丢失。你需要通过CoreSight的TMCTrace Memory Controller组件来配置和使用ETF。3. 交叉触发CTI CTM这是调试双核系统的神器。CTICross Trigger Interface附着在每个CPU上CTMCross Trigger Matrix将它们连接起来。你可以配置当CPU0命中某个断点时通过CTI发送一个触发信号给CTMCTM再转发给CPU1的CTI让CPU1也暂停执行。这在调试双核通信协议、分析竞态条件时极其有效。4.3 调试模式对系统行为的影响开启调试功能尤其是CPU进入调试暂停状态Halting Debug时会影响系统看门狗在OCD Break模式调试器暂停了CPU下如果调试已使能AL1/AL2或软件使能则IWDT和对应的WDTn会停止计数防止系统在调试时被看门狗复位。在OCD Run模式调试器已连接但CPU在运行下看门狗的行为取决于DBGSTOPCR寄存器的设置。你可以选择让看门狗继续运行用于监测后台任务或停止。低功耗模式当CPU尝试进入Deep Sleep或软件待机模式时如果调试功能已使能CoreSight调试组件的寄存器状态会被保持但AHB-AP调试访问端口可能无法响应访问。调试器需要等待MCU退出低功耗模式后才能继续操作。热插拔调试RA8M2支持在不复位系统的情况下连接调试器热插拔但前提是不需要挑战-响应认证即当前AL不是AL0。这在调试已经运行起来的系统时非常方便。但注意在Software Standby和Deep Software Standby模式下不支持热插拔。5. 双核系统开发实战要点与常见问题理解了架构最终要落到代码上。以下是基于RA8M2双核开发的一些核心实践。5.1 内存映射与核间通信IPC设计两个核心共享芯片上的大部分内存如SRAM Flash和外设。你需要精心规划内存布局。链接脚本Linker Script必须为两个核心分别编写链接脚本明确划分各自的代码、数据、堆栈段。尤其要指定TCM区域如ITCMDTCMCTCMSTCM的用途。共享内存区在通用RAM中划出一块区域作为核间通信缓冲区。务必使用MPU或SAU配置该区域为两个核心均可访问且根据安全需求配置安全属性。为了避免数据竞争必须使用硬件支持的同步原语硬件信号量RA8M2可能提供了硬件信号量单元HSEM这是最高效的方式。原子操作利用Cortex-M的LDREX/STREX指令独占访问实现自旋锁。RA8M2的M85和M33不支持全局独占监视器Global Exclusive Monitor因此原子操作仅限于对同一内存地址的访问。对于复杂的IPC建议使用基于共享内存的消息队列并用自旋锁保护队列头尾指针。5.2 启动流程与代码加载一个典型的双核启动顺序如下主CPU默认为CPU0从启动地址0x0200_0000或0x0000_0000取决于安全状态开始执行。通常是执行一级Bootloader或直接跳转到应用程序。主CPU进行基本的系统初始化时钟、电源、必要的外设。主CPU准备从CPU的镜像将CPU1要执行的代码和数据特别是需要放入CTCM/STCM的部分拷贝到共享内存或CPU1的TCM可访问的地址。主CPU写CPU1ACTCSR寄存器的激活位释放CPU1。可选但推荐主CPU检查CPU1的状态并设置CPU1WAITCR.CPUWAIT1让CPU1保持在等待状态。主CPU将准备好的代码/数据加载到CPU1的TCM中。主CPU清除CPU1WAITCR.CPUWAIT位CPU1从它的复位向量由CPU1INITVTOR指定开始执行。两个核心通过共享内存中的标志位进行握手确认启动完成。5.3 调试双核系统的技巧独立与同步调试大多数现代IDE如Keil MDK IAR EWARM Eclipse with PyOCD都支持多核调试。你可以同时连接两个核心分别控制它们的运行、暂停查看各自的寄存器、内存和调用栈。使用交叉触发在调试核间同步问题时不要只在一个核心上设断点。在CPU0访问共享队列的代码处设断点并配置该断点通过CTI触发CPU1也暂停。这样你能立刻看到双方的状态快速定位是生产者太快还是消费者太慢。利用ITM和SWO为两个核心分别配置不同的ITM Stimulus Port如Port 0给CPU0 Port 1给CPU1。这样它们的printf信息会带有来源标记在调试器的终端中清晰可分。性能分析使用DWT的周期计数器CYCCNT来测量两个核心上关键任务的执行时间分析负载是否均衡。使用ETM跟踪功能可以分析CPU0上复杂算法如启用Helium的代码的实际执行路径寻找优化点。5.4 常见问题排查速查表问题现象可能原因排查步骤从CPU无法启动1. 主CPU未激活从CPU (CPUnACTCSR)。2. 从CPU的启动代码未正确加载到其TCM或可访问内存。3. 从CPU的向量表地址 (CPUnINITVTOR) 设置错误。4. 安全配置冲突如CPU1作为主CPU但其SECEXT被禁用。1. 检查主CPU代码中激活从CPU的步骤。2. 使用调试器检查从CPU的TCM/内存内容。3. 核对CPUnINITVTOR寄存器值。4. 检查OTP或启动配置中CPU1的安全扩展设置。双核访问共享数据时出现数据损坏1. 缺少同步机制锁、信号量。2. 缓存一致性问题Cache Coherency。M85和M33的Cache之间不是硬件一致的。1. 引入硬件信号量或软件自旋锁。2. 对于共享数据区使用非缓存Non-cacheable属性进行映射通过MPU配置。或者在核心写入共享数据后执行Cache清理Clean操作在另一个核心读取前执行Cache无效Invalidate操作。系统在低功耗模式下无法唤醒1. 看门狗在低功耗模式下被错误配置为停止且无其他有效唤醒源。2. 唤醒中断未正确链接IELSRn寄存器配置错误。3. 唤醒中断的优先级或使能位未设置。1. 检查WDTSTPCTL或WDTCSTPR.SLCSTP配置。2. 核对进入低功耗模式前对IELSRn寄存器的配置。3. 确认NVIC中对应中断已使能并设置合适优先级。调试器无法连接或连接后无权限1. 芯片处于高安全等级PL0且未通过认证。2. DLM状态非OEM。3. 调试接口引脚SWDIO SWCLK被复用为其他功能。4. 芯片处于Boot模式或FSBL执行阶段此时调试被禁止。1. 确认芯片的PL设置尝试提供正确的认证密钥。2. 检查芯片生命周期状态。3. 检查引脚复用配置确保上电后调试接口功能被正确初始化。4. 确保芯片已进入单芯片模式FSBL已执行完毕。ETM指令跟踪数据不完整或丢失1. SWO引脚带宽不足时钟频率太低。2. 片上ETF缓冲区溢出。3. 调试器跟踪缓冲区设置太小。1. 提高SWO的时钟分频比但受限于最高跟踪时钟。2. 减小跟踪范围如只跟踪特定函数或提高主机接收速度。3. 在调试器软件中增大跟踪缓冲区大小。启用Helium的代码性能未达预期1. 编译器未生成Helium指令编译选项错误。2. 数据未对齐到Helium要求的边界通常为128位对齐。3. 循环结构不利于编译器自动向量化。1. 检查编译命令确保-mcpucortex-m85和-mfloat-abihard等选项已设置并查看反汇编确认。2. 使用__attribute__((aligned(16)))确保数据地址对齐。3. 重构循环避免循环携带依赖、条件分支等或直接使用Helium intrinsics。6. 总结与进阶思考RA8M2的Cortex-M85 Cortex-M33双核架构配合强大的CoreSight调试系统为下一代高性能、高安全性的嵌入式应用提供了一个非常坚实的硬件平台。它不再是简单的两个核心堆叠而是通过精细的安全扩展、差异化的内存子系统、灵活的启动与功耗管理以及专业的调试基础设施构建了一个真正面向复杂系统的解决方案。在实际项目中我的体会是前期架构设计的时间投入会换来后期调试和优化的巨大节省。在写第一行代码之前务必花时间确定好哪个核心负责什么任务它们如何通信安全边界划在哪里关键实时代码和数据放在哪个TCM调试策略和权限如何规划把这些问题的答案形成文档会成为整个团队开发的基石。最后不要畏惧双核和复杂调试功能带来的学习曲线。从单核项目迁移时可以先让一个核心比如M33运行一个简单的、已验证过的实时任务主核心M85运行主应用逐步增加核间交互的复杂性。充分利用IDE的多核调试功能和CoreSight的追踪能力它们是你洞察系统内部状态的最强眼睛。当你习惯了这种开发模式你会发现处理复杂系统的能力得到了质的提升。