
1. 项目概述与EDMA3核心价值在嵌入式系统开发尤其是涉及音视频处理、高速数据采集或通信的领域CPU常常被大量简单但耗时的数据搬运任务所拖累。想象一下一个高清摄像头每秒产生上百兆的像素数据如果每个字节的搬移都需要CPU发出指令那CPU就什么也别干了光忙着当“数据搬运工”了。这时候直接内存访问DMA技术就像请来了一位专业的“物流主管”它能独立规划路线、调度车辆把数据从A点如外设搬到B点如内存全程无需CPU这个“总经理”过问。而德州仪器TI在其多核DSP和高端微控制器中集成的增强型直接内存访问控制器第三代EDMA3则是这位“物流主管”中的顶尖高手。EDMA3远不止是简单的内存拷贝工具。它引入了一套精密的事件驱动架构和参数化传输模型。你可以把它理解为一个高度自动化的“传输流水线”外围设备如摄像头传感器、串口产生一个“事件”比如“我收到一帧数据了”这个事件就像按下了一个流水线的启动按钮。EDMA3控制器接收到事件后会自动查找预先配置好的“任务清单”——也就是参数集PaRAM然后指挥下属的“运输队”传输控制器TC去执行具体的搬运工作。这套机制的精妙之处在于它允许你预先编排好数十甚至上百个复杂的传输任务比如二维数据块搬移、数据重排然后通过不同的事件来触发它们实现真正的并行与后台处理。其核心价值在于确定性的高性能与极低的CPU开销。对于实时音频处理它能确保每个采样点被准时送入处理单元对于视频流它能高效地搬运整帧或子帧图像对于通信协议栈它能自动处理数据包的组装与分发。理解EDMA3尤其是其复杂的事件处理流程、多级优先级仲裁机制和性能优化技巧是解锁这些高性能嵌入式系统潜力的关键。本文将深入这些细节并结合实际配置案例让你不仅能看懂手册更能用活这个强大的引擎。2. EDMA3架构与事件数据流深度解析要驾驭EDMA3首先得摸清它的“工作流水线”。整个EDMA3系统主要由两大模块构成通道控制器EDMA3 Channel Controller, EDMA3CC和传输控制器EDMA3 Transfer Controller, EDMA3TC。CC是“大脑”负责接收事件、管理参数、调度任务TC是“四肢”负责执行具体的内存读写操作。一个CC可以连接多个TC从而实现传输任务的并行执行。2.1 事件数据流的十个步骤一次完整的EDMA3传输其生命周期从事件触发开始到传输完成结束。官方文档描述的10个步骤是理解其内部运作的蓝图我们结合实践来解读步骤1事件锁存。外部中断、外设如UART的接收完成信号或软件手动触发都会在相应的事件寄存器ER, ESR, CER, QER中置位一个标志位。这就像有快递到了前台登记。这里有个关键点QDMA事件是一种特殊的快速触发方式它通过写一个特定的触发字来直接启动传输省去了事件队列的排队过程适用于对延迟极其敏感的单次传输。步骤2-3事件排队与评估。锁存的事件会根据其通道号进入优先级排序后文详述然后被放入对应的事件队列Event Queue。每个队列关联一个特定的TC。如果此时队列和对应的TC都空闲事件可以“插队”直接进入处理流程。CC接着会去查这个事件对应的PaRAM集。PaRAM集是一个包含源地址、目的地址、传输维度和计数等所有传输参数的“任务工单”。CC会评估这是不是一个“有效工单”非空、非虚拟传输请求。实操心得SER事件置位寄存器这个状态位非常有用。当CC开始处理一个事件时会置位SER中对应的位告诉优先级逻辑“这个事件我已受理别再重复排队了”。在调试时如果发现某个事件似乎没被处理可以检查ER和SER。如果ER置位但SER没有可能事件被更高优先级的事件一直“插队”如果两者都置位了但传输没发生那就要去查PaRAM配置或者TC的状态了。步骤4-5传输请求提交与完成中断。CC确认这是一个有效的传输请求TR后会清除ER和SER中的对应位然后将TR提交给关联的TC。这里涉及一个完成中断的两种模式提前完成Early CompletionTR一提交给TCCC就立即置位中断挂起寄存器IPR。这意味着“任务已派发”但TC可能还在搬数据。这种模式适用于需要快速知道任务已开始的场景。正常完成Normal CompletionCC必须等到TC干完活、返回完成码后才置位IPR。这是最常用的模式确保中断发生时数据搬运已100%完成。步骤6-10TC执行传输。CC将TR的参数编程到TC的寄存器组中。TC内部有读控制器和写控制器。读控制器负责从源地址读取数据到TC内部的FIFO一旦FIFO中有足够数据写控制器就立刻开始向目的地址写入。这个过程是流水线化的读和写可以部分重叠以提高总线利用率。当整个TR完成TC会向CC发送完成状态。整个流程的顺畅运行依赖于对事件、队列、TC和总线资源的精细管理。任何一个环节的瓶颈比如某个TC太忙或总线被高优先级主设备占用都会影响整体性能。2.2 核心寄存器与参数集PaRAM精要EDMA3的配置核心是PaRAM。它不是一个单一的寄存器而是一片连续的内存区域每个PaRAM集包含多个字段。理解几个关键字段是成功配置的基础OPT选项参数这是PaRAM的“大脑”。它定义了传输的几乎所有全局属性。TCCHEN/ITCCHEN传输完成/中间传输完成链接使能。用于实现链式传输一个传输完成自动触发下一个。TCINTEN/ITCINTEN传输完成/中间传输完成中断使能。决定何时产生中断。TCC传输完成码。用于标识是哪个传输完成了在中断服务程序中可以根据这个码来判断是哪个通道的任务完成了。SYNCDIM同步维度。这是最容易混淆的点之一。A-sync一维同步意味着每触发一次事件搬运ACNT个字节。AB-sync二维同步意味着每触发一次事件搬运一整个“数组”ACNT * BCNT个字节。它决定了SRCBIDX和DSTBIDX在何时被加到地址上。SAM/DAM源/目标地址模式。Increment递增是最常用的用于线性地址搬运。Constant恒定则地址不变适用于向同一个寄存器如FIFO连续写入或读出。STATIC静态位。如果置1本次传输完成后PaRAM集内容不会被更新链接操作也不会修改它。这用于固定模式的重复传输。SRC/DST源/目标地址传输的起点和终点。可以是内存地址也可以是外设寄存器地址。ACNT, BCNT, CCNT三维计数EDMA3强大的三维传输能力就体现在这里。你可以把它想象成搬运一个数据立方体ACNT第一维单个数据元素的字节数通常是数组元素的长度。BCNT第二维每“帧”中包含多少个ACNT这样的数组。CCNT第三维一共有多少“帧”。 一次完整的传输总量是ACNT * BCNT * CCNT字节。SYNCDIM决定了每次事件触发搬运的是哪一“层”。SRCBIDX, DSTBIDX, SRCCIDX, DSTCIDX索引这些是地址的“步进”值。BIDX是在完成一个BCNT数组即ACNTBCNT字节后地址需要跳过的字节数。CIDX是在完成一整个“帧”即ACNTBCNT*CCNT字节后地址需要跳过的字节数。正确设置这些索引是实现复杂数据重排如矩阵转置、子帧提取的关键。BCNTRLDBCNT重载值和LINK链接地址用于实现自动重载和链式传输。当一次传输或一次中间传输完成时BCNT可以从BCNTRLD重新加载同时整个PaRAM集可以从LINK指向的地址重新加载。这是实现双缓冲Ping-Pong Buffer或循环传输的核心机制。配置PaRAM时一个常见的坑是地址对齐和传输尺寸。许多内存控制器和总线对突发传输有对齐要求如128位对齐。如果ACNT设置得很小比如1字节但总线宽度是32位那么TC可能无法发起高效的突发传输导致性能急剧下降。通常建议将ACNT设置为总线宽度的整数倍并确保SRC和DST地址也按此对齐。3. 多级优先级仲裁机制详解当多个事件同时发生或者多个传输请求竞争同一个TC或总线资源时谁先谁后EDMA3通过一套四级优先级仲裁机制来解决这个问题理解这套机制对于设计低延迟、高确定性的系统至关重要。3.1 通道优先级Channel Priority这是第一道关卡处理的是事件同时到达CC的情况。假设UART接收通道0和SPI发送通道15在同一时钟周期产生了事件。EDMA3CC内部有一个优先级编码器规则很简单通道号越小优先级越高。对于DMA通道通常0-63或更多通道0优先级最高对于QDMA通道通常0-7同样是通道0最高。如果DMA事件和QDMA事件同时发生DMA事件总是优先于QDMA事件被提交到事件队列。注意事项这意味着在设计系统时你需要把最紧急、最不能容忍延迟的外设比如高速ADC的采样完成信号分配到编号较小的通道上。不要把高实时性任务放在高编号通道否则它可能永远被低编号通道的事件“堵”在后面。3.2 触发源优先级Trigger Source Priority如果一个通道可以通过多种方式触发比如既可以被外部事件触发也可以被软件手动触发还可以被另一个通道链式触发并且这些触发源同时有效那么谁先被服务优先级顺序是事件触发ER 链式触发CER 手动触发ESR。这个规则保证了外部实时事件的响应速度最快。例如一个音频接收通道配置了DMA当外部I2S数据到来事件触发和CPU软件手动触发用于调试同时发生时系统会优先处理真实的数据流避免手动操作干扰实时流。3.3 出队优先级Dequeue Priority事件进入队列后CC需要把它们取出来出队交给TC。EDMA3CC通常有多个事件队列例如Q0, Q1, Q2...每个队列绑定一个特定的TC。出队规则是编号小的队列优先级高。如果Q0和Q1里都有等待处理的事件并且它们对应的TC0和TC1都空闲那么Q0里的事件会先被取出处理。但是这里有一个非常重要的例外情况也是容易产生误解的地方出队优先级是相对于TC的忙闲状态而言的。如果高优先级队列Q0绑定的TC0正忙得不可开交而低优先级队列Q1绑定的TC1却闲着没事干那么CC会“聪明地”先把Q1里的事件出队交给TC1去执行而不是让TC1空等、Q1的事件饿死。这体现了系统整体的效率优化思想。因此在分配队列时策略应该是将实时性要求最高、最需要确定性延迟的通道如音频分配到高优先级队列如Q0并确保该队列绑定的TC没有其他繁重任务。将批量、后台型的传输如内存初始化、大块数据拷贝分配到低优先级队列。3.4 主控传输控制器优先级Master/Transfer Controller Priority这是最终决定“谁先使用总线”的终极仲裁发生在系统互连System Interconnect层面。每个能够发起总线读写请求的主设备包括CPU、DSP核心、EDMA3的各个TC等都有一个可编程的优先级范围通常是0最高到7最低。这个优先级决定了当多个主设备比如TC0和CPU同时想访问同一块共享内存Slave时系统互连仲裁器会先服务谁。这个优先级的影响远大于前面的出队优先级。即使一个传输请求从高优先级队列出队了如果它的TC主控优先级设得很低它的读写命令也可能在总线上被其他高优先级主设备的请求不断插队导致实际传输延迟大增。配置建议非常明确为实时任务分配高主控优先级服务于音频、视频、显示等有严格deadline的外设的TC应该设置为最高或次高优先级如0或1。为后台任务分配低主控优先级用于内存间大块数据搬移等非实时任务的TC应该设置为较低优先级如6或7。注意默认值很多芯片的TC默认主控优先级都是0最高。如果你不重新配置所有TC都会以最高优先级竞争总线可能反而会阻塞CPU对关键代码或数据的访问导致系统性能下降。根据应用场景调整TC的主控优先级是性能调优的关键一步。这四级优先级共同作用构成了EDMA3精细化的调度体系。一个高实时性任务应该被分配到低通道号高通道优先级、使用事件触发、放在高优先级队列、并且其TC拥有高主控优先级。这样就能在各个环节都获得优先权确保最低的传输延迟。4. 传输性能优化实战策略理解了架构和优先级下一步就是榨干EDMA3的性能。手册里提到的几个优化点在实际项目中能带来显著的性能提升。4.1 TC传输优化2D转1D的魔法这是EDMA3 TC内部一个非常智能的优化特性。当我们配置一个二维传输AB同步即一次事件搬运一个BCNT数组每个数组ACNT字节时TC会检查是否满足一系列条件如果满足它会在内部将这次二维传输优化为等效的一维传输。优化条件ACNT≤DBS目标总线突发尺寸通常是总线宽度相关的固定值如128位。ACNT是2的幂次方如1, 2, 4, 8, 16, 32...。SRCBIDXDSTBIDXACNT。BCNT≤ 1023。源和目标地址模式都是递增模式SAM/DAM 0。当这些条件都满足时TC不会傻傻地发出BCNT次ACNT字节的小型读/写命令。而是会“认为”这是一个大小为ACNT ACNT * BCNT的一维传输。这样它就可以根据总线能力发出长度最优的突发传输命令极大减少命令开销提升总线利用率和吞吐量。实战案例对比 假设要传输4096字节的线性数据。低效配置Scenario A:ACNT 4,BCNT 1024,SRCBIDX DSTBIDX 4。由于BCNT1024 1023不满足条件4优化不生效。TC会发出1024次4字节的读写命令效率极低。高效配置Scenario B:ACNT 64,BCNT 64,SRCBIDX DSTBIDX 64。ACNT64是2的幂BCNT64 ≤ 1023其他条件也满足。优化生效TC部将其视为ACNT 4096的一维传输可以发出长度可能是64字节或128字节的突发命令吞吐量可能是Scenario A的十倍以上。核心技巧在设计数据传输尤其是处理图像、音频帧等有规律的数据块时尽量让ACNT等于或接近总的最佳突发长度并确保它是2的幂同时控制BCNT不超过1023。这能自动触发TC的内部优化带来“免费”的性能提升。4.2 读命令速率调节Throttling默认情况下TC的读控制器会以最快速度发出读命令试图尽快填满其内部的FIFO。但在多主设备共享总线的复杂系统中这可能会带来问题。如果一个低优先级的TC疯狂发出读请求占满了目标从设备比如一片DDR内存的命令缓冲区那么高优先级的设备比如CPU或另一个高优先级TC的请求就会被阻塞导致系统实时性受损。RDRATE寄存器就是用来解决这个问题的“油门”。它定义了TC读控制器在发出一个读命令后需要等待多少个时钟周期再发出下一个命令。通过增加RDRATE的值可以主动降低低优先级TC的“攻击性”为高优先级请求让出总线带宽和命令缓冲区资源。配置原则高优先级TC服务于音频、视频等实时流。应将RDRATE设置为较小的值甚至为0即默认最快速度以确保其数据传输的及时性。低优先级TC用于后台内存拷贝等非实时任务。应设置一个较大的RDRATE值如10-100个周期限制其读命令发出速率避免干扰系统关键路径。这个调节和前面提到的主控优先级Master Priority是相辅相成的。主控优先级决定了仲裁的胜负而RDRATE决定了发起竞争的频率。两者结合可以更精细地控制总线流量。4.3 参数集PaRAM链接与双缓冲对于需要连续、不间断传输的场景如音频流、视频流简单的单次配置是不够的。EDMA3的链接Linking机制是实现零开销自动重载的关键。原理在一个PaRAM集的传输即将完成时可以是中间完成ITCCHEN或最终完成TCCHENEDMA3CC会自动从LINK字段指定的地址加载一个新的PaRAM集到当前通道的配置中。同时BCNTRLD字段的值会重载到BCNT计数器。经典应用音频双缓冲Ping-Pong Buffer准备两个相同的PaRAM集比如Set A和Set B。它们除了目标地址DST分别指向缓冲区A和缓冲区B其他参数相同。将通道的初始PaRAM设置为Set A并将其LINK地址指向Set B。将Set B的LINK地址指向Set A。使能通道的传输完成链接TCCHEN1。启动传输通过事件或手动触发。工作流程第一次传输使用Set A的参数将数据搬到缓冲区A。传输完成后自动链接加载Set B下一次传输就使用Set B的参数搬到缓冲区B。Set B的传输完成后又链接回Set A如此循环。在这个过程中CPU可以在EDMA向缓冲区A写数据时处理缓冲区B中的数据实现并行处理完全没有数据搬运的延迟和CPU开销。避坑指南使用链接时务必注意STATIC位的设置。如果STATIC1链接操作将不会更新PaRAM集。通常对于循环双缓冲我们需要STATIC0。另外要确保链接地址指向的是一个有效的、已初始化的PaRAM集否则会导致加载错误参数传输行为不可预测。5. 典型应用场景配置实例剖析理论结合实践我们通过几个典型场景的PaRAM配置来巩固对EDMA3的理解。以下配置基于常见假设实际地址和尺寸需根据具体芯片和内存映射调整。5.1 场景一内存块搬移最基本的1D传输需求将256字节数据从外部存储器地址0x4000_0000搬运到内部L2 SRAM地址0x1180_0000。配置解析同步维度数据是连续的一维块使用A-sync。但注意对于超过64KB的数据需要使用AB-sync并拆分BCNT。地址模式源和目的都是线性递增SAMDAMIncrement。计数ACNT256总字节数BCNT1。因为是一维同步CCNT不起作用设为1。索引SRCBIDX和DSTBIDX在A-sync下每次传输后生效由于我们只传输一次BCNT1它们实际上用不到但通常设为0。SRCCIDX和DSTCIDX同样设为0。链接单次传输不需要链接STATIC1LINK0xFFFF表示空链接。PaRAM配置表示例参数值说明OPT0x0010_0008TCC0, TCINTEN1, SYNCDIM0 (A-sync), STATIC1SRC0x4000_0000源起始地址ACNT256传输字节数BCNT1数组个数为1DST0x1180_0000目标起始地址SRCBIDX0源B索引DSTBIDX0目标B索引BCNTRLD0BCNT重载值单次传输无用LINK0xFFFF空链接地址SRC/DST CIDX0源/目标C索引5.2 场景二视频子帧提取2D到1D传输需求从一幅640x480的16位灰度图像存储在SDRAM中提取一个左上角坐标为(10, 20)、大小为16x12像素的子图像并存放到L2 SRAM进行快速处理。假设图像按行优先存储。配置解析数据布局源图像每像素2字节每行1280字节。子图像起始像素在源中的偏移为Y_offset * 行宽 X_offset20 * 1280 10*225600 2025620字节。同步维度使用AB-sync。一次事件触发我们希望搬运一整行子图像16个像素即32字节。所以ACNT32。计数BCNT12子图像的行数。每次AB同步事件搬运一行ACNT*BCNT? 这里注意对于AB-sync一次事件搬运的是ACNT * BCNT但我们的BCNT是行数需要另一种思路。实际上更常见的配置是将一行子图像看作一个ACNT数组用BCNT表示行数但这样需要12次触发。如果希望一次触发完成整个子图像搬运需要用到链式触发或QDMA。这里假设我们配置为一次触发搬运一行更符合外设逐行输出事件的场景。地址索引SRCBIDX1280在源端每搬运完一行子图像32字节源地址需要跳到下一行的起始位置所以增加一整行的宽度1280字节。DSTBIDX32在目标端数据是连续存放的每行子图像之后地址递增32字节。SRCCIDX和DSTCIDX因为是2D传输AB-syncC维度未使用设为0。PaRAM配置表示例一次事件搬运一行参数值说明OPT0x0010_000CTCC0, TCINTEN1, SYNCDIM1 (AB-sync), STATIC1SRC0x4000_0000 25620子图像起始地址ACNT32一行子图像的字节数 (16像素 * 2字节/像素)BCNT12子图像的行数DST0x1180_0000目标起始地址SRCBIDX1280源行宽字节DSTBIDX32目标行宽字节BCNTRLD12重载值用于链式传输时恢复BCNTLINK0xFFFF空链接SRC/DST CIDX0未使用5.3 场景三数据排序3D传输与链式触发需求将4个数组每个数组1024个4字节元素交错存储的数据重新排序为4个独立的连续数组。原始数据布局A1,B1,C1,D1, A2,B2,C2,D2, ...。目标布局A1,A2,...,A1024, B1,B2,...,B1024, ...。配置解析 这是一个经典的“数组交织”到“数组连续”的转换非常适合用EDMA3的3D传输能力。维度理解ACNT4一个数组元素的大小字节。这里我们一次处理一个元素。BCNT4一次处理多少个数组即A、B、C、D四个数组。CCNT1024每个数组有多少个元素。同步维度使用AB-sync。一次触发我们希望处理所有数组的当前元素即A1,B1,C1,D1这4个元素共16字节。所以一次AB同步传输ACNT*BCNT16字节。地址索引计算关键SRCBIDX ACNT 4在源端每处理完一组A_i, B_i, C_i, D_i源地址需要跳到下一个元素的起始即A_{i1}所以增加一个元素大小4字节。DSTBIDX CCNT * ACNT 1024 * 4 4096在目标端每处理完一组A_i, B_i, C_i, D_i并写入对应位置后目标地址需要跳转到下一个数组的起始位置去写下一个元素。例如写完A1后要跳到B数组的起始位置写B1中间间隔了1024个元素。SRCCIDX ACNT * BCNT 4 * 4 16在源端当处理完所有1024组元素即完成一整个“帧”后源地址需要跳转到下一个“帧”的起始。但这里我们只有一个“帧”4个数组所以这个值在单次触发中用不到主要用于链式传输。DSTCIDX ACNT 4在目标端当处理完所有1024组元素后目标地址需要在一个数组内部移动到下一个元素的位置。例如在A数组内部从A1的位置移动到A2的位置。链式触发由于一次AB同步只能处理BCNT4个数组的一个元素。要处理1024个元素我们需要1024次触发。这可以通过将通道设置为链式触发自身来实现。在PaRAM中设置ITCCHEN1中间传输完成链接并让LINK指向自己或一个重载参数集。这样每完成一次中间传输即处理完一组4个元素就会自动用LINK地址的参数重载通道并且BCNT会从BCNTRLD重载同时SRC和DST地址会根据SRCBIDX和DSTBIDX自动更新。重复1024次后完成整个排序。PaRAM配置表示例简化展示关键参数参数值说明OPT0x0090_0004TCC0,ITCCHEN1(使能中间完成链接), SYNCDIM1 (AB-sync), STATIC0 (允许链接更新)SRC0x4000_0000源交织数据起始地址ACNT4单个元素大小BCNT4数组个数DST0x1180_0000目标连续数据起始地址A数组SRCBIDX4源B索引 ACNTDSTBIDX4096目标B索引 CCNT * ACNT 1024*4BCNTRLD4BCNT重载值LINK0x4800 (PaRAM Set 64地址)链接到一个重载参数集或自身SRCCIDX16源C索引 ACNT * BCNTDSTCIDX4目标C索引 ACNTCCNT1024每个数组的元素个数这个配置非常精妙通过合理设置三维索引和链式触发用硬件自动完成了复杂的数据重排CPU只需发起一次触发或第一个事件。6. 常见问题、调试技巧与系统集成考量即使理解了原理和配置在实际集成EDMA3到系统时依然会遇到各种问题。下面是一些踩过的坑和总结的调试心得。6.1 传输未启动或数据错误症状事件触发了但传输没发生或者传输发生了但数据不对。排查清单通道使能了吗这是最容易被忽略的一步事件寄存器ER捕获事件但事件使能寄存器EER的对应位必须置1CC才会处理该通道的事件。EER是开关。PaRAM集初始化了吗芯片复位后PaRAM内存内容是不确定的。必须在使能通道前将完整的PaRAM参数写入对应的PaRAM集位置。建议在代码中定义一个与PaRAM结构体对齐的数据结构填充后一次性memcpy过去。地址对齐和权限检查源地址和目标地址是否有效、可访问。外设寄存器地址是否正确内存地址是否在缓存一致性问题上需要操作如Cache失效或回写对于DDR内存确保地址是总线对齐的通常是8字节或16字节对齐。事件映射对吗每个外设事件如UART_RX_INT都固定映射到某个EDMA3通道号。需要查阅芯片的《技术参考手册》TRM中的“EDMA3 Event Inputs”表格确保你配置的通道号与实际物理事件对应。传输完成中断处理如果使用了中断确保在中断服务程序ISR中正确读取并清除了中断状态寄存器IPR,ICR。中断未及时清除会导致后续中断无法产生。6.2 性能达不到预期症状理论带宽很高但实测数据传输速度慢。优化检查点TC优化是否生效回顾第4.1节。检查你的2D传输参数是否满足ACNT是2的幂、ACNT ≤ DBS、BCNT ≤ 1023等条件。使用AB-sync时尽量让一次传输的数据块大小ACNT*BCNT是总线突发长度的整数倍。总线竞争使用芯片提供的性能分析工具如TI的System Analyzer或直接读取总线仲裁器的性能计数器查看是否存在高优先级主设备如CPU长时间占用总线导致EDMA3 TC饿死。调整TC的主控优先级Master Priority和读命令速率RDRATE。内存访问特性访问SRAM和访问DDR SDRAM的延迟和带宽天差地别。如果源和目的都在DDR且访问模式是随机的性能会受限于DDR的访问延迟。尽量组织数据为顺序访问。缓存Cache的影响如果CPU和EDMA3共享一片可缓存的内存区域必须处理好缓存一致性。CPU修改了数据要Cache WritebackEDMA3搬来的新数据要Cache Invalidate。忽略这点会导致数据不同步的诡异问题。可以考虑使用Non-Cacheable的内存区域进行DMA缓冲。6.3 系统集成与低功耗管理电源与时钟管理EDMA3作为一个独立的外设模块其时钟可能由PLL分频而来。在进入低功耗模式前必须确保EDMA3没有 pending 的活动。正确的顺序是禁用相关的外设停止产生事件。禁用EDMA3通道清除EER。查询EDMA3CC状态寄存器CCSTAT确认没有pending的事件、队列为空、传输逻辑空闲。查询各个EDMA3TC的状态寄存器TCSTAT确认读写控制器空闲。通过电源睡眠控制器PSC请求关闭EDMA3CC和TC的时钟。 这个过程不能颠倒否则可能导致DMA在休眠过程中访问总线引发错误或无法唤醒。仿真Emulation暂停在连接仿真器如JTAG进行单步调试时CPU会被暂停但EDMA3会继续运行这可能导致外设数据被DMA搬走而CPU来不及处理或者DMA修改了CPU即将读取的内存。调试涉及DMA的实时程序时需要特别注意这一点。有时需要暂时禁用DMA通道来进行调试。多核系统中的使用在多核DSP中EDMA3通常是一个共享资源。需要建立清晰的软件协议来管理PaRAM集的分配、通道的分配避免多个核心同时配置同一资源造成冲突。通常可以采用集中式管理由一个核心负责所有DMA配置或分区式管理每个核心管理固定范围的通道和PaRAM集。