1. 项目概述从DMA到EDMA的架构演进在嵌入式系统开发尤其是涉及音视频编解码、网络数据包处理或高速数据采集的场景里我们最常遇到的性能瓶颈往往不是CPU的计算能力而是数据在内存与外设、内存与内存之间搬运的效率。传统上这类数据搬运需要CPU通过软件循环一条条指令地执行加载Load和存储Store操作这不仅消耗宝贵的CPU周期还会因频繁访问总线而增加系统延迟。为了解决这个问题直接内存访问DMA技术应运而生。它就像一个专门负责“搬家”的协处理器CPU只需要告诉它“从哪里搬”、“搬到哪里”、“搬多少”剩下的搬运工作就全权交给DMA控制器CPU则可以腾出手来处理更复杂的计算任务。然而随着系统复杂度的提升简单的单通道DMA逐渐力不从心。现代片上系统SoC通常集成了数十个需要高速数据交换的外设和加速器它们对DMA的并发能力、调度灵活性和资源管理提出了更高要求。这就催生了增强型DMAEDMA架构。与传统的DMA控制器不同EDMA通常采用一种更模块化、更解耦的设计思想将“调度管理”和“传输执行”两个核心功能分离。这正是德州仪器TI在其许多高性能DSP平台如C64x系列中采用的经典设计尤其是在IVA2.2图像、视频、音频子系统中其EDMA的实现堪称教科书级别的范例。在IVA2.2的EDMA架构中核心是两个关键组件第三方通道控制器Third-Party Channel Controller, TPCC和第三方传输控制器Third-Party Transfer Controller, TPTC。简单理解TPCC是“大脑”和“调度中心”它管理着所有的传输请求Channel决定谁先谁后执行而TPTC是“双手”和“执行单元”它根据TPCC下发的指令实际执行内存的读写操作。一个TPCC可以连接多个TPTC实现并行数据传输。这种分工明确的架构使得系统能够高效地处理来自CPU、外设事件或链式触发的大量并发传输任务是实现高带宽、低延迟数据传输的基石。本文将深入拆解TPCC与TPTC的内部工作机制、协同流程以及关键配置为你呈现一幅清晰的EDMA系统运作图景。2. 核心架构解析TPCC与TPTC的职责划分要理解EDMA的高效之处必须首先厘清TPCC和TPTC各自扮演的角色以及它们之间的交互关系。这绝非一个简单的“主从”结构而更像一个精密的“指挥中心”与“执行部队”的协作体系。2.1 TPCC智能的传输调度中枢TPCC的核心职责是调度、仲裁和提交用户编程的传输请求。你可以把它想象成一个高度智能的交通指挥中心。2.1.1 核心资源参数RAMPaRAMTPCC管理的核心资源是一块专用的参数RAMParameter RAM它最多可容纳128个参数集PaRAM Entry。每个参数集都是一个完整的“传输任务工单”包含了这次传输的所有必要信息源地址SRC和目标地址DST数据从哪里来到哪里去。传输计数ACNT, BCNT定义了传输的维度后文详述。地址索引SRCBIDX, DSTBIDX, SRCCIDX, DSTCIDX用于在复杂的数据结构如二维数组中跳转。选项OPT包含传输完成码TCC、同步类型、地址模式等控制位。链接地址LINK指向下一个参数集的地址用于实现链式传输或乒乓缓冲。这128个参数集是动态分配的最多64个DMA通道每个通道映射到一个参数集。这些通道可以被外部事件如McBSP接收完成、软件手动设置或链式完成触发。最多8个QDMA通道同样映射到参数集。QDMA的触发方式更“自动化”通常由CPU通过内部DMAIDMA写入特定触发字来间接触发特别适合需要CPU快速配置一系列连续传输的场景。剩余的作为链接入口用于存储链式传输中下一个任务的参数或者作为空闲池。2.1.2 事件管理与优先级仲裁TPCC如何知道该执行哪个任务它通过多种方式接收“触发信号”事件触发Event-triggered由外部硬件信号如外设中断置位事件寄存器ER相应位。手动触发Manually triggered由CPU软件直接写事件置位寄存器ESR来启动传输。链式触发Chain-triggered当一个传输完成时其完成码TCC会触发链事件寄存器CER从而自动启动下一个关联的传输。QDMA自动触发Auto-triggeredCPU通过IDMA向一个特定的“触发字”地址写入数据自动触发QDMA通道。当多个触发事件同时到来时TPCC内置的优先级编码器开始工作。其仲裁规则非常明确通道间优先级通道号越小优先级越高Channel 0优先级最高。DMA vs QDMADMA事件的优先级始终高于QDMA事件。触发类型优先级针对同一通道事件触发 链式触发 手动触发。仲裁胜出的事件会被放入两个事件队列Q0和Q1中等待。Q0的优先级高于Q1。每个队列深度为16采用FIFO先进先出方式服务。这里有一个优化机制如果事件到来时队列为空且TPTC也处于空闲发出empty信号则该事件可以绕过队列直接进入PaRAM处理逻辑提交给TPTC从而减少延迟。2.2 TPTC高效的传输执行引擎如果说TPCC是下订单的那么TPTC就是厨房里炒菜的。TPTC是实际生成总线读写命令、完成数据搬运的硬件单元。在IVA2.2子系统中通常有两个TPTC实例TPTC0和TPTC1可以并行工作。2.2.1 内部结构与流水线每个TPTC内部结构精巧旨在最大化总线利用率和传输效率程序寄存器组Program Register Set这是一个“待命区”。当TPCC提交一个新的传输请求TR时其对应的PaRAM参数会被加载到这里。TPTC不会修改这里的值。源活动寄存器组Source Active Register Set和目标FIFO寄存器组Distant FIFO Register Set这是“工作区”。程序寄存器组中的参数会被拷贝到这两个活动寄存器组中分别指导读控制器和写控制器的工作。它们独立运作使得读和写操作可以流水线化。通道FIFO这是一个数据缓冲区。读控制器从源地址读取的数据先暂存于此然后写控制器再从中取出数据写入目标地址。TPTC0的FIFO深度为256字节TPTC1为128字节这决定了其传输流水线的深度。读/写控制器及本地互连接口它们负责根据活动寄存器组中的地址和计数信息向系统总线发起最优大小的读写命令基于64字节的突发传输。完成接口当整个传输请求完成后TPTC通过此接口向TPCC报告完成状态用于触发链式事件或CPU中断。2.2.2 传输几何与同步TPTC支持的传输模式非常灵活通过三个维度来定义一次传输的“形状”ACNT数组长度一次同步触发所传输的连续字节数。可以理解为一行数据。BCNT帧数量有多少个这样的ACNT数组。可以理解为一幅图像有多少行。CCNT块数量有多少个这样的BCNT帧。可以理解为一个视频有多少帧。TPTC直接支持两种同步类型1维同步传输1D-sync每次触发一个事件传输一个ACNT数组一行。传输完BCNT个数组后地址根据CIDX块索引更新跳转到下一个“块”的起始行。2维同步传输2D-sync每次触发传输一整个“帧”BCNT个ACNT数组。传输完一帧后地址根据CIDX更新跳转到下一帧的起始地址。3维传输可以通过链式Chaining多个1D或2D传输来实现。这种设计非常贴合图像、视频等数据的处理。例如搬运一个宽度 x 高度的图像使用2D同步设置ACNT 图像宽度字节BCNT 图像高度SBIDX/DBIDX 一行数据的步长通常等于宽度。这样一个外部事件如一帧图像采集完成就能触发整个图像数据的搬运。使用1D同步链式设置ACNT 图像宽度BCNT 图像高度并为该参数集设置一个完成码TCC。同时配置另一个参数集其链接地址指向自己并设置被第一个参数集的TCC链式触发。这样每传输完一行1D同步就会触发自己传输下一行直到整个帧完成。3. 协同工作流程从事件到数据传输的完整路径理解了TPCC和TPTC的个体能力后我们来看它们是如何携手完成一次高效的数据传输的。这个过程就像一条精心设计的流水线。3.1 流程全景图一次完整的EDMA传输通常遵循以下步骤初始化配置CPU或系统初始化代码根据数据传输需求编写好PaRAM参数集。例如需要从McBSP接收数据到L2内存则配置好源地址McBSP数据寄存器、目标地址L2缓冲区、传输计数、索引以及OPT中的同步类型、完成码等。通道映射与使能通过TPCC_DCHMAP寄存器将某个DMA通道例如通道10映射到上一步配置好的PaRAM条目。同时使能该通道的事件触发设置TPCC_EER寄存器。事件触发外部事件发生如McBSP接收缓冲区满硬件信号置位TPCC_ER[10]。TPCC调度TPCC检测到ER[10]被置位且该通道已使能。调度器在所有待处理的DMA/QDMA事件中进行优先级仲裁。假设通道10胜出TPCC检查事件队列和TPTC状态。如果TPTC空闲empty信号有效则直接进入“旁路”路径否则事件被放入优先级更高的事件队列Q0或Q1中排队。参数处理与提交当TPTC准备好接收新任务时TPCC从事件队列头部取出事件。根据通道映射找到对应的PaRAM条目。TPCC将PaRAM中的八个32位字打包成一个传输请求TR包通过配置接口提交给TPTC的程序寄存器组。关键动作提交后TPCC会立即根据本次传输的几何参数如BCNT, CIDX等更新该PaRAM条目中的地址和计数为下一次触发做好准备例如目标地址增加一个偏移为接收下一帧数据做准备。这是实现乒乓缓冲、环形缓冲等高级功能的基础。TPTC执行传输TPTC将程序寄存器组中的TR参数加载到源活动寄存器组和目标FIFO寄存器组。读控制器开始根据源地址和ACNT以64字节为突发大小发起读操作数据流入通道FIFO。写控制器从FIFO中取出数据根据目标地址发起写操作。读和写操作并行进行形成流水线。TPTC0支持4级TR流水线深度意味着它可以同时处理多达4个传输请求的读操作只要FIFO有空间。完成通知当整个TR可能是1个数组、1帧或1块的所有数据搬运完成后TPTC通过完成接口向TPCC发送完成信号并携带OPT中预设的传输完成码TCC。TPCC根据该TCC值设置链事件寄存器CER的相应位如果配置了链式触发则会自动触发下一个映射到该TCC的通道。同时TPCC也会设置中断挂起寄存器IPR的相应位如果该通道的中断使能IER已打开则会向CPU发出中断通知本次传输完成。3.2 关键机制链式传输与乒乓缓冲这是EDMA系统提升效率的两个“杀手锏”完全由TPCC和PaRAM协同实现。链式传输Chaining允许一个传输的完成自动触发另一个传输的开始无需CPU干预。实现方式是在PaRAM的OPT字段中设置TCCHEN位并指定一个TCC值例如0x05。同时将另一个通道例如通道15的链事件使能寄存器CER中对应TCC的位使能并映射到另一个PaRAM条目。当通道10的传输完成时TPCC会置位CER[5]从而立即触发通道15开始传输。这可以用于构建复杂的传输序列。乒乓缓冲Ping-Pong Buffering常用于连续数据流处理以避免数据覆盖。需要两个PaRAM条目Set A和Set B和两个DMA通道或一个通道通过链式切换。初始化Set A指向缓冲区0Set B指向缓冲区1。启动通道映射到Set A传输数据到缓冲区0。在Set A的OPT中设置完成码TCC_A并启用链式使其链接到Set B的地址。在Set B的OPT中设置完成码TCC_B并启用链式使其链接回Set A的地址。当Set A的传输完成时触发链式事件TPCC会自动将当前通道的参数更新为Set B指向缓冲区1并开始下一次传输。同时CPU可以处理缓冲区0中的数据。当Set B传输完成时又链式触发切换回Set A。如此循环实现了数据传输和处理的并行。4. 实战配置详解以2D同步传输为例理论讲得再多不如一段实际配置代码来得直观。下面我们以IVA2.2子系统为例演示如何配置一个典型的2D同步DMA传输将一块图像数据从外部存储器搬运到内部L2内存。假设我们需要搬运一个RGB图像宽度为640像素每像素3字节即1920字节高度为480行。我们使用DMA通道8采用2D同步模式传输完成后产生中断。4.1 PaRAM参数集配置首先我们需要在内存中准备好PaRAM数据结构。通常我们会定义一个结构体来对应PaRAM的8个32位字typedef struct { uint32_t opt; // 选项字 uint32_t src; // 源地址 uint32_t dst; // 目标地址 uint32_t cnt; // 计数 (BCNT[31:16] | ACNT[15:0]) uint32_t idx; // 索引 (DSTBIDX[31:16] | SRCBIDX[15:0]) uint32_t rld; // 重载 (LINK[31:16] | BCNTRLD[15:0])2D同步时BCNTRLD无效 uint32_t link; // 链接地址 (高16位为0低16位为下一个PaRAM条目地址 5) uint32_t cidx; // C索引 (DSTCIDX[31:16] | SRCCIDX[15:0]) } edma_param_set_t; // 在内存中分配PaRAM通常有特定基地址例如0x01C04000 volatile edma_param_set_t* param_set (volatile edma_param_set_t*)(0x01C04000 (8 * sizeof(uint32_t) * 10)); // 假设使用条目10现在填充这个参数集// 1. 选项字 OPT // BIT[1:0]: 同步类型。 00手动 01绝对地址 101D同步 112D同步。 // BIT[17:12]: 传输完成码 TCC用于链式或中断。我们设为0x08。 // BIT[20]: TCINTEN传输完成中断使能。1使能。 // BIT[22]: TCCHEN传输完成链式使能。0禁用本例仅用中断。 // BIT[25:24]: 地址模式。00递增01固定10... param_set-opt (0x3 0) | // 2D同步 (0x08 12) | // TCC 8 (1 20) | // 使能传输完成中断 (0 22) | // 禁用链式 (0x0 24); // 源和目标地址都采用递增模式 // 2. 源地址和目标地址 param_set-src (uint32_t)external_image_buffer; // 外部存储中的图像起始地址 param_set-dst (uint32_t)l2_image_buffer; // L2内存中的目标缓冲区起始地址 // 3. 计数 CNT // ACNT: 每个数组的字节数即图像一行的字节数。 // BCNT: 每帧中的数组数量即图像的行数。 uint16_t acnt 640 * 3; // 1920 字节/行 uint16_t bcnt 480; // 480 行 param_set-cnt (bcnt 16) | acnt; // 4. 索引 IDX (B维度索引) // SRCBIDX: 源地址在每传输完一个ACNT数组后的偏移。对于连续存储的图像偏移就是一行字节数。 // DSTBIDX: 目标地址的B维度索引。 param_set-idx (acnt 16) | acnt; // SBIDX和DBIDX都设为acnt // 5. 重载 RLD // BCNTRLD: 用于1D同步重载BCNT2D同步下无效。 // LINK: 链接到下一个PaRAM条目的地址右移5位因为每个条目32字节对齐。 // 本例不链接可以设为0或自链接用于环形缓冲。 param_set-rld 0; // 无重载无链接 // 6. 链接地址 LINK // 如果使用链式这里存放下一个参数集的地址 5。 param_set-link 0; // 7. C索引 CIDX // SRCCIDX: 源地址在每传输完一帧BCNT个数组后的偏移。对于单帧传输通常为0。 // DSTCIDX: 目标地址的C维度索引。 param_set-cidx 0; // 单帧传输无C维度跳转4.2 TPCC通道配置接下来需要将DMA通道8映射到我们刚刚配置好的PaRAM条目10并启用相应的事件和中断。// 假设TPCC寄存器基地址为 0x48000000 volatile uint32_t* TPCC_DCHMAP8 (volatile uint32_t*)(0x48000000 0x100 8*4); // 通道映射寄存器 volatile uint32_t* TPCC_EER (volatile uint32_t*)(0x48000000 0x020); // 事件使能寄存器 volatile uint32_t* TPCC_IER (volatile uint32_t*)(0x48000000 0x030); // 中断使能寄存器 volatile uint32_t* TPCC_ECR (volatile uint32_t*)(0x48000000 0x024); // 事件清除寄存器可选 // 1. 映射通道8到PaRAM条目10 // PAENTRY字段在[13:5]位指定条目编号。 *TPCC_DCHMAP8 (10 5); // PAENTRY 10 // 2. 清除可能存在的旧事件可选良好习惯 *TPCC_ECR (1 8); // 清除通道8的事件标志 // 3. 使能通道8的事件触发 *TPCC_EER | (1 8); // 4. 使能通道8的传输完成中断对应TCC8 // 中断使能寄存器可能分为IER和IERH对应64个通道。TCC8对应第8位。 // 需要查阅具体手册确认。假设是单个64位寄存器用两个32位寄存器表示。 volatile uint32_t* TPCC_IERL (volatile uint32_t*)(0x48000000 0x030); volatile uint32_t* TPCC_IERH (volatile uint32_t*)(0x48000000 0x034); *TPCC_IERL | (1 8); // 使能TCC 8的中断假设在低32位4.3 启动传输与中断处理配置完成后可以通过手动触发写ESR或等待外部事件来启动传输。// 手动启动传输用于测试 volatile uint32_t* TPCC_ESR (volatile uint32_t*)(0x48000000 0x018); *TPCC_ESR (1 8); // 手动置位通道8的事件 // 或者如果配置了外部事件如McBSP RX事件则无需此步骤硬件会自动触发。在CPU端需要编写中断服务程序ISR来处理传输完成中断// 中断服务程序示例 void EDMA_ISR(void) { // 1. 读取中断挂起寄存器 IPR判断是哪个TCC触发的中断 volatile uint32_t* TPCC_IPRL (volatile uint32_t*)(0x48000000 0x028); volatile uint32_t* TPCC_IPRH (volatile uint32_t*)(0x48000000 0x02C); uint32_t ipr_low *TPCC_IPRL; // 2. 检查是否是TCC8触发的中断 if (ipr_low (1 8)) { // 传输完成可以处理L2内存中的数据了... process_image_in_l2(l2_image_buffer); // 3. 清除中断挂起位写1清除 *TPCC_IPRL (1 8); // 写1清除第8位 // 4. 可选如果需要连续传输例如乒乓缓冲可以在这里重新触发通道或配置下一个参数集。 // 例如切换PaRAM条目到另一个缓冲区然后再次手动触发。 // *TPCC_ESR (1 8); } // ... 处理其他中断位 }注意在实际系统中中断控制器的配置如IVAGEM或WUGEN、中断向量的设置、以及缓存一致性操作如果使用了Cache都是必不可少的步骤此处为简化示例未列出。务必参考具体芯片的参考手册和编程指南。5. 高级主题与性能优化技巧掌握了基础配置后如何让EDMA发挥极致性能以下是一些来自实践的经验和深入原理。5.1 QDMA的妙用降低CPU配置开销DMA通道需要CPU显式地写事件置位寄存器ESR或等待外部事件。而QDMA提供了一种“自动触发”机制。其核心是TPCC_QCHMAPj寄存器它定义了一个“魔法地址”。当CPU使用IDMA内部DMA一种极低开销的块搬移引擎向这个“魔法地址”写入数据时写入操作本身就会触发一次QDMA传输写入的数据内容会被忽略。典型应用场景需要CPU快速初始化或触发一系列小型、连续的传输。例如在音频处理中需要将多个分散的小缓冲区数据汇总到一个大缓冲区。CPU可以先用IDMA快速设置好一个QDMA参数集源地址递增目标地址固定然后通过向QDMA触发地址执行一次IDMA写操作即使写入垃圾数据就能立即启动一次传输比写ESR再等待调度要快得多。配置要点配置一个PaRAM条目作为QDMA参数集。设置TPCC_QCHMAPj寄存器将QDMA通道j映射到该PaRAM条目并指定触发字TRWORD即PaRAM条目8个字中的哪一个字被写入时触发。使能QDMA事件TPCC_QEER。CPU通过IDMA向TPCC_QCHMAPj中定义的物理地址执行一次写操作传输立即开始。5.2 内存保护与访问权限在复杂的多核或安全敏感系统中防止DMA错误地覆盖关键内存区域至关重要。TPCC支持内存保护功能。通过配置内存保护区域寄存器可以定义允许或禁止EDMA访问的地址范围。一旦DMA传输试图访问受保护的区域会触发保护错误事件并可能产生中断。在系统初始化时合理设置内存保护是提高系统鲁棒性的重要手段。5.3 传输性能深度调优对齐与突发传输TPTC的本地互连接口以64字节为突发大小进行读写。为了获得最佳带宽应确保源地址和目标地址至少64字节对齐并且传输尺寸ACNT最好是64字节的倍数。非对齐或非倍数的访问会导致总线效率下降。流水线深度利用TPTC0支持4级TR流水线。这意味着它可以同时处理最多4个传输请求的“读阶段”。为了充分利用这一点可以尝试将一个大传输拆分成多个较小的、连续的传输请求并通过链式触发链接起来。这样当TPTC0还在处理第一个TR的写操作时它可能已经在读取第二个、第三个TR的数据了从而隐藏了内存访问延迟。队列优先级策略TPCC有两个事件队列Q0和Q1。将实时性要求最高的通道如音频DAC的喂数据通道分配到高优先级队列Q0并将通道号设置得较小如0-15以确保其触发后能获得最快的响应。将批量性、后台传输任务分配到Q1或较高的通道号。1D同步 vs 2D同步的选择2D同步适合搬运完整的、连续的内存块如图像的一帧。它只需要一次触发TPCC和TPTC内部处理二维索引效率最高CPU干预最少。1D同步适合处理非连续的数据如隔行扫描数据、分散-收集操作。或者当你需要更精细地控制传输节奏时例如每收到一行数据就处理一行可以使用1D同步加链式实现“流水线式”处理。避免资源冲突TPCC的PaRAM只有128个条目DMA和QDMA通道共享。在复杂应用中需要精心规划这些资源。例如将频繁使用的、固定的传输路径如摄头到显示的参数集长期驻留在PaRAM中将临时性的、一次性的传输使用后及时释放可通过链接到一个空参数集或禁用通道。5.4 调试与问题排查实录在实际开发中EDMA配置出错是常见问题现象可能是数据传输错误、系统挂死或中断不触发。以下是一些排查思路传输根本没启动检查触发源如果是事件触发用示波器或逻辑分析仪确认硬件事件信号是否到达。如果是手动触发检查写ESR的代码是否正确执行检查寄存器值。检查通道映射确认TPCC_DCHMAPn寄存器中的PAENTRY值是否指向了已正确配置的PaRAM条目。检查使能位确认TPCC_EER事件使能或TPCC_QEERQDMA使能相应位是否已置1。检查PaRAM内容直接读取PaRAM内存区域确认8个参数字是否与预期一致特别是OPT中的同步类型、地址模式。数据传输错乱地址或数据错误检查地址和索引这是最常见的原因。确认SRC、DST地址是否正确SBIDX/DBIDX是否计算正确。对于2D传输要清楚BIDX是在每个ACNT数组行传输后的地址偏移而CIDX是在每帧BCNT行传输后的地址偏移。检查字节序确保源数据和目标数据的字节序Endianness与系统配置一致。IVA2.2通常为小端模式。检查缓存一致性如果源或目标地址位于CPU的缓存内存如L1D中在启动DMA前必须确保缓存数据已写回内存Cache Writeback否则DMA读到的是旧数据在DMA完成后如果CPU要读取目标数据必须使对应缓存行失效Cache Invalidate否则CPU读到的是缓存中的旧数据。中断不触发检查OPT配置确认OPT字中的TCINTEN位已使能并且TCC字段设置了一个值例如0-63。检查中断使能确认TPCC_IER寄存器中对应TCC值的位已使能。检查中断控制器EDMA的中断输出连接到系统的中断控制器如IVAGEM。需要确认在中断控制器中该EDMA中断线是否已正确映射到CPU中断并且CPU全局中断和该中断线已使能。检查完成状态读取TPCC_IPR中断挂起寄存器看对应的位是否被置起。如果置起了但没进中断问题在中断控制器或CPU如果没置起问题在TPTC的完成接口或OPT配置。系统性能不达预期检查总线竞争使用性能分析工具或监控总线统计寄存器查看EDMA访问的存储体或外设是否正被CPU或其他主设备频繁访问导致总线拥塞。可以考虑调整访问时序或使用内存仲裁优先级设置。检查TPTC流水线确认是否充分利用了TPTC的流水线深度。对于大量小规模传输考虑使用链式或QDMA来减少TPCC调度开销。监控队列状态TPCC有事件队列如果队列经常满说明触发事件速率超过了TPTC的处理能力需要考虑优化传输粒度或使用更高优先级的队列。理解EDMA尤其是TPCC/TPTC这种分离式架构是驾驭现代高性能嵌入式处理器释放其数据吞吐潜力的关键。它不再是一个简单的“数据搬运工”而是一个可编程、可调度、高度并发的数据流引擎。从初始化参数集到理解事件仲裁队列再到优化传输几何和利用链式与QDMA每一步都需要结合具体应用场景深思熟虑。希望这篇深入的解析能帮助你不仅仅是配置EDMA更能设计出高效、可靠的数据传输通路。