深入解析以太网MAC PPS输出与DMA配置:实现高精度网络同步的关键
1. 项目概述与核心价值在工业自动化、电力系统同步、5G基站前传这些对时间极度敏感的领域网络设备之间的时钟偏差哪怕只有几微秒都可能导致控制指令错乱、数据采样不同步甚至引发严重的生产事故。传统的软件NTP协议精度在毫秒级早已无法满足需求。这时PTP精确时间协议及其配套的硬件时间戳技术就成了刚需。而PTP的“最后一公里”——将协议计算出的精确时间转化为物理世界可观测、可使用的同步信号——就落在了以太网MAC控制器的PPS每秒脉冲输出功能上。很多人拿到TI的Tiva™ C系列或者类似带硬件PTP的MCU数据手册看到那几十页关于以太网MAC和DMA的寄存器描述尤其是像EMACPPSCTRL、EMACDMABUSMOD这类寄存器往往觉得头大直接拷贝官方驱动库的默认配置了事。但这恰恰错过了进行深度性能调优和解决棘手同步问题的机会。PPS输出不只是一个简单的脉冲它的频率、相位、触发方式以及与DMA数据传输的协作直接决定了你的系统能否在复杂的网络负载下依然保持稳定的亚微秒级同步精度。本文将从一个实际调试者的角度深入拆解以太网MAC中PPS控制与DMA总线配置的核心寄存器。我不会只翻译数据手册而是结合我在多个高精度同步项目中的踩坑经验告诉你每个比特位背后的设计逻辑、配置时的权衡取舍以及那些手册里不会写的“坑点”。例如为什么在数字翻转模式下2Hz的PPS信号周期不是严格的500ms如何配置DMA突发长度才能让时间戳报文和业务数据流互不干扰这些实战细节才是稳定实现高精度网络同步的关键。2. PPS控制寄存器EMACPPSCTRL深度解析PPS信号的核心是提供一个与系统绝对时间严格对齐的周期性硬件触发信号。EMACPPSCTRL寄存器偏移地址0x72C就是控制这个信号的“大脑”。它的配置直接决定了PPS信号的行为模式理解其每一位至关重要。2.1 核心控制位PPSEN0与PPSCTRL的协作模式PPSEN0位4是这个寄存器最重要的模式开关。它决定了低4位PPSCTRL[3:0]的功能。当PPSEN0 0时我们处于固定频率输出模式。此时PPSCTRL的值直接控制EN0PPS引脚输出的脉冲频率。这是一个非常直观的模式常用于生成一个稳定的时钟参考源。数据手册中的Table 24-25列出了对应关系PPSCTRL0输出1HzPPSCTRL1输出2Hz二进制翻转模式或1Hz数字翻转模式以此类推最高可达32.768kHz。这里就引出了第一个关键概念二进制翻转Binary Rollover与数字翻转Digital Rollover模式。这是由系统时间纳秒寄存器EMACTIMNANO的更新方式决定的。二进制翻转可以理解为纳秒计数器的每个比特位独立翻转能产生占空比严格为50%的方波频率是标称值。数字翻转纳秒计数器是普通的递增计数器其比特位的翻转是非线性的。这会导致生成的脉冲序列周期不均匀。手册举了一个生动的例子当配置为2HzPPSCTRL0x2时实际输出是一个537ms的方波紧跟着一个463ms的方波其低电平268ms高电平195ms如此循环。平均频率是2Hz但瞬时周期在波动。这对于需要严格周期性的应用如ADC采样触发可能是不可接受的必须选择二进制翻转模式或接受其特性。当PPSEN0 1时我们进入灵活命令模式。此时PPSCTRL不再控制频率而是用于向MAC发送命令以非周期性的方式控制PPS信号的产生。这是一个高级功能允许你在一个特定的绝对时间点由EMACTARGSEC和EMACTARGNANO寄存器定义触发单个脉冲或脉冲串并可以随时命令其停止。例如PPSCTRL 0x2: 命令START pulse train。在目标时间点开始输出脉冲串脉冲间隔由EMACPPS0INTVL寄存器定义脉冲宽度由EMACPPS0WIDTH定义。这个脉冲串会一直运行直到收到停止命令。PPSCTRL 0x5: 命令STOP pulse train at time。在另一个编程的目标时间点停止脉冲串。PPSCTRL 0x6: 命令STOP pulse train immediately。立即停止脉冲串。实操要点与避坑指南模式切换的原子性在切换PPSEN0模式前务必确保PPSCTRL位域为0。手册明确警告“Software should ensure that these bits are programmed only when they are ‘all-zeros.’” 最好的做法是先读取整个寄存器值在内存中修改相应比特位然后一次性写回。命令的异步性当你向PPSCTRL写入一个命令值如0x2启动脉冲串这个命令需要被同步到PTP时钟域。在此期间硬件会自动清空PPSCTRL位域。因此软件不能通过反复读取PPSCTRL来判断命令是否正在执行而应该通过查询状态寄存器或监测EN0PPS引脚的实际输出来确认。目标时间寄存器TRGMODS0位[6:5]TRGMODS0决定了EMACTARGSEC/NANO寄存器的用途。它有三种模式00: 仅用于产生中断事件。01:保留值不要使用。10: 用于产生中断并启动/停止PPS信号。11: 仅用于启动/停止PPS信号不产生中断。 在灵活命令模式下如果你需要PPS信号在特定时间点动作通常将TRGMODS0设置为10或11并提前设置好目标时间。特别注意目标时间是基于PTP系统时间的必须确保你的PTP时钟已经完成与主时钟的同步且是单调递增的。2.2 间隔与宽度寄存器定义脉冲的“形状”EMACPPS0INTVL偏移0x760和EMACPPS0WIDTH偏移0x764这两个寄存器共同定义了PPS脉冲信号的时序特征。它们的单位是“亚秒增量值”sub-second increment value通常就是PTP参考时钟的周期。EMACPPS0INTVL(PPS0INT): 定义了两个脉冲上升沿之间的间隔。计算公式为编程值 所需间隔周期数 - 1。例如PTP参考时钟为25MHz周期40ns想要每120ns3个周期一个脉冲则需写入3 - 1 2。EMACPPS0WIDTH(PPS0WIDTH): 定义了一个脉冲内上升沿到下降沿的宽度即高电平持续时间。计算公式同样为编程值 所需宽度周期数 - 1。关键约束手册用Note特别强调PPS0WIDTH的编程值必须小于PPS0INTVL的编程值。这是显而易见的逻辑因为脉冲宽度不能大于脉冲周期否则就不是脉冲而是持续高电平了。但在编程时务必在代码中加入有效性检查防止配置错误导致不可预期的输出。配置示例生成一个25MHz参考时钟分频后的1MHz方波假设PTP参考时钟为25MHz40ns周期。我们需要生成一个1MHz周期1000ns的方波即高电平和低电平各500ns。计算周期所需时钟数1000ns / 40ns 25个周期。计算PPS0INTVL寄存器值25 - 1 24 (0x18)。计算高电平宽度所需时钟数500ns / 40ns 12.5个周期。由于周期必须是整数我们取12或13个周期会导致占空比轻微偏离50%。假设取12个周期。计算PPS0WIDTH寄存器值12 - 1 11 (0x0B)。配置EMACPPSCTRL设置PPSEN00PPSCTRL0x0固定1Hz模式在此不适用我们需要用灵活命令或理解频率模式与间隔寄存器的关系。实际上在PPSEN00的固定频率模式下频率由PPSCTRL直接选择INTVL和WIDTH可能被忽略或用于其他含义。对于自定义频率方波通常需使用PPSEN01的命令模式并设置INTVL和WIDTH然后发送启动脉冲串命令。更常见的做法是利用固定频率模式的高频输出再通过外部逻辑分频。这里揭示了手册的一个易混淆点在固定频率模式INTVL/WIDTH寄存器可能不生效。对于非标准频率灵活命令模式配合INTVL/WIDTH才是正解。3. DMA总线模式寄存器EMACDMABUSMOD配置优化以太网数据吞吐量和实时性不仅取决于CPU和MAC更取决于DMA直接内存访问控制器搬运数据的效率。EMACDMABUSMOD寄存器偏移0xC00就是DMA引擎与系统总线如AHB之间的“交通规则制定者”。配置不当会导致总线拥堵严重影响PTP时间戳报文的及时处理。3.1 突发传输配置提升总线效率的关键DMA传输不是一次搬一个字节而是以“突发”Burst为单位连续传输多个数据单元如32位字。这能极大减少总线仲裁的开销提升效率。PBL[13:8](Programmable Burst Length) 定义了TX DMA当USP0时也用于RX DMA单次突发传输的最大字数1, 2, 4, 8, 16, 32。不是任何值都有效必须是这些特定值否则行为未定义。RPBL[22:17](RX DMA Programmable Burst Length) 当USP位23置1时用于单独设置RX DMA的突发长度。8xPBL(位24) 一个倍增器。当置1时PBL和RPBL的值会乘以8。这意味着你可以配置出1, 8, 16, 32, 64, 128, 256等更大的突发长度。配置大突发长度的正确步骤是先置位8xPBL再设置PBL的值。例如需要64字的突发则设置8xPBL1PBL0x8因为8*864。如何选择突发长度这需要在“总线利用率”和“延迟”之间权衡。大突发长度如32或64能最大化总线带宽利用率适合大数据流传输如文件传输、视频流。当DMA占据总线时会连续传输大量数据减少仲裁次数。小突发长度如4或8总线占用时间短能更快释放总线给其他主设备如CPU、另一个DMA控制器。这对于高优先级、小数据量的实时任务如PTP事件报文、控制指令更友好能降低其等待延迟。建议在混合流量系统中可以为TX和RX设置不同的突发长度。例如RX路径可能接收大量数据可以设置较大的RPBL如32。TX路径可能发送关键的控制和PTP报文可以设置较小的PBL如4或8并配合优先级设置确保关键报文能及时发出。3.2 仲裁与优先级确保关键数据通过当TX DMA和RX DMA同时请求总线时谁先谁后这就是仲裁机制。DA(位1, DMA Arbitration Scheme)0加权轮询Weighted Round-Robin。这是最常用的模式通过PR和TXPR位分配权重避免某一方饿死。1固定优先级Fixed Priority。由TXPR位绝对决定谁优先级更高。TXPR(位27, Transmit Priority) 在加权轮询模式下它决定权重偏向哪一方在固定优先级模式下它直接决定谁有优先权。0 RX DMA权重更高/优先级更高。1 TX DMA权重更高/优先级更高。PR[15:14](Priority Ratio) 仅在DA0加权轮询时有效。它定义了RX和TX之间的权重比PR值对应的比例是(PR1):1。例如PR0是1:1PR1是2:1PR2是3:1PR3是4:1。权重高的方向在仲裁中获胜的概率更高。配置策略 在典型的嵌入式网络设备中接收RX的实时性往往比发送TX更重要。因为收到一个PTP同步报文或控制指令后需要立刻处理并可能触发响应。如果RX DMA因为总线被TX长期占用而无法及时将报文写入内存就会引入不可控的延迟。因此一个常见的优化配置是设置DA0启用加权轮询。设置TXPR0让RX方向拥有更高的权重/优先级。设置PR1或2给予RX方向2:1或3:1的权重优势。 这样既能保证RX流的及时性又不会完全饿死TX流。3.3 其他关键位与“踩坑”记录SWR(位0, Software Reset)这是一个“粘性”位。你写1启动DMA软件复位但硬件会在复位完成后自动将其清0。因此正确的操作流程是1) 写1启动复位2)轮询此位直到读回0确认复位完成3) 再进行其他DMA寄存器配置。切忌在读到SWR为1时就认为可以配置了那会导致配置无效或错误。AAL(位25, Address Aligned Beats)和FB(位16, Fixed Burst) 这两个位与总线地址对齐和突发类型有关。对于大多数基于ARM Cortex-M的MCU使用AHB总线建议将FB设为1使用固定长度的突发如4、8、16字并将AAL设为1启用地址对齐。这符合AHB总线的典型优化特性能避免因地址未对齐导致的性能损失或总线错误。MB(位26, Mixed Burst) 当FB0时此位决定是否对长于16字的突发使用未定义的连续突发。通常保持默认值0即可除非你非常清楚总线的特性。RIB(位31, Rebuild Burst) 当总线传输因重试、分割或丢失而中断时DMA如何重建剩余的突发。0表示重建为连续的突发直到最后一个字单次突发1表示用定义的固定突发1,4,8,16字重建。在复杂的总线环境中设置为1可能更稳健。4. 描述符列表与轮询机制实战DMA工作的核心是描述符Descriptor链表。描述符是存放在内存中的数据结构告诉DMA数据缓冲区在哪里、数据有多长、以及状态信息。EMACRXDLADDR和EMACTXDLADDR寄存器分别指向接收和发送描述符链表的头部。4.1 描述符链表地址配置要点对齐要求这两个寄存器指向的地址必须是字对齐的4字节对齐。虽然寄存器是32位但硬件会忽略最低两位bit[1:0]强制按字对齐。在编程时你传递给寄存器的地址必须是4的整数倍。使用malloc或类似函数分配描述符链表内存时务必使用对齐的内存分配函数如memalign。配置时机只能在DMA停止时写入。对于接收DMA需要确保EMACDMAOPMODE寄存器中的SRStart/Stop Receive位为0对于发送DMA需要确保STStart/Stop Transmit位为0。这是一个常见的错误来源在DMA运行时修改基地址可能导致DMA访问到错误的内存区域引发总线错误或数据混乱。链表结构与所有权描述符通常是两个或四个字的结构取决于是否启用时间戳等高级功能。其中最关键的一个比特是“所有权”位Ownership bit。当该位为1时表示描述符及其关联的数据缓冲区由DMA控制DMA可以写入接收数据或读取发送数据当为0时表示由主机CPU控制。DMA只会处理所有权属于自己的描述符。完成数据处理后软件必须将所有权交还给DMA否则DMA会停止。4.2 轮询需求Poll Demand机制详解当DMA因为找不到可用的描述符所有权属于主机而进入挂起SUSPEND状态时就需要“轮询需求”机制来唤醒它。对应的寄存器是EMACTXPOLLD和EMACRXPOLLD。工作原理向这两个寄存器任意偏移地址写入任何值都会触发一个“轮询需求”命令。DMA收到命令后会立即去检查EMACHOSTXDESC或EMACHOSRXDESC寄存器指向的当前描述符的所有权。如果所有权属于DMA即软件已经将描述符交还则DMA从挂起状态恢复继续处理。如果所有权仍属于主机则DMA继续保持挂起并在DMA中断状态寄存器EMACDMARIS中置位相应的状态位TU或RU。何时使用初始化后启动DMA在设置好描述符链表和缓冲区后首次启动发送或接收时通常需要先发一个轮询需求命令让DMA开始获取第一个描述符。处理完数据后当CPU处理完一个接收帧或准备好一个发送帧并更新了描述符将所有权交还给DMA后如果DMA之前因描述符不可用而挂起就需要发送轮询需求命令来唤醒它。更高效的做法是在中断服务程序ISR中处理完描述符后检查EMACDMARIS中的TU或RU位如果被置位就发送相应的轮询需求命令。与中断的配合TU发送缓冲区不可用和RU接收缓冲区不可用中断是“异常中断”Abnormal Interrupt。你可以选择屏蔽它们然后采用纯轮询的方式定期检查描述符并手动发送轮询需求。但更常见的做法是使能这些中断在中断服务程序中快速处理描述符并发送轮询需求以实现低延迟的响应。5. DMA中断状态寄存器EMACDMARIS与问题排查EMACDMARIS寄存器偏移0xC14是DMA模块的“健康状态仪表盘”。任何异常或正常完成事件都会在这里反映出来。高效地处理中断是保证网络驱动稳定运行的关键。5.1 中断分类与处理流程该寄存器的中断可以分为两大类正常中断Normal Interrupt 由NIS位16汇总。包括TI(位0): 发送完成。一帧数据已成功送入MAC发送FIFO。RI(位6): 接收完成。一个完整的帧已存入接收缓冲区并且描述符已更新。ERI(位14): 早期接收中断。当DMA填充了接收包的第一个数据缓冲区时触发允许驱动提前处理包头。异常中断Abnormal Interrupt 由AIS位15汇总。包括各种错误和异常状态如TU(位2)/RU(位7): 发送/接收缓冲区不可用描述符所有权问题。UNF(位5): 发送下溢。发送FIFO空但MAC还在试图发送数据。OVF(位4): 接收溢出。接收FIFO满但还有数据到来。TJT(位3): 发送超时。发送帧过长超过2048或10240字节。FBI(位13): 致命总线错误。DMA访问内存时出错如访问了非法地址。标准中断服务程序ISR流程读取EMACDMARIS寄存器值保存到本地变量ris。检查AIS(位15)。如果置位说明有异常发生必须优先处理。检查FBI。如果置位读取AE[25:23]字段确定错误类型描述符读/写错误、数据读/写错误。这通常是严重的软件bug如描述符地址错误、缓冲区未对齐。检查TU/RU。如果置位说明描述符链表可能已用完或软件未及时释放描述符。需要检查并更新描述符然后向EMACTXPOLLD/EMACRXPOLLD写入值来唤醒DMA。检查UNF/OVF。这通常意味着DMA与MAC之间的FIFO深度设置不当或者系统负载过重DMA来不及搬运数据。可能需要调整DMA突发长度、优先级或者检查CPU负载。处理完每个异常位后必须向该位写1来清除它。EMACDMARIS的低16位是“写1清除”W1C。检查NIS(位16)。如果置位处理正常完成事件。检查TI。发送完成可以释放发送缓冲区内存或将描述符标记为空闲。检查RI。接收完成将数据包从缓冲区传递给上层网络协议栈如LwIP并回收描述符以供下次使用。同样处理完后写1清除对应位。重要清除完所有已处理的中断位后需要检查NIS和AIS是否也已自动清零因为它们是子中断位的逻辑或。如果它们仍然为1说明还有未处理的中断位需要回到步骤2/3继续检查。5.2 常见问题排查速查表问题现象可能的中断状态位根本原因与排查步骤发送完全停止无法发出任何数据包TU常置1TPS可能为0x6挂起1.描述符所有权未交还检查发送描述符的OWN位TDES0[31]在初始化时是否设置为1DMA拥有。2.描述符链表错误检查EMACTXDLADDR地址是否正确描述符的Next Descriptor Address是否有效链接或为空表示链表结束。3.未发送轮询需求在初始化或处理完TU中断后向EMACTXPOLLD寄存器写入值。接收不到数据或收一段后就停止RU常置1RPS可能为0x4挂起1.接收描述符未及时回收上层协议栈处理完数据包后没有将描述符的OWN位重新置1。2.接收缓冲区不足描述符链表太短或缓冲区太小被快速用完。3.同样需要轮询需求处理RU中断后向EMACRXPOLLD写入值。网络吞吐量极低性能差可能伴随OVF或UNF1.DMA突发长度太小检查EMACDMABUSMOD的PBL/RPBL尝试增大如从4改为16或32。2.总线仲裁权重不利如果RX性能差检查PR和TXPR确保RX有更高权重TXPR0,PR1或2。3.CPU处理太慢中断服务程序或协议栈处理耗时过长导致DMA来不及服务。考虑优化代码或使用更高效的协议栈。系统运行一段时间后死机或重启FBI置1内存访问错误这是最严重的问题。1.地址错误描述符地址或缓冲区地址非法如NULL指针、未对齐不是4字节倍数。2.内存越界DMA写入的接收数据超出了分配的缓冲区大小覆盖了其他关键数据。3.缓存一致性问题如果使用了带Cache的CPU确保DMA缓冲区所在的内存区域配置为“非缓存”Non-cacheable或“写回无效”Write-back, invalidate。必须在启动DMA前和从DMA读取数据前进行必要的缓存清洗Clean或无效Invalidate操作。PPS输出信号不稳定或频率不准无直接DMA中断但可能因系统繁忙间接影响1.PTP时钟源不稳定检查PTP参考时钟如MOSC的精度和抖动。2.系统时间更新被阻塞如果PTP中断或系统时间更新任务被其他高优先级任务长时间阻塞会影响PPS生成的精度。确保PTP相关任务具有足够高的优先级。3.寄存器配置冲突检查EMACPPSCTRL的TRGMODS0、PPSEN0、PPSCTRL位是否按正确顺序和原子性配置。确保在配置PPS相关寄存器时相关的中断已被禁用或已妥善处理。6. 综合配置示例与系统集成建议最后我们以一个典型的工业网关应用为例它需要实现高精度PTP从时钟并稳定处理Modbus TCP和HTTP数据流。系统目标生成一个稳定的1Hz PPS输出信号用于同步外部设备。确保PTP事件报文Delay_Req, Sync等的发送和接收具有最低延迟。保证业务数据通道有足够的吞吐量。配置步骤与代码片段概念性// 1. 停止DMA进行全局配置 EMACDMABUSMOD_R ~(1UL); // 确保SWR位为0DMA未处于复位状态 // 等待DMA完全停止检查EMACDMAOPMODE的ST和SR位 // 2. 配置DMA总线模式优化性能与实时性 uint32_t dmabusmod_cfg 0; dmabusmod_cfg | (0x0 31); // RIB: 重建为连续突发 dmabusmod_cfg | (0x0 27); // TXPR: RX优先级高于TX (加权轮询时) dmabusmod_cfg | (0x0 26); // MB: 混合突发禁用 dmabusmod_cfg | (0x1 25); // AAL: 启用地址对齐 dmabusmod_cfg | (0x0 24); // 8xPBL: 不启用8倍模式 dmabusmod_cfg | (0x1 23); // USP: 为RX和TX使用独立的PBL dmabusmod_cfg | (0x20 17); // RPBL: RX DMA突发长度 32字 (0x2032) dmabusmod_cfg | (0x1 16); // FB: 使用固定长度突发 dmabusmod_cfg | (0x1 14); // PR: 优先级比例 2:1 (RX:TX 2:1) dmabusmod_cfg | (0x8 8); // PBL: TX DMA突发长度 8字 dmabusmod_cfg | (0x0 7); // ATDS: 使用4字描述符 dmabusmod_cfg | (0x0 2); // DSL: 描述符连续存放 dmabusmod_cfg | (0x0 1); // DA: 加权轮询仲裁 dmabusmod_cfg | (0x0 0); // SWR: 不复位 (稍后单独操作) EMACDMABUSMOD_R dmabusmod_cfg; // 3. 软件复位DMA并等待复位完成 EMACDMABUSMOD_R | (1UL 0); // 置位SWR while(EMACDMABUSMOD_R (1UL 0)); // 等待SWR硬件清零 // 4. 配置PPS输出为1Hz固定频率二进制翻转模式假设需要50%占空比方波 // 先确保PPSCTRL为0再配置模式 EMACPPSCTRL_R ~(0xF); // 清零PPSCTRL位域 EMACPPSCTRL_R ~(1UL 4); // 设置PPSEN00固定频率模式 // TRGMODS0在固定频率模式下可能无关设为00 EMACPPSCTRL_R ~(0x3 5); // 设置PPSCTRL0x0输出1Hz (二进制翻转模式占空比50%) EMACPPSCTRL_R | (0x0 0); // 注意在固定频率模式下INTVL和WIDTH寄存器可能被忽略。 // 如果需要非标准频率或精确脉宽需使用PPSEN01的命令模式并配置INTVL/WIDTH。 // 5. 初始化描述符链表与缓冲区此处省略详细内存分配和描述符设置代码 // 6. 将描述符链表基地址写入DMA EMACRXDLADDR_R (uint32_t)rx_desc_list_base; // 确保地址字对齐 EMACTXDLADDR_R (uint32_t)tx_desc_list_base; // 7. 配置并启用DMA中断使能NIS和AIS相关的子中断 EMACDMAIM_R (1 0) | (1 2) | (1 6) | // 使能 TI, TU, RI (1 7) | (1 4) | (1 5); // 使能 RU, OVF, UNF // 8. 启动DMA接收和发送引擎 EMACDMAOPMODE_R | (1UL 1); // 设置SR启动接收 EMACDMAOPMODE_R | (1UL 13); // 设置ST启动发送 // 9. 发送初始轮询需求让DMA开始工作 EMACRXPOLLD_R 0x1; EMACTXPOLLD_R 0x1;系统集成建议中断优先级将以太网MAC中断特别是DMA的NIS和AIS汇总中断设置为系统中较高的优先级低于PTP硬件时间戳中断但高于普通业务任务。确保时间戳处理和描述符回收不被延迟。内存管理为DMA描述符和缓冲区使用专用的、非缓存的内存区域如通过MPU配置。这彻底避免了缓存一致性问题虽然牺牲了一点CPU访问速度但换来了绝对的稳定性。监控与调试在开发阶段定期在中断服务程序中读取EMACDMARIS和过程状态位TS,RS将其输出到日志或调试端口。这能帮助你直观了解DMA的工作状态快速定位是卡在“获取描述符”、“等待状态”还是“传输数据”阶段。压力测试使用网络测试仪或PC上的iperf、ping -f等工具对设备进行满带宽吞吐量测试和大量小包测试。同时监测PPS输出的抖动用示波器或高精度时间间隔计数器。观察在高压网络流量下PPS的精度是否受到影响从而反推调整DMA的优先级、突发长度等参数。