MPC8260 DMA控制器实战:从原理到缓存一致性处理
发布时间:2026/6/15 0:56:56
分类:文化教育
浏览:1234

1. MPC8260 DMA控制器嵌入式数据传输的引擎在嵌入式系统开发尤其是涉及网络通信、高速数据采集或外设管理的场景里CPU被频繁的数据搬运任务拖累是性能瓶颈的常见原因。想象一下你的处理器核心正在处理一个复杂的协议栈却要不断地停下手中的活去把网卡缓冲区里的数据包一个字节一个字节地搬到主内存这无疑是巨大的资源浪费。这时直接内存访问DMA技术就成了救星。它就像一个专职的“搬运工”能在CPU不干预的情况下在内存与I/O设备之间、甚至内存与内存之间高速搬运大块数据。MPC8260 PowerQUICC II处理器作为一款经典的通信处理器其集成的DMA控制器正是为应对此类高吞吐量、低延迟需求而设计的。它不仅仅是简单地在60x总线处理器本地总线上搬运数据更关键的是它内置了PCI桥能够直接驾驭PCI总线实现60x内存与PCI内存空间之间的高效互传。这意味着你可以轻松地将数据从一块PCI网卡直接DMA到处理器的本地内存或者反过来而无需CPU的介入。对于从事网络路由器、基站控制器或工业控制设备开发的工程师来说吃透这个DMA控制器是优化系统性能、确保数据流稳定性的必修课。今天我们就抛开手册式的罗列从一线开发者的视角深入解析MPC8260 DMA控制器的运作机理、寄存器配置的实战细节以及那些手册里可能一笔带过但却能让你在调试时少熬几个通宵的错误处理与缓存一致性问题。2. DMA核心架构与工作模式解析MPC8260的DMA控制器并非一个简单的、单一功能的模块。它是一个集成在PCI桥内部的、具备一定智能的数据传输引擎。理解其架构是正确使用它的前提。2.1 控制器整体视图与通道资源MPC8260提供了四个独立的DMA通道Channel 0-3。每个通道都拥有完全独立的寄存器组和控制逻辑这意味着你可以同时发起四个不同的DMA传输任务它们可以并行工作由内部的仲裁逻辑来调度对共享总线资源的访问。每个通道都配有一个144字节的内部队列Queue这个队列是数据传输的“中转站”。数据会先从源地址读入这个队列积累到一定量例如一个缓存行后再写入目标地址。这种设计实现了读操作和写操作的部分重叠流水线提升了传输效率。关键点在于队列的隔离性这四个通道的队列空间在I/O序列器I/O Sequencer模块中是独立的每个通道除了共享的144字节队列还有16字节的本地缓冲区。手册中特别强调“Because no address snooping occurs in these internal queues”。这意味着当数据正在DMA控制器的内部队列中时系统的其他部分比如CPU通过缓存是“看不见”这些数据的更新状态的。这直接引出了DMA编程中最经典也最易出错的问题——缓存一致性Cache Coherency。应用软件必须负起责任确保被DMA传输的内存区域在传输过程中保持一致性。我们会在后续章节详细讨论应对策略。2.2 两种核心工作模式直接模式与链式模式DMA控制器支持两种工作模式适用于不同的应用场景。2.2.1 直接模式Direct Mode这是最简单直观的模式。在这种模式下你直接通过软件配置DMA通道的七个核心寄存器源地址寄存器DMASARx数据从哪里来。目的地址寄存器DMADARx数据到哪里去。字节计数寄存器DMABCRx要传输多少字节最大64MB。模式寄存器DMAMRx控制传输特性如传输大小、是否启用监听等。状态寄存器DMASRx只读用于查询传输状态和错误。当前描述符地址寄存器DMACDARx在直接模式下此寄存器无实际作用但通常需要初始化为一个安全值如0。下一个描述符地址寄存器DMANDARx在直接模式下此寄存器同样无实际作用。配置好这些寄存器后你通过设置模式寄存器中的通道启动CS位先清零再置1来触发一次性的传输。传输完成后状态寄存器中的通道忙CB位会清零如果使能了结束中断EOTIE还会产生中断。直接模式适用场景传输单个、连续的大数据块。例如将一块摄像头采集的静态图像数据从PCI采集卡搬运到系统内存。2.2.2 链式模式Chaining Mode这是DMA控制器更强大、更灵活的模式。它引入了“描述符Descriptor”的概念。描述符本质上是一小块在内存中预先定义好的数据结构它包含了一次传输任务的所有信息源地址、目的地址、字节计数以及指向下一个描述符的指针。在链式模式下你不再直接操作源/目的/字节计数寄存器。相反你需要在内存中构建一个或多个描述符并将它们链接成一个链表即“描述符链”。然后你将第一个描述符的地址写入当前描述符地址寄存器DMACDARx并启动DMA通道。DMA控制器的工作流程变为从DMACDARx指向的内存地址读取第一个描述符。将描述符中的源地址、目的地址、字节计数字段加载到对应的内部工作寄存器中。执行本次描述符定义的传输。传输完成后检查描述符中的结束传输描述符EOTD位。如果为1则整个链式传输结束。如果EOTD为0则将描述符中的“下一个描述符地址”字段加载到下一个描述符地址寄存器DMANDARx然后将其值搬移到当前描述符地址寄存器DMACDARx从而指向链表中的下一个描述符。跳回步骤1继续执行下一个描述符的传输直到遇到EOTD1的描述符。链式模式的优势灵活调度可以传输多个不连续的内存块。例如一个描述符传输网络包的头下一个描述符传输负载。自动化一旦启动DMA控制器可以自动完成整个链表的所有传输无需CPU干预仅在最后一个描述符传输完成后产生一次中断。动态构建CPU可以在DMA传输进行的同时在内存中准备新的描述符并链接到链表末尾实现“乒乓”缓冲等高级数据流处理。链式模式适用场景处理数据流、网络数据包多个缓冲区组成一个包、音频/视频流等。2.3 支持的传输类型得益于集成的PCI桥MPC8260的DMA控制器支持四种跨总线类型的传输这极大地扩展了其应用范围传输类型源总线目的总线典型应用场景PCI → PCIPCI内存PCI内存在两块PCI设备如两块网卡间直接拷贝数据PCI → 60xPCI内存60x内存本地内存从PCI设备如硬盘控制器、采集卡读取数据到系统内存60x → PCI60x内存本地内存PCI内存将系统内存中的数据发送到PCI设备如显卡、网络控制器60x → 60x60x内存60x内存在系统内存内部进行大块数据拷贝内存到内存DMA一个重要的性能提示对于PCI↔60x的传输手册提到“Reading from PCI memory and writing to 60x memory can occur concurrently.” 这意味着读和写操作可以并发进行进一步隐藏了访问延迟提升了跨总线传输的吞吐率。3. 寄存器配置详解与实战编程理解了架构和模式我们入实战环节如何配置这些寄存器。手册给出了寄存器的位定义但如何组合使用它们来解决实际问题才是关键。3.1 模式寄存器DMAMRx控制传输的“大脑”模式寄存器是配置DMA行为的核心。我们逐位分析其在实际编程中的意义。BWC带宽控制位23-21当多个DMA通道同时工作时此字段决定了一个通道在获得I/O序列器接口访问权后在释放给下一个通道之前可以传输多少缓存行32字节。这是一种简单的通道优先级和带宽分配机制。例如设置BWC0104缓存行意味着该通道每次抢占到总线可以连续传输128字节再让出。对于需要高实时性的数据流如音频可以设置较大的BWC值对于后台批量拷贝任务可以设置较小的值。DM_SEN直接模式监听使能位20仅在直接模式下有效。置1允许在DMA传输期间对核心数据缓存进行监听Snooping。这是一个关键的一致性控制位。如果你的DMA传输区域可能被CPU缓存且你希望DMA写入的数据能立即被CPU读到或CPU写入的数据能被DMA读到则需要启用监听。但请注意监听会带来一定的性能开销。在链式模式下监听控制由描述符中的SNEN位控制。IRQS中断引导位19决定DMA产生的中断信号路由到哪里。置1路由到PCI总线的INTA信号线通常用于通知PCI主机清零则路由到本地核心PowerPC核心。这取决于你的系统中断控制器是如何连接的。DAHTS/SAHTS DAHE/SAHE地址保持与传输大小位17-16, 15-14, 13, 12这是一组用于实现“外设到内存”或“内存到外设”固定地址传输的功能。例如一个ADC模数转换器设备的数据寄存器映射在PCI空间的一个固定地址上。你可以设置SAHE1并配置SAHTS为ADC数据寄存器的宽度如2字节同时将源地址寄存器DMASARx设置为该固定地址。这样在传输过程中源地址将保持不变DMA控制器会反复从同一个地址读取数据并写入到内存中递增的目的地址。这非常适合数据采集场景。注意硬件仅支持对齐的传输即地址和字节计数必须是传输大小的整数倍。PRCPCI读命令位11-10指定发起PCI读事务时使用的命令类型。00为普通的PCI读01为PCI读行Read Line10为PCI读多行Read Multiple。后两者是更高效的突发读命令可以一次读取整个缓存行或多个缓存行能显著提升从PCI内存读取数据的性能。使用建议在传输大块连续数据时应优先尝试使用01或10但需确保目标PCI设备支持这些命令。CTM通道传输模式位2选择工作模式。0为链式模式1为直接模式。CS通道启动位0最重要的控制位。通过“先清零再置1”的操作来启动或恢复DMA传输。具体行为是当通道不忙CB0时CS从0变1会启动一个新的传输过程。当通道忙CB1时CS从1变0会停止当前的传输。当通道因错误或手动停止后CS从0变1会从停止点恢复传输对于链式模式需要配合CC位。3.2 状态寄存器DMASRx传输状态的“仪表盘”状态寄存器用于查询传输状态和错误大部分位通过写1来清除。TE传输错误位7当传输过程中发生错误且模式寄存器中的TEM传输错误屏蔽位3为0时此位被置1。TEM位决定了DMA控制器对错误的反应TEM1屏蔽忽略错误继续传输TEM0不屏蔽遇到错误立即停止并置位TE。关键点TE位不会被硬件自动清除。在错误发生后如果你想重启传输或开始新的传输必须先手动写1清除TE位。CB通道忙位2只读位。为1表示DMA传输正在进行中。传输完成、被停止或发生错误时此位清零。EOSI段结束中断位1在链式模式下如果当前描述符的EOSIE段结束中断使能位被设置则当该描述符对应的数据段传输完成时此位被置1并产生中断。这允许你在每个数据段传输完成后得到通知进行一些处理例如释放已传输完的缓冲区。EOCDI链/直接结束中断位0当整个DMA传输链式模式的最后一个描述符或直接模式的一次传输完成且模式寄存器中的EOTIE传输结束中断使能位7为1时此位被置1并产生中断。3.3 描述符结构与内存中的布局链式模式的核心是描述符。它是一个在内存中按8字32字节边界对齐的数据结构包含4个双字8字节字段// 描述符在C语言中的结构体表示注意对齐要求 typedef struct dma_descriptor { uint32_t source_addr; // 源地址 (偏移 0x00) uint32_t reserved0; // 保留 (偏移 0x04) uint32_t dest_addr; // 目的地址 (偏移 0x08) uint32_t reserved1; // 保留 (偏移 0x0C) uint32_t next_desc_addr; // 下一个描述符地址 (偏移 0x10) uint32_t reserved2; // 保留 (偏移 0x14) uint32_t byte_count; // 字节计数 (偏移 0x18) uint32_t reserved3; // 保留 (偏移 0x1C) } __attribute__((aligned(32))); // 强制32字节对齐重要细节字节序Endianness问题这是嵌入式开发中一个经典的坑。MPC8260的核心是PowerPC采用大端Big-Endian字节序。而PCI总线通常是小端Little-Endian。描述符可以存放在60x内存大端或PCI内存小端中但DMA控制器对描述符字段的解读有固定规则。描述符在60x内存大端模式你需要按照大端方式将数据写入内存。但手册示例显示DMA控制器读取时会进行一种“从大端到小端的转换理解”。例如你写入的双字0x1122334455667788DMA控制器解析出的源地址会是0x44332211取低32位并交换字节。因此在编程时你需要以本地CPU的视角大端准备数据但心里要清楚硬件会如何解析它。通常我们直接使用正确的数值填充结构体成员即可编译器会处理字节序但当你用指针直接操作内存或进行调试时必须意识到这一点。描述符在PCI内存小端模式你需要按照小端方式准备数据。这对PowerPC CPU来说需要额外的字节交换操作。实战建议为了简化强烈建议将描述符链表始终创建在60x内存中。这样CPU可以用自然的大端方式操作它只需确保结构体对齐并正确设置next_desc_addr字段的指针值指向下一个描述符结构体的地址和byte_count值即可。EOTD和SNEN、EOSIE等控制位存在于next_desc_addr字段的低位中需要按位操作进行设置。3.4 一个完整的链式DMA初始化与启动流程假设我们要从PCI设备地址0x8000_0000传输3个不连续的数据块到60x内存使用通道0。在60x内存中创建描述符链表// 假设 desc 是已分配且32字节对齐的数组 dma_descriptor desc[3]; // 描述符 0 desc[0].source_addr 0x80000000; // PCI源地址1 desc[0].dest_addr 0x00100000; // 60x目标地址1 desc[0].byte_count 0x00010000; // 传输64KB desc[0].next_desc_addr (uint32_t)desc[1]; // 指向描述符1 // 设置控制位使能监听使能段结束中断非结束描述符 desc[0].next_desc_addr | (1 4); // 设置 NDSNEN (位4) desc[0].next_desc_addr | (1 3); // 设置 NDEOSIE (位3) // EOTD (位0) 保持为0 // 描述符 1 desc[1].source_addr 0x80010000; // PCI源地址2 desc[1].dest_addr 0x00200000; // 60x目标地址2 desc[1].byte_count 0x00008000; // 传输32KB desc[1].next_desc_addr (uint32_t)desc[2]; desc[1].next_desc_addr | (1 4) | (1 3); // 描述符 2 (最后一个) desc[2].source_addr 0x80020000; // PCI源地址3 desc[2].dest_addr 0x00300000; // 60x目标地址3 desc[2].byte_count 0x00004000; // 传输16KB desc[2].next_desc_addr (uint32_t)0; // 下一个地址设为NULL或忽略 desc[2].next_desc_addr | (1 4) | (1 3) | (1 0); // 设置EOTD(位0)确保在写入这些值后执行数据缓存回写dcbf或无效化dcbi操作因为CPU可能将这些数据缓存在Cache中而DMA控制器直接从内存读取。配置DMA通道0寄存器将desc[0]的地址写入当前描述符地址寄存器DMACDAR0。注意需要将地址右移5位除以32来对齐到8字边界吗不这里存的是完整的32位地址硬件要求地址值本身是32字节对齐的即低5位为0。我们直接写入(uint32_t)desc[0]即可前提是desc数组已对齐。配置模式寄存器DMAMR0设置CTM0链式模式。设置PRC01或10以使用高效的PCI读命令如果设备支持。设置EOTIE1使能传输结束中断。根据需求设置BWC、IRQS等。先不要设置CS1。启动传输执行一个“先清后置”的操作来启动CS位。通常通过读-修改-写序列实现uint32_t reg in_be32((volatile uint32_t*)DMAMR0_ADDR); // 读取当前值 reg ~(1 0); // 清除CS位 (位0) out_be32((volatile uint32_t*)DMAMR0_ADDR, reg); // 写回 reg | (1 0); // 设置CS位 out_be32((volatile uint32_t*)DMAMR0_ADDR, reg); // 写回启动传输等待完成可以通过轮询状态寄存器DMASR0的CB位等待它变为0或者等待EOCDI中断发生。4. 缓存一致性与错误处理开发中的深水区即使寄存器配置正确DMA传输也可能因为缓存一致性问题或总线错误而失败。这部分是调试的难点。4.1 缓存一致性Cache Coherency实战指南如前所述DMA控制器与CPU缓存是不同步的。这会导致两个经典问题CPU读取到旧数据Cache Coherency Problem - ReadCPU修改了内存中的数据实际上只修改了Cache然后启动DMA将该内存区域发送出去。DMA从内存而非Cache读取数据读走的是未修改的旧数据。DMA写入的数据被Cache覆盖Cache Coherency Problem - WriteDMA将外设数据写入内存随后CPU读取该区域。如果该内存行在CPU Cache中且处于“有效”状态CPU会直接从Cache读取旧数据看不到DMA新写入的数据。MPC8260提供的硬件机制是缓存监听Snooping。通过在模式寄存器直接模式或描述符中设置SNEN位可以使DMA传输事务在总线上被CPU的缓存控制器“听到”监听。如果监听发现总线上传输的地址正好在Cache中缓存控制器会采取行动使Cache行无效或更新从而维护一致性。但是监听不是万能的而且有性能代价。更通用和可靠的方法是软件维护一致性对于DMA读取的内存区域源缓冲区在启动DMA之前确保CPU对它的所有修改都已写回内存。可以使用dcbf数据缓存块刷新指令强制将特定地址范围的Cache内容写回内存。对于DMA写入的内存区域目的缓冲区在DMA传输完成之后、CPU读取它之前确保对应的CPU Cache行被无效化这样CPU下次读取时会从内存获取新数据。可以使用dcbi数据缓存块无效指令。一个更安全的做法是使用“非缓存Non-cacheable”内存区域进行DMA。许多操作系统或BSP板级支持包会预留一段物理上连续、在MMU页表中标记为不可缓存CI或GUARDED属性的内存专门用于DMA缓冲区。这是最根本的解决方案完全避免了缓存一致性问题代价是CPU访问该区域会慢一些。4.2 错误处理与恢复机制DMA控制器可能因各种总线错误而停止。状态寄存器DMASRx中的TE位是错误标志。常见的错误来源PCI总线错误访问不存在的PCI设备地址Master-Abort、目标设备主动终止Target-Abort、奇偶校验错误Parity Error。60x总线错误访问非法内存地址。配置错误源或目的地址未对齐当使用地址保持功能时、字节计数不是传输大小的整数倍。错误处理流程检测错误轮询TE位或通过中断如果使能了错误中断但注意错误本身可能不会直接产生独立中断通常需要结合状态寄存器查询来发现错误。清除错误标志必须向TE位写1来清除它。这是恢复操作的前提。诊断错误查阅PCI桥相关的错误状态寄存器如ESR、PCI状态寄存器以及PCI错误地址/数据捕获寄存器来确定错误的具体类型和地址。这对于调试硬件问题或驱动bug至关重要。决定恢复策略继续Continue如果错误是暂时的如总线繁忙清除TE位后可以通过设置模式寄存器的CC位仅链式模式或再次触发CS0-1来尝试从断点恢复传输。注意对于因数据错误如奇偶校验停止的传输恢复可能导致数据损坏。重新配置Reconfigure如果错误是由于配置不当如错误地址引起的需要停止通道CS:1-0重新初始化所有寄存器或描述符然后重新启动。系统复位Reset手册在“DMA Operation After Bus Error”的NOTE中给出了一个极其重要且严厉的警告“After any bus error which occurs in the PowerQUICC II (either 60x or PCI, not necessarily due to DMA operation), the user must reset the system to avoid DMA malfunction.” 这意味着一旦PowerQUICC II芯片本身遇到任何总线错误不一定是DMA引起的整个DMA控制器可能进入不可预测的状态。最安全的做法是执行系统复位。在实际产品中这可能意味着需要看门狗超时复位或者驱动层实现一个稳健的“DMA控制器软复位”序列如果支持的话。编程建议在DMA传输初始化时始终将模式寄存器的TEM位设为0让错误能够停止传输避免在错误状态下继续传输破坏数据。在中断服务程序或错误处理线程中不仅要检查DMA状态寄存器也要检查PCI桥的全局错误状态寄存器以获得完整的错误视图。对于关键任务考虑实现描述符的“备份链”。当主传输链因错误停止时可以切换到备份链重试或者记录错误点由上层协议处理重传。5. 高级主题与性能优化技巧掌握了基础配置和错误处理后我们可以探讨一些提升DMA使用效率和可靠性的高级技巧。5.1 多通道管理与带宽分配四个独立的DMA通道是宝贵的资源。如何有效管理它们通道分工可以根据数据流的特点分配通道。例如通道0专门用于高优先级的网络接收PCI - 60x通道1用于网络发送60x - PCI通道2和3用于低优先级的存储或备份任务。使用BWC进行优先级控制过设置不同通道的BWC值可以实施简单的加权带宽分配。高优先级通道设置更大的BWC使其在一次总线占用中传输更多数据从而获得更高的有效带宽。中断合并对于高速数据流每个数据包或描述符都产生中断EOSI可能会造成巨大的CPU中断负载。可以考虑以下策略仅在链的最后一个描述符设置EOTD和使能EOTIE整链传输完成才产生一次中断。使用“定时器状态轮询”的方式替代部分中断。例如每毫秒检查一次所有通道的状态寄存器批量处理已完成的数据段。5.2 描述符链设计的艺术描述符链的设计直接影响DMA效率和软件复杂度。描述符大小与对齐务必确保每个描述符在内存中32字节对齐。不对齐会导致不可预知的行为。使用编译器指令如GCC的__attribute__((aligned(32)))或动态内存分配时手动对齐。环形缓冲区Ring Buffer这是处理持续数据流的经典模式。创建一个固定大小的描述符数组并将其首尾相连形成一个环。维护两个指针生产者指针软件添加新描述符和消费者指针DMA控制器正在处理。当DMA完成一个描述符后自动跳转到环中的下一个。软件只需要确保在生产指针追上消费指针之前缓冲区满添加新的数据。这需要精心设计描述符中的next_desc_addr使其指向环中的下一个节点。描述符预取为了最大化性能应确保DMA控制器在完成当前传输前能提前将下一个描述符从内存加载到内部。这要求你的描述符在内存中的布局是连续的或者至少访问模式对缓存友好。5.3 调试与诊断实战记录调试DMA问题往往需要结合软件和硬件工具。软件诊断寄存器快照在出错时立刻将DMA通道的所有7个寄存器以及PCI桥相关的错误寄存器ESR, EMR, PCI_EACR等的内容 dump 出来。这些信息是定位问题的第一手资料。内存内容检查检查源和目的缓冲区的内容确认数据是否正确传输。检查描述符链表在内存中的值确认链接指针、字节计数、控制位设置是否正确。使用printf或日志在关键步骤如启动DMA、进入中断、检测到错误添加详细的日志包括地址、长度、状态位等信息。硬件工具逻辑分析仪捕获PCI总线和60x总线上的信号观察DMA传输的实际波形。可以清楚地看到地址、数据、控制信号以及是否出现了PERR、SERR、DEVSEL未应答Master-Abort等错误信号。这是诊断硬件兼容性或时序问题的终极手段。JTAG调试器可以实时查看和修改内存、寄存器设置断点。对于复杂的描述符链操作单步跟踪代码并观察内存变化非常有效。一个常见的坑地址映射问题。MPC8260的PCI桥通过“出站窗口Outbound Windows”将60x地址空间映射到PCI地址空间。当DMA控制器判断一个地址是访问PCI内存还是60x内存时依据就是该地址是否命中某个出站窗口。如果你配置的PCI地址没有正确映射或者映射的窗口属性如预取、使能不对DMA传输就会失败可能表现为总线错误。务必仔细检查PCI桥的初始化代码和出站窗口配置。6. 总结与核心要点回顾MPC8260的DMA控制器是一个功能强大但需要精细控制的模块。成功驾驭它意味着能为你的嵌入式系统释放巨大的数据吞吐潜力。回顾整个内容以下几个核心要点需要时刻牢记模式选择单次大块传输用直接模式复杂、多段或流式传输用链式模式。链式模式是发挥DMA威力的关键。一致性管理这是DMA编程的“头号杀手”。明确你的DMA缓冲区是否被缓存并采取相应措施软件刷Cache、使用非缓存内存、或谨慎启用硬件监听。错误处理错误不可避免。你的驱动必须能检测轮询或中断、清除写TE位、诊断查错误寄存器并安全地恢复继续、重配或复位DMA错误。尤其注意手册中关于总线错误后需要系统复制的严重警告。描述符是核心在链式模式下描述符链的设计决定了DMA的行为。确保对齐、正确链接、并妥善管理其生命周期预分配、回收。配置细节CS位的启动序列先清后置、TEM位对错误处理的影响、PRC位对PCI读性能的提升、BWC对多通道带宽的分配这些细节的配置都直接影响最终效果。从我个人的经验来看调试DMA问题最有效的方法往往是简化问题。先尝试用直接模式传输一个小的、对齐的、位于非缓存内存的数据块。成功后再逐步增加复杂性切换到链式模式、使用缓存内存、提高传输速度、启用多个通道。每增加一个变量都仔细测试。同时善用芯片提供的状态和错误寄存器它们是你窥探DMA控制器内部状态的窗口。最后保持耐心DMA的调试常常是硬件和软件交织的复杂过程但一旦调通其带来的性能收益将是巨大的。