MPC8572E DMA控制器工作模式详解:从基础到高级的性能优化实践

📅 2026/6/24 7:29:36
MPC8572E DMA控制器工作模式详解:从基础到高级的性能优化实践
1. DMA控制器从硬件搬运工到系统性能加速器在嵌入式系统尤其是网络通信、音视频处理这类数据吞吐量巨大的应用场景里CPU如果深陷于数据搬运的泥潭那无疑是巨大的资源浪费。想象一下一个负责处理复杂网络协议栈的处理器核心却要花费大量时钟周期去把数据从一个内存地址复制到另一个地址或者从外设缓冲区搬进内存这就像让一个数学家去干搬砖的活儿效率低下且得不偿失。DMADirect Memory Access直接内存访问控制器就是为了解决这个问题而生的“专职搬运工”。它的核心思想非常直接将数据搬运这种重复性、高带宽但低智能的任务从CPU卸载到一块专用的硬件上。CPU只需要告诉DMA控制器“从A地址开始搬N个字节的数据到B地址”然后就可以转身去处理其他计算任务。DMA控制器会独立地发起总线读写周期完成整个数据块的传输最后通过中断或状态位通知CPU“活儿干完了”。这个过程完全不需要CPU干预具体的数据移动从而实现了计算与I/O的真正并行。MPC8572E PowerQUICC III处理器集成的四通道DMA控制器是飞思卡尔现恩智浦为高性能网络和通信处理器设计的一个典型代表。它远不止是一个简单的“内存复制器”而是一个配备了多种高级模式、可编程性极强的数据传输引擎。理解它的工作原理特别是其丰富的工作模式——从最基础的直接模式到复杂的扩展链式模式——是充分发挥该处理器数据吞吐潜力的关键。无论是实现零拷贝网络报文处理还是高效管理视频帧缓冲区亦或是完成复杂的内存重组Scatter-Gather操作都离不开对DMA控制器的精细编程。接下来我们就深入其内部拆解它的每一种工作模式看看这位“硬件搬运工”如何从基础走向高级成为系统性能的隐形加速器。2. 核心架构与寄存器模型解析在深入各种模式之前我们必须先理解MPC8572E DMA控制器的“控制中心”——它的寄存器编程模型。每个DMA通道都有一套独立的寄存器组软件通过配置这些寄存器来指挥DMA控制器工作。如果把DMA通道比作一个施工队那么这些寄存器就是发给施工队的图纸、物料清单和操作指令。2.1 关键寄存器组及其职责每个通道的核心寄存器可以大致分为三类地址与属性寄存器、控制寄存器、状态寄存器。地址与属性寄存器是施工的“地址簿”和“物料单”SARn (Source Address Register) / DARn (Destination Address Register)源地址和目标地址寄存器。这是数据传输的起点和终点。在直接模式下软件直接写入具体的物理地址。SATRn (Source Attributes Register) / DATRn (Destination Attributes Register)源和目标属性寄存器。这决定了数据传输的“交通规则”。例如它定义了访问类型如缓存禁止、带缓冲的写入、事务大小一次读/写多少字节以及对于特定总线如RapidIO、PCIe的事务类型。配置错误可能导致数据损坏或总线错误。BCRn (Byte Count Register)字节计数寄存器。顾名思义它定义了本次传输需要搬运的总字节数。DMA控制器会持续递减此值直到为零标志传输完成。控制寄存器是施工队的“指挥中枢”MRn (Mode Register)模式寄存器。这是最核心的控制寄存器像一个多功能开关面板。MRn[CS] (Channel Start)通道启动位。写1启动传输相当于给施工队下达“开工”指令。MRn[CTM] (Channel Transfer Mode)通道传输模式位。用于选择是直接模式CTM1还是链式模式CTM0。MRn[XFE] (Extended Features Enable)扩展功能使能位。这是区分基础模式和扩展模式的总开关。置1则启用扩展模式支持跨步Striding和更复杂的描述符结构。MRn[SRW] (Single-Write Start)单次写启动位。在直接模式下配合此位可以实现通过写地址寄存器SARn或DARn来触发传输启动简化了启动流程。MRn[CDSM/SWSM] (Current Descriptor Start Mode / Single-Write Start Mode)当前描述符启动模式/单次写启动模式位。在链式模式下此位决定如何启动描述符链的获取。MRn[EOSIE] (End Of Segment Interrupt Enable)段结束中断使能位。传输完成时是否产生中断。MRn[CA] (Channel Abort)通道中止位。软件写1可以请求中止正在进行的传输。MRn[CC] (Channel Continue)通道继续位。用于在链式模式下当遇到链表结束标记后让DMA继续获取新添加的描述符。MRn[BWC] (Bandwidth Control)带宽控制字段。用于在多通道同时工作时分配每个通道一次能传输的最大数据量以KB为单位实现带宽公平调度。状态寄存器是施工队的“工作汇报板”SRn (Status Register)状态寄存器。SRn[CB] (Channel Busy)通道忙标志。这是最重要的状态位之一。当DMA控制器正在活跃地进行数据传输或描述符获取时此位为1。传输完成、中止或出错时硬件自动清零。软件可以通过轮询此位来判断传输状态。SRn[TE] (Transfer Error)传输错误标志。当发生不可纠正的ECC错误、地址映射错误等时置位。SRn[PE] (Programming Error)编程错误标志。当软件配置了非法参数如字节计数为0、优先级设为3等时置位。2.2 描述符链式模式的“任务清单”在直接模式中任务源地址、目标地址、字节数是直接写在寄存器里的一次只能执行一个任务。而在链式模式中DMA控制器变得“更聪明”它可以按照一份预先存放在内存中的“任务清单”自动执行一系列传输任务。这份清单就是描述符Descriptor。描述符本质上是一段在内存中按特定格式组织的数据结构它包含了完成一次DMA传输所需的所有信息。MPC8572E的DMA控制器支持两种描述符链表描述符 (List Descriptor)在扩展模式下使用用于管理多个链接描述符链表。你可以把它理解为一个“项目组组长”它自己不干具体的活但它知道手下各个“小组”链接描述符链表的起始位置。链接描述符 (Link Descriptor)这是干“具体活”的描述符。无论是基础模式还是扩展模式实际的数据传输参数SAR, DAR, BCR等都存储在链接描述符中。在扩展模式下多个链接描述符通过“下一个链接描述符地址”字段串联成一个链表形成一个“任务小组”。描述符的引入带来了巨大的灵活性。软件可以提前在内存中构建一个复杂的传输序列例如从多个不连续的内存区域收集数据然后发送到同一个网络端口即Scatter-Gather操作然后只需告诉DMA控制器第一个描述符的地址它就能自动地一个接一个地执行下去期间完全不需要CPU干预。这不仅减少了中断频率也使得处理复杂、零散的数据流成为可能。注意描述符对齐要求。手册中明确强调软件必须确保每个描述符在内存中按32字节边界对齐。这是一个硬性规定违反此规定会导致不可预知的行为通常表现为总线错误或数据损坏。在分配描述符内存时必须使用对齐的内存分配函数如memalign(32, size)或posix_memalign。3. 基础工作模式详解与实战编程理解了寄存器模型和描述符的概念后我们就可以开始探索DMA控制器提供的各种“工作模式”。这些模式可以看作是给这位“搬运工”提供的不同工具套装适用于不同的工作场景。我们从最简单、最直接的模式开始。3.1 基础直接模式单次任务的快速执行基础直接模式是最简单、最直观的模式。它适用于一次性、连续数据块的传输。在这个模式下DMA控制器不读取内存中的描述符所有传输参数都由软件直接写入通道的寄存器组。工作流程与编程步骤确认通道空闲软件首先需要轮询状态寄存器SRn[CB]位确保目标DMA通道处于空闲状态SRn[CB] 0。这是防止覆盖正在进行中的传输的关键一步。配置传输参数软件初始化本次传输所需的全部寄存器SARn和DARn写入确切的源地址和目标地址。SATRn和DATRn根据源和目标设备的总线特性配置正确的访问属性如事务类型、缓存策略。BCRn写入需要传输的总字节数。设置模式并启动在模式寄存器MRn中设置MRn[CTM] 1表明使用直接模式。根据需要配置其他控制位如是否使能段结束中断 (MRn[EOSIE])。最后通过“先清零后置一”的方式操作MRn[CS]位来启动传输。这个“先清后置”的操作是一个标准的启动序列确保了一个明确的上升沿触发信号。传输进行与完成一旦MRn[CS]被置位DMA控制器硬件会自动将SRn[CB]置1表示传输正在进行。DMA控制器开始独立地在总线上发起读写周期搬运数据并递减BCRn。当BCRn递减到0传输完成或者传输被中止 (MRn[CA]从0变1或者发生传输错误时硬件会自动将SRn[CB]清零。如果使能了中断 (MRn[EOSIE]1)此时会产生一个中断信号通知CPU。实战心得与避坑指南地址对齐虽然手册没有在基础模式中强制要求但为了提高总线效率建议源地址和目标地址按照各自总线支持的自然边界对齐例如64位总线按8字节对齐。不对齐的访问可能导致性能下降甚至在某些严格的总线上引发错误。字节计数限制BCRn是一个32位寄存器理论上可以传输4GB的数据。但在实际编程中一次传输过大的数据块如几百MB可能会长时间占用总线影响系统实时性。更佳实践是将大块传输分解为多个较小的DMA传输并通过链式模式或中断来串联这样能更好地与其他总线主设备如CPU、其他DMA通道共享带宽。状态轮询与中断选择对于短时传输使用轮询SRn[CB]等待完成是简单有效的。但对于耗时较长的传输强烈建议使能MRn[EOSIE]采用中断方式通知完成以释放CPU去处理其他任务。轮询长传输会严重浪费CPU周期。3.2 基础直接单次写启动模式简化启动流程这是基础直接模式的一个变体核心优化在于启动方式。在标准直接模式中你需要配置完所有寄存器后最后去写MRn[CS]位来启动。而在单次写启动模式下你可以通过写入源或目标地址寄存器这一动作本身来触发传输启动。工作原理 软件首先配置好SATRn、DATRn和BCRn并在模式寄存器中设置MRn[CTM]1直接模式和MRn[SRW]1使能单次写启动。此时还需要通过MRn[CDSM/SWSM]位来选择触发源如果MRn[CDSM/SWSM] 1则写入SARn源地址寄存器会触发传输启动。如果MRn[CDSM/SWSM] 0则写入DARn目标地址寄存器会触发传输启动。当软件执行对选定地址寄存器的写操作时DMA控制器硬件会自动将MRn[CS]置位从而开始传输。适用场景与优势 这种模式在特定场景下可以简化软件流程减少一次寄存器写操作。例如在一个数据生产-消费模型中生产者模块在准备好数据后其内存地址是固定的但目标地址可能每次不同。这时可以预先配置好源属性、目标属性和字节数并将MRn[CDSM/SWSM]清零。每当需要发起一次传输时生产者只需将新的目标地址写入DARn传输便自动开始。这减少了一次显式的“启动”操作使代码更简洁并可能略微降低启动延迟。注意在单次写启动模式下必须确保在写入触发地址寄存器SARn或DARn之前所有其他必要的寄存器SATRn, DATRn, BCRn, MRn中的相关控制位都已经正确配置完毕。因为写入地址寄存器的动作会立即触发硬件状态机启动如果其他参数未就绪将导致传输使用错误或未初始化的参数结果不可预测。3.3 基础链式模式自动化任务流水线当你有多个独立的数据块需要搬运时反复配置寄存器、启动、等待完成、再配置……这种流程效率低下。基础链式模式就是为了实现传输序列的自动化。在这个模式下软件不再直接操作SARn、DARn等寄存器而是要在内存中预先构建一个链接描述符链表。每个链接描述符节点都包含了一次传输所需的所有参数源地址、目标地址、字节数、属性等以及一个指向下一个描述符的指针NLNDARn下一个链接描述符地址寄存器。工作流程与编程步骤构建描述符链表在内存中分配并初始化一个或多个链接描述符。每个描述符的NLNDARn字段指向链表中的下一个描述符。最后一个描述符的NLNDARn[EOLND]End Of Link位必须置1以标记链表结束。初始化DMA控制器轮询SRn[CB]确保通道空闲。将当前链接描述符地址寄存器CLNDARn和其扩展地址寄存器ECLNDARn初始化为指向内存中第一个链接描述符的地址。在模式寄存器MRn中清除MRn[CTM]表示链式模式并清除MRn[XFE]表示基础模式。配置其他控制位。启动传输链通过“先清零后置一”MRn[CS]来启动。自动化执行DMA控制器开始工作 a. 从CLNDARn指向的地址读取第一个链接描述符。 b. 将描述符中的内容源地址、目标地址等加载到内部的编程模型寄存器中。 c. 执行该描述符定义的数据传输。 d. 传输完成后检查读取的描述符中NLNDARn[EOLND]位。 * 如果EOLND0不是最后一个则将NLNDARn的值载入CLNDARn然后跳回步骤a获取并执行下一个描述符。 * 如果EOLND1是最后一个则停止传输清除SRn[CB]完成整个链。核心价值与典型应用链式模式的核心价值在于“一次配置多次执行”。它完美适用于分散-聚集Scatter-Gather操作。例如一个网络数据包可能被分割成多个缓冲区Buffer存储这些缓冲区在物理内存中是不连续的。网卡驱动可以使用链式DMA构建一个描述符链表其中每个描述符对应一个缓冲区源地址指向各个缓冲区目标地址都指向网卡的发包队列。DMA控制器会自动按顺序将这些分散的数据块“聚集”起来发送出去对上层软件而言就像操作一个连续的数据块一样简单。这极大地简化了驱动程序的编写并提升了效率。4. 高级工作模式与性能优化技巧基础模式已经能解决大部分问题但MPC8572E的DMA控制器还提供了更强大的扩展模式和一些高级控制功能用于应对更复杂、对性能要求更高的场景。4.1 扩展模式引入跨步与二级描述符扩展模式通过设置MRn[XFE] 1来启用。它在基础模式之上增加了两大核心功能跨步Striding传输和二级描述符结构。4.1.1 跨步传输高效处理规则间隔数据跨步功能是针对源地址或目标地址的。想象一下你需要从一个二维数组例如一幅图像的每一行中每隔固定距离取一段数据。如果没有跨步你可能需要为每一段数据设置一个独立的DMA传输或描述符。跨步功能让单个DMA传输就能自动完成这个模式化的数据访问。它通过两个参数定义跨步大小Stride Size每次连续传输的字节数。比如你想每次取图像的一行。跨步距离Stride Distance两次传输之间基地址的增量。比如从一行开头跳到下一行开头的字节偏移量。在扩展直接或扩展链式模式下通过设置源属性寄存器SATRn[SSME]或目标属性寄存器DATRn[DSME]来使能源或目标的跨步并在相应的跨步寄存器SSRn或DSRn中配置大小和距离。DMA控制器在完成一次“跨步大小”的数据传输后会自动将当前地址加上“跨步距离”然后开始下一次传输如此循环直到完成BCRn指定的总字节数。应用场景图像处理中提取某颜色通道数据在内存中间隔排列、音频处理中访问多声道数据的特定声道、矩阵运算中访问矩阵的某一行或列。4.1.2 扩展链式模式更复杂的传输组织扩展链式模式引入了链表描述符List Descriptor的概念形成了两级描述符结构链表描述符指向一个链接描述符链表。它包含“下一个链表描述符地址”和“第一个链接描述符地址”。链接描述符和基础链式模式一样包含实际的数据传输参数。这种结构提供了更高的组织灵活性。例如你可以用一个链表描述符管理一组用于接收网络报文的链接描述符一个链表用另一个链表描述符管理一组用于发送的链接描述符另一个链表。DMA控制器在执行完一个链表的所有链接描述符后会自动跳转到下一个链表描述符继续执行新的链表。这非常适合需要动态切换不同传输任务队列的场景。编程模型对比基础链式CLNDARn- Link Desc 1 - Link Desc 2 - ... - Link Desc N (EOLND1)扩展链式CLSDARn- List Desc 1 - (指向) Link Desc Chain A - List Desc 2 - (指向) Link Desc Chain B - ... - List Desc M (EOLSD1)4.2 外部控制模式硬件触发与流控在某些实时性要求极高的场景DMA传输的启动和暂停需要由外部硬件信号来精确控制而不是由软件写寄存器来触发。外部控制模式就是为了满足这一需求。通过设置MRn[EMS_EN]来使能此模式。此时DMA控制器会暴露出一组外部引脚信号DMA_DREQ (DMA Request)外部主设备通过给这个信号一个上升沿来请求启动或恢复从暂停状态DMA传输。这相当于硬件版的“启动”按钮。DMA_DACK (DMA Acknowledge)DMA控制器用此信号指示传输正在进行对应SRn[CB]1。告诉外部设备“活已接收正在干”。DMA_DDONE (DMA Done)DMA控制器用此信号指示传输完成对应SRn[CB]0。告诉外部设备“活已干完”。此外通过设置MRn[EMP_EN]和MRn[BWC]可以实现带宽控制下的自动暂停。DMA控制器在传输了BWC指定大小的数据后会自动暂停清除MRn[CS]等待下一个DMA_DREQ上升沿来继续传输。这实现了基于数据量的“批处理”流控。典型应用与FPGA或ASIC等外部数据产生/消费单元对接。例如一个ADC模数转换器芯片在采集满一个FIFO例如1KB后发出一个DREQ脉冲DMA控制器随即启动将FIFO数据搬入内存。搬完1KB后DMA自动暂停等待ADC下一个FIFO满信号。这种方式实现了硬件级别的同步延迟极低且不占用CPU。4.3 通道继续模式动态扩展任务链这是一个非常实用的高级功能专为链式模式设计。场景是这样的软件已经启动了一个DMA描述符链DMA正在执行。此时又有新的数据块需要传输软件希望在当前链执行的同时或之后动态地将新的描述符添加到链的末尾。如果没有通道继续模式软件需要等待整个链执行完毕SRn[CB]0然后修改最后一个描述符的指针并重新启动整个链这会造成传输间隙。通道继续模式通过MRn[CC]位来解决。其工作流程如下软件在构建初始描述符链时在最后一个描述符设置EOLND基础模式或EOLSD扩展模式让DMA执行到此暂停。DMA控制器遇到EOLND/EOLSD后会进入暂停状态SRn[CB]0但内部寄存器仍然指向这个最后的描述符。此时软件可以在内存中继续构建新的描述符并修改之前最后一个描述符的“下一个描述符地址”字段使其指向新构建的描述符同时清除该描述符的EOLND/EOLSD位。软件设置MRn[CC]1。DMA控制器会重新获取当前地址寄存器指向的描述符即已被软件更新的那个描述符读取新的“下一个描述符地址”然后继续执行新的描述符链。这个过程允许软件“追上”硬件实现描述符链的动态、无缝扩展非常适合需要持续流式传输的场景如音视频流处理。4.4 性能优化与避坑实践描述符缓存与预取DMA控制器在链式模式下需要从内存读取描述符。确保描述符所在的内存区域是缓存友好的Cacheable并且被锁定在L1/L2缓存中可以极大减少描述符获取的延迟提升链式传输的整体性能。带宽控制BWC的合理使用当多个DMA通道同时活跃时MRn[BWC]的设置至关重要。设置过小会导致通道切换频繁增加开销设置过大可能导致某个通道长时间独占总线影响其他通道或CPU的实时性。需要根据实际业务的数据流量和优先级进行权衡和测试。对齐与边界限制描述符对齐前文已强调32字节对齐是必须的。地址对齐对于使能了地址保持MRn[SAHE]/[DAHE]的传输源/目标地址必须按照SAHTS/DAHTS指定的大小对齐。RapidIO消息限制如果使用DMA发送RapidIO消息消息长度必须是8、16、32、64、128或256字节。这需要通过设置BCRn为相应的2的幂次方值来实现。错误处理务必使能传输错误中断 (MRn[EIE])并在中断服务程序中检查SRn[TE]和SRn[PE]。对于编程错误PE通常是软件bug需要检查寄存器配置。对于传输错误TE可能需要重试或上报。健全的错误处理是稳定系统的基础。避免小步幅传输手册明确指出由于DMA控制器内部缓冲区数量的限制应避免使用小于64字节的跨步步幅。小于64字节的步幅会严重降低总线利用率。最佳性能的步幅是大于等于256字节。小步幅仅适用于必须的分散-聚集场景并需接受性能损失。5. 实战问题排查与状态机深度解析即使理解了所有模式和寄存器在实际编程和调试中依然会遇到各种问题。掌握DMA控制器的内部状态机以及常见问题的排查方法是成为资深开发者的必经之路。5.1 通道状态机理解SRn[CB]与MRn[CS]的舞蹈DMA通道的行为由一个清晰的状态机定义其状态由MRn[CS]软件控制、SRn[CB]硬件状态、SRn[TE]错误和MRn[CC]继续这几个关键位共同决定。手册中的“通道状态表”是调试的罗盘。空闲态 (Idle):MRn[CS]0,SRn[CB]0,SRn[TE]0。这是复位后的状态也是传输完成后的常态。就绪/完成态 (Ready/Complete):MRn[CS]1,SRn[CB]0,SRn[TE]0。这个状态很微妙。它表示软件已经启动了通道CS1但硬件尚未开始传输CB0。这通常出现在两种情况下软件刚设置MRn[CS]1但DMA控制器还处于启动的初始阶段尚未开始实际数据传输例如正在获取第一个描述符。一次传输已经成功完成SRn[CB]被硬件清零但软件尚未清除MRn[CS]位。 区分这两种情况需要结合上下文。如果是情况2这是一个正常结束状态。传输进行态 (Transfer in Progress):MRn[CS]1,SRn[CB]1。这是最期望看到的活跃状态。软件暂停态 (Software Halted):MRn[CS]0,SRn[CB]1。这表示软件在传输过程中清除了MRn[CS]位请求暂停。DMA控制器会完成当前正在传输的子块取决于具体实现后进入暂停。这不是错误状态。错误暂停态 (Error Halt):SRn[TE]1。任何状态下发生传输错误都会进入此状态。SRn[CB]可能为1正在尝试停止或0已停止。这是需要错误处理的状态。调试技巧当DMA传输没有按预期发生时第一件事就是读取模式寄存器MRn和状态寄存器SRn对照状态表确定通道处于何种状态。这能迅速缩小排查范围。例如如果状态停留在“就绪/完成态”且CB一直为0可能是启动序列有问题或者描述符地址配置错误导致无法获取描述符。5.2 常见问题排查清单下表列出了一些典型问题现象、可能原因及排查方向问题现象可能原因排查步骤传输无法启动SRn[CB]始终为01. 通道未就绪上次传输未完成/处于错误状态。2. 在链式模式下描述符地址错误或内存不可访问。3. 寄存器配置顺序错误如在单次写启动模式下先写了触发寄存器。4.MRn[CS]启动序列不正确未先清后置。1. 检查SRn[CB]和SRn[TE]确保通道空闲。2. 检查CLNDARn/CLSDARn值是否正确描述符内存是否已有效写入。3. 检查代码逻辑确保所有参数在启动前已配置。4. 确认对MRn[CS]的操作是“写0清再写1置”。传输中途停止SRn[CB]1但数据未传完1. 外部控制模式下DMA_DREQ信号丢失或MRn[EMP_EN]使能后带宽控制暂停。2. 链式模式下描述符中的EOLND/EOLSD位被意外设置。3. 总线错误如访问非法地址导致传输静默失败需查错误位。1. 检查外部信号和MRn[BWC]配置。2. 检查内存中的描述符链表结构。3. 检查SRn[TE]和SRn[PE]是否置位。数据传输错误内容不对1. 源/目标地址寄存器SARn/DARn配置错误。2. 属性寄存器SATRn/DATRn配置错误如事务类型、大小不匹配。3. 跨步参数SSRn/DSRn计算错误导致访问了错误的内存区域。4. 缓存一致性问题源/目标内存区域未正确进行缓存维护Invalidate/Flush。1. 打印并核对所有地址、属性寄存器值。2. 仔细核对总线协议要求如PCIe、RapidIO。3. 复核跨步大小和距离的计算。4. 在DMA传输前后对缓存行执行必要的dcbf(flush) 或dcbi(invalidate) 操作。链式模式只执行了第一个描述符1. 第一个描述符的NLNDARn指向错误或未初始化。2. 第一个描述符的EOLND位被错误置1。3. 描述符在内存中的布局或对齐不符合要求非32字节对齐。1. 使用调试器查看内存中描述符的内容特别是下一个描述符地址字段。2. 检查描述符初始化代码中对EOLND/EOLSD位的设置。3. 确认描述符指针是memalign(32, size)分配的。使能中断后未收到中断1.MRn[EOSIE]或MRn[EIE]未正确使能。2. 处理器全局中断或DMA通道特定中断未在中断控制器中使能/映射。3. 中断服务程序ISR未正确清除中断标志。1. 确认MRn寄存器中断使能位已置1。2. 检查芯片的全局中断配置和OpenPIC或类似中断控制器中DMA通道中断的配置。3. 在ISR中读取DMA状态寄存器SRn通常会清除某些中断条件或需要向特定寄存器写值来确认中断。5.3 缓存一致性问题隐形的杀手在带有缓存Cache的系统中DMA传输最容易遇到也最难调试的问题就是缓存一致性。CPU读写数据会经过缓存而DMA控制器直接访问物理内存绕过缓存。这就可能导致CPU写DMA读CPU修改了缓存中的数据但未写回内存Cache是Write-Back策略。DMA从内存读走的是旧数据。DMA写CPU读DMA将新数据写入内存但CPU缓存中仍然是旧数据。CPU读到了脏数据。解决方案使用非缓存Cache-Inhibited内存为DMA缓冲区分配非缓存内存。这是最简单可靠的方法但性能有损失。软件维护缓存一致性如果DMA缓冲区位于缓存内存中必须在关键操作点进行缓存维护在DMA读取之前CPU是生产者确保CPU已将最终数据写回内存。使用dcbst或dcbf指令刷新Flush缓存行。在CPU读取之前DMA是生产者确保CPU缓存中该区域的旧数据失效。使用dcbi或icbi指令无效Invalidate缓存行。许多操作系统如Linux的DMA API如dma_map_single会自动处理这些操作。在MPC8572E这类高性能处理器上忽略缓存一致性会导致极其诡异、难以复现的数据错误。在驱动开发中必须将缓存一致性作为头等大事来考虑。