MSC8101双路以太网驱动优化:从硬件配置到性能调优实战
2026/6/21 23:39:44 网站建设 项目流程

1. 项目概述与核心价值

在嵌入式网络设备开发中,如何榨干硬件平台的每一分网络性能,是每个底层驱动工程师必须面对的挑战。今天,我想和大家深入聊聊一个经典案例:在Freescale(现NXP)的MSC8101通信处理器上,实现并优化双路全双工快速以太网驱动的全过程。MSC8101这颗芯片在十多年前是许多网关、媒体转换设备的“心脏”,其集成的两个快速通信控制器(FCC)是性能的关键。但原厂的应用笔记(AN2333)更像是一份“食谱”,告诉你步骤,却很少解释“为什么火要这么大”、“为什么这时候下锅”。在实际项目中,我踩过不少坑,也总结出一套让这两个FCC跑满100Mbps双工链路的实战经验。这篇文章,我就把这些年积累的配置精髓、性能调优的底层逻辑,以及那些数据手册里不会写的“坑点”,毫无保留地分享出来。无论你是在维护遗产代码,还是在学习经典嵌入式网络架构,相信这些从一线实战中沉淀下来的细节,都能让你少走弯路。

2. 硬件平台与架构深度解析

2.1 MSC8101通信处理器模块(CPM)与FCC

MSC8101的核心优势在于其高度集成的通信处理器模块(CPM)。CPM内部包含两个独立的快速通信控制器(FCC),它们本质上是高度可编程的通信协处理器。每个FCC都可以被配置为支持多种协议,而在我们的场景下,就是将其配置为IEEE 802.3兼容的以太网媒体访问控制(MAC)层控制器。

FCC在以太网模式下,硬件上完成了大量繁重工作,这极大地减轻了主核(SC140)的负担。这些工作包括:

  • 帧处理:自动生成和校验前导码、帧起始定界符(SFD)以及32位的CRC帧校验序列。这意味着你的软件只需要关心“数据”部分,头尾的格式化由硬件保证。
  • MAC功能:实现了完整的MAC层逻辑,包括冲突检测(半双工模式下)、帧间隔控制、背压流量控制(全双工模式下)等。
  • 地址过滤:支持单播、组播和广播地址的硬件过滤,甚至可以通过一个64位的哈希表来实现高效的组播过滤,这能有效减少不必要的帧对主核的中断打扰。
  • RMON计数器:这是一个非常实用的硬件功能。FCC内置了远程监控计数器,可以统计接收到的各种帧(如广播帧、CRC错误帧等),让你无需软件计数就能大致了解网络流量状况,对性能监控和调试至关重要。

关键配置寄存器:驱动初始化的核心是对FCC的通用模式寄存器(GFMR)进行编程。你需要将其Mode字段设置为1100,明确告知FCC:“请进入以太网模式”。这个设置是后续所有功能正确工作的前提。

2.2 媒体独立接口(MII)与物理层(PHY)连接

MSC8101的FCC通过标准的MII接口与外部物理层收发器(PHY)芯片连接。MII是一个并行接口,定义了控制器(MAC)与收发器(PHY)之间清晰的数据、控制和状态信号。

引脚复用与配置:MSC8101的引脚功能是高度复用的。以FCC2为例,其TXD[3:0](发送数据)、RXD[3:0](接收数据)等信号是通过端口B的特定引脚输出的。在驱动初始化早期,你必须通过配置相应的并行I/O控制器,将这些引脚的功能从默认的通用I/O(GPIO)切换到“FCC以太网”功能。这一步如果遗漏或配置错误,会导致物理链路无法建立,而且现象可能很隐蔽(比如PHY显示链路已通,但就是没有数据)。

PHY芯片管理:项目中使用的是Intel LXT970系列PHY。驱动需要通过MII管理接口(MDC和MDIO这两根线)来配置PHY。这里有几个实战要点:

  1. 共用MDIO总线:两个PHY可以挂在同一组MDC/MDIO总线上,通过不同的PHY地址(通常由硬件引脚上下拉决定)来区分。在初始化时,需要分别对地址0和地址1的PHY进行配置。
  2. 关键寄存器配置:你需要重点操作几个寄存器:
    • 控制寄存器(Reg 0):用于软复位PHY、使能环回测试、设置速度(100Mbps/10Mbps)、设置双工模式(全双工/半双工)以及最重要的——使能自动协商。对于大多数应用,建议使能自动协商,让设备与对端交换机自动协商出最佳的速度和双工模式。
    • 状态寄存器(Reg 1):用于读取链路状态(Link Up/Down)。在驱动启动后,应定期或通过中断查询此位,以感知网络连接的变化。
    • 自动协商通告寄存器(Reg 4):告诉对端本地设备支持的能力,例如“我支持100M全双工和半双工”。通常设置为支持所有能力,以最大化兼容性。
  3. 初始化顺序:正确的顺序是:先通过硬件复位或软件复位位让PHY进入已知状态,然后配置自动协商寄存器,最后重启自动协商过程。之后,驱动需要等待一段时间(通常几百毫秒),再读取状态寄存器确认链路是否已成功建立并协商出速度和双工模式。

注意:全双工/半双工不匹配是经典的网络性能“杀手”。如果一端强制为全双工,另一端为自动协商或半双工,会导致严重的帧冲突和重传,吞吐量急剧下降。因此,在调试任何性能问题前,务必先确认链路两端的双工模式是否一致。

3. 驱动软件架构与模块化设计

3.1 整体数据流与控制流

理解数据如何在系统中流动,是进行性能优化的基础。整个驱动可以抽象为两条主线:数据路径控制路径

数据路径(高速通道)

  1. 发送:应用程序数据准备好后,放入内存缓冲区(Buffer)。驱动将该缓冲区的地址、长度等信息填入一个叫做缓冲区描述符(BD)的数据结构中,并通知FCC。FCC的DMA引擎(SDMA)随后自动将缓冲区中的数据通过MII接口“搬运”给PHY,PHY将其转换成电信号发送到网线上。整个过程无需主核干预数据拷贝。
  2. 接收:PHY从网线上收到信号,转换成并行数据通过MII接口送给FCC。FCC的DMA引擎根据驱动预先设置好的空BD,自动将数据写入对应的内存缓冲区,并更新该BD的状态。然后触发中断通知主核。

控制路径(配置与响应)

  1. 初始化:由主核执行,包括配置GPIO引脚功能、初始化PHY、设置FCC工作模式、分配内存缓冲区和BD环、注册中断服务例程等。
  2. 中断处理:当帧发送完成或接收到新帧时,FCC产生中断。中断经过中断控制器(PIC/SIC)路由到SC140核心,触发中断服务例程(ISR)。ISR判断中断源,调用对应的FCC中断处理函数。该函数处理BD(例如,将已发送的BD回收,将已接收的BD交给上层协议),然后退出。

3.2 核心软件模块详解

参考应用笔记中的项目结构,一个健壮的驱动应包含以下模块:

  1. 板级支持包(BSP)初始化(BOARD_SUPPORT):

    • 关闭看门狗,配置内存控制器(如BRx/ORx寄存器),使能外部SDRAM或内部SRAM的访问。这是程序能运行起来的第一步。
    • 将并行端口配置为FCC所需的特殊功能,而非默认的GPIO。
  2. PHY驱动模块(ENET_PHY):

    • 实现MDC/MDIO总线的底层读写函数(通常通过位敲击GPIO模拟时序或利用CPM的特定功能)。
    • 提供PHY的初始化、链路状态查询、速度/双工模式设置等API。
    • 经验之谈:PHY的读写时序有严格要求。在实现位敲击代码时,务必在读写操作间插入足够的空指令(nop)来满足MII管理接口的时序要求,否则配置可能失败。
  3. FCC驱动初始化模块(FCC1_ENET,FCC2_ENET):

    • 这是驱动的核心配置部分。除了设置GFMR,还需配置:
      • FCC协议特定参数:如MAC地址(写入PADDR寄存器)。
      • FCC事件寄存器:决定哪些事件(如帧接收完成、发送完成、总线错误)会触发中断。
      • SDMA配置:告诉FCC的DMA引擎,BD环和缓冲区位于内存的什么位置(通过RBASE,TBASE等寄存器)。
  4. 中断控制器模块(INT_CRL):

    • 配置系统中断单元(SIU)和CPM中断控制器,将FCC的中断线映射到特定的中断向量。
    • 实现中断的使能、屏蔽和优先级设置。
    • 提供中断服务例程(ISR)的骨架,负责现场保存/恢复和中断分派。
  5. 运行时FCC驱动模块(FCCs_DRV):

    • 包含FCC的中断处理函数。这个函数被ISR调用。
    • 其核心任务是“处理BD环”:遍历发送BD环,释放已发送完成的缓冲区;遍历接收BD环,取出已填充数据的缓冲区,交给上层协议栈,并重新将空缓冲区挂回BD环。
    • 关键设计:这个函数的效率直接决定系统能处理的最大中断频率和吞吐量。
  6. 缓冲区与描述符管理

    • 这是性能优化的重中之重,我们将在下一章单独深入讨论。

4. 性能优化核心:缓冲区与中断的艺术

驱动的基本功能是让数据通起来,而优化的目标是让数据“飞快地、顺畅地”通起来,同时不浪费CPU资源。这主要围绕缓冲区管理中断处理展开。

4.1 缓冲区(Buffer)的策略

缓冲区是数据在内存中的临时住所。它的位置、大小和数量,共同决定了系统的性能特征。

1. 缓冲区放在哪里?

  • 内部SRAM(首选):访问速度最快,1个核心周期即可完成。将缓冲区放在这里能获得最低的帧处理延迟和最高的吞吐量。缺点是容量有限(MSC8101通常有几十到几百KB),需要精打细算。
  • 外部SDRAM:容量大,但访问延迟高。一次访问可能需要数十个核心周期。这会导致DMA传输数据时,总线繁忙,影响核心访问其他资源。通常用于存储非常大的数据块或当内部SRAM已被其他关键任务占用时。
  • 内部双端口RAM(DPRAM):CPM和核心都能快速访问。如果数据不需要核心处理,而是由CPM从一个通道直接转发到另一个通道(如协议转换),DPRAM是绝佳选择。否则,优势不明显。

实战建议:对于高吞吐量、低延迟的以太网驱动,尽可能将活跃的收发缓冲区放在内部SRAM中。对于MSC8101,这意味着你需要仔细规划内存映射,通常将SRAM配置在CS0空间,偏移0x0处。

2. 缓冲区设多大?

  • 以太网MTU:标准以太网帧的数据部分最大是1500字节(MTU)。加上14字节的帧头和4字节的FCS,最大帧长是1518字节。
  • 缓冲区对齐:DMA引擎(SDMA)访问内存时,如果数据地址是4字节对齐的(即地址是4的倍数),效率最高。因此,在分配缓冲区时,务必使用malloc或类似函数的内存对齐版本,或者手动计算对齐的地址。
  • 我们的选择:在不确定网络环境时,最安全的做法是将每个缓冲区大小设置为1518字节(1500+18)。这确保了任何合法的以太网帧都能被完整容纳。虽然会浪费一些内存(因为小帧很多),但避免了复杂的缓冲区链接和帧分割逻辑,简化了驱动设计。在确定性的封闭网络中,可以设置为已知的最大帧长以节省内存。

3. 缓冲区要多少个?这是一个典型的吞吐量与内存消耗的权衡。

  • 接收环(Rx BD Ring):需要足够多的空缓冲区来应对突发流量。如果空缓冲区耗尽,FCC将丢弃后续到来的帧,导致丢包。对于100Mbps链路,建议至少设置4个接收缓冲区。在流量极大的场景下,可以增加到8个或16个。
  • 发送环(Tx BD Ring):需要足够多的待发送缓冲区,以便应用程序能连续提交多个帧而不必等待。同样,建议至少4个。如果应用是突发性发送大量数据,可以增加此数量。

FCCx_ENET.h中,对应的配置宏是:

#define FCCx_TX_BUF_SIZE 0x5EE // 1518 十进制 #define FCCx_RX_BUF_SIZE 0x5EE // 1518 十进制 #define FCCx_TX_NUM_BUF 4 #define FCCx_RX_NUM_BUF 4

4.2 缓冲区描述符(BD)的玄机

BD是驱动与FCC硬件之间的“合同”。它是一个数据结构,FCC通过读取BD知道下一个要发送的缓冲区在哪,通过写入BD告诉驱动哪个缓冲区已填满数据。

BD的关键字段

  • 状态(Status):包含R(就绪)、L(最后一个)、I(中断)等控制位。
  • 数据长度(Data Length):帧的实际长度。
  • 缓冲区指针(Buffer Pointer):指向实际数据缓冲区的地址。

BD环(BD Ring):多个BD在内存中连续排列,形成一个环。FCC和驱动都维护一个当前指针,在环中循环移动。这种设计避免了频繁的内存分配释放,是高性能驱动的标配。

中断频率控制(核心优化点): BD状态字中的I(中断使能)位,是控制中断频率的阀门,对性能有巨大影响。

  • 发送BD的I位设置
    • 每个BD都置位:每发送完一个帧就产生一次中断。这提供了最精细的控制,便于统计和精确的缓冲区管理,但中断频率最高。在2FCCs项目中,为了精确计数,采用了此方式。
    • 仅最后一个BD置位:只在发送环一整圈完成后产生一次中断。这大大降低了中断频率,适合批量发送场景。
    • 全部不置位:不产生发送完成中断。适用于“发射后不管”或由其他机制(如轮询)确认发送完成的场景。
  • 接收BD的I位设置
    • 逻辑与发送类似。高吞吐量场景下,建议对每个接收BD都置位,确保及时处理,避免丢包。

BD的内存位置必须放在内部SRAM。BD虽然很小(每个可能只有8-16字节),但FCC和核心都会高频访问它。放在SRAM能确保最快的访问速度,对降低中断响应延迟至关重要。

4.3 中断服务例程(ISR)的优化

中断处理是开销所在。优化目标是:在保证功能正确的前提下,尽可能快进快出

  1. 现场保存/恢复的取舍

    • 完整现场保存:在进入ISR时,保存所有核心寄存器(r0-r15, d0-d15等);退出时恢复。安全,但耗时(约56个核心周期)。
    • 精简现场保存:只保存ISR中真正会用到的少数几个寄存器。在2FCCs项目中,通过只保存r0-r7和d0-d7,将周期数降到了26。风险极高:你必须确保ISR和它调用的函数(包括编译器生成的代码)绝对不会用到未保存的寄存器,否则系统会随机崩溃。这通常需要手写汇编或使用特殊的编译器编译指示(pragma)来约束函数。

    IRQ.hFCCs_Int_Handler.h中,通过以下宏控制:

    // IRQ.h #define OPTIMIZATIONS ON // 使用精简现场 // FCCs_Int_Handler.h #define INTHANDLER ASM // 使用手写汇编的中断处理函数
  2. 中断处理函数(Handler)的实现语言

    • C语言:开发快,易维护,可移植性好。编译器会自动处理寄存器使用,适合与完整现场保存搭配。
    • 汇编语言:可以精确控制每一条指令,实现周期级优化,是配合精简现场保存的唯一选择。但开发调试困难,容易出错。
  3. 中断裁决逻辑: ISR需要快速判断是哪个FCC产生了中断。可以通过查询SIU中断向量寄存器(SIVEC)SIU中断挂起寄存器(SIPNR)来实现。

    • SIVEC:硬件自动提供最高优先级中断源的编码,查询一次即可,代码通用。
    • SIPNR:需要软件遍历所有可能的中断位。虽然可能稍快(如果中断源很少),但代码与硬件绑定更紧密。

我的经验:在项目初期,强烈建议使用C语言编写中断处理函数,并配合完整现场保存。等到整个驱动稳定运行,性能分析表明中断处理成为瓶颈时,再考虑将其重写为汇编并启用精简现场保存。稳定性永远比那几十个周期更重要。

5. 双FCC协同工作与实战配置

5.1 硬件连接方案选择

应用笔记提到了两种硬件设置,其选择直接影响软件配置:

  1. 双MSC8101ADS板互连

    • 连接:两块开发板通过网线直连,或通过一个以太网交换机连接。
    • 软件限制:在这种设置下,通常只使用每块板上的FCC2。因为FCC1的引脚可能被板载其他设备占用,或者需要额外的物理接口转换。在软件中,你需要禁用FCC1(#define FCC1_ENABLED 0)。
    • 用途:适合做点对点的双向性能压力测试。
  2. MSC8101ADS板 + ECOM扩展板

    • 连接:ECOM板通过扩展接口连接到MSC8101ADS,为其FCC1提供了一个额外的以太网PHY。这样,单板上的两个FCC(FCC1和FCC2)都可以同时工作。
    • 软件配置:这是2FCCs项目使用的配置。需要在软件中同时使能FCC1和FCC2。特别注意引脚映射:ECOM板上的PHY信号线需要通过飞线或特定连接器,连接到MSC8101ADS上FCC1对应的GPIO引脚。必须严格按照原理图连接,并在代码中正确配置这些GPIO为FCC复用功能。

5.2 软件配置选项详解

项目的可配置性集中在几个头文件中,理解每个参数的意义是调优的关键:

  • 2FCCs.h:功能使能开关。

    #define FCC1_ENABLED 1 // 使能FCC1驱动 #define FCC2_ENABLED 1 // 使能FCC2驱动 #define FCC1_RX_ENABLED 1 // 使能FCC1接收 #define FCC1_TX_ENABLED 1 // 使能FCC1发送 // ... 同理配置FCC2

    在调试时,可以单独关闭某个FCC或只进行环回测试,非常方便。

  • Payload.h:测试帧生成。

    #define FRAME_SIZE_1 64 // FCC1发送的测试帧大小(字节,必须为偶数) #define FRAME_SIZE_2 1518 // FCC2发送的测试帧大小

    你可以通过改变帧大小,来测试驱动在不同报文长度下的性能表现。小帧(64字节)考验中断处理能力;大帧(1518字节)考验DMA和总线带宽。

  • FCCx_ENET.h:驱动核心参数。

    #define FCCx_INTLPBK 0 // 0=外部链路,1=内部环回(用于自测) #define ENETx_PADDR_H 0x00E0 // MAC地址高位 #define ENETx_PADDR_M 0x0C12 // MAC地址中位 #define ENETx_PADDR_L 0x3472 // MAC地址低位 #define FCCx_TX_BUF_SIZE 0x5EE // 发送缓冲区大小 #define FCCx_RX_BUF_SIZE 0x5EE // 接收缓冲区大小 #define FCCx_TX_NUM_BUF 4 // 发送BD环数量 #define FCCx_RX_NUM_BUF 4 // 接收BD环数量

5.3 性能测试与结果分析

完成所有配置后,如何进行有效的性能测试?

  1. 利用RMON计数器:这是最直接的硬件指标。通过定期(例如,在定时器中断中)读取FCC的RMON接收帧计数器,可以粗略计算出接收带宽。注意,RMON计数器可能只统计特定类型的帧(如好的单播帧),具体需查阅数据手册。

  2. 软件吞吐量测试

    • 发送测试:在应用程序中,以最快速度向驱动提交固定大小的测试帧。记录在固定时间内成功发送的帧数量,计算带宽。确保发送环不会“饿死”(即应用程序提交帧的速度不超过驱动发送的速度)。
    • 接收测试:从外部网络测试仪(如SmartBits、IXIA)或另一台高性能主机,向MSC8101端口打流。在MSC8101的中断处理函数中统计成功接收的帧数。
    • 双向同时测试:这是最考验系统的。同时使能两个FCC的收发,模拟真实网关应用。
  3. 关键性能指标

    • 吞吐量:能否接近线速(100Mbps)?对于64字节小帧,理论极限是148,809帧/秒。考虑到帧间隔、前导码等开销,实际能达到的吞吐量是衡量驱动效率的金标准。
    • CPU占用率:在满吞吐量运行时,SC140核心的占用率是多少?这反映了驱动和中断处理程序的效率。理想情况是,数据转发主要由CPM的DMA完成,CPU占用率很低。
    • 延迟:从一帧数据提交到发送队列,到它真正离开网口的时间差是多少?这对实时性要求高的应用很重要。

典型优化结果:经过合理的缓冲区配置(SRAM存放,4-8个缓冲区,1518字节大小)、中断优化(精简现场+高效BD处理)后,MSC8101驱动双路100M全双工以太网达到线速吞吐量是完全可行的。瓶颈往往不在驱动本身,而在上层协议栈的处理能力或应用逻辑。

6. 常见问题排查与调试心得

即使按照手册一步步来,在实际硬件上调试驱动也总会遇到各种问题。下面是我总结的一些常见“坑”和解决思路。

6.1 链路无法建立(Link Down)

  • 症状:PHY状态寄存器显示链路未接通。
  • 排查步骤
    1. 检查硬件连接:网线是否完好?是否连接到支持自动协商的交换机或对端设备?对于直连网线,需要使用交叉线。
    2. 确认PHY地址:使用逻辑分析仪或示波器抓取MDC/MDIO总线,确认读写时序正确,且访问的PHY地址与硬件跳线设置一致。
    3. 检查自动协商配置:确保PHY的控制寄存器(Reg 0)已正确使能自动协商(ANE位),并且自动协商通告寄存器(Reg 4)正确设置了本地支持的能力(如100M全双工)。
    4. 检查复位:在初始化序列中,是否对PHY进行了有效的软复位或硬复位?复位后是否等待了足够的时间(通常需要几百毫秒)再进行链路状态查询?
    5. 检查MII引脚配置:确认MSC8101的GPIO引脚已正确配置为FCC的MII功能,而非普通的输入输出。这是最容易被忽略的一步。

6.2 链路已通但无数据收发

  • 症状:PHY显示链路已接通(Link Up),速度双工模式也正确,但发送或接收不到任何数据帧。
  • 排查步骤
    1. 检查MAC地址:确认写入FCC PADDR寄存器的MAC地址是否正确且非全零/全广播地址。
    2. 检查BD环初始化:这是最常见的原因。确认:
      • BD环的基地址(RBASE,TBASE)是否正确写入FCC寄存器?
      • BD环在内存中是否已经正确初始化?每个BD的Data Buffer Pointer是否指向了有效的、已对齐的缓冲区?
      • 接收BD的Empty位(E)在交给FCC前是否被置位?发送BD的Ready位(R)在放入帧后是否被置位?
    3. 检查中断:是否使能了FCC的发送完成和接收中断?中断控制器(SIC/PIC)是否已正确配置并将FCC中断路由到核心?
    4. 使用环回测试:将FCCx_INTLPBK设置为1,启用内部环回。如果此时能自发自收,说明FCC驱动本身和BD环逻辑基本正确,问题可能出在MII到PHY的链路或外部网络。

6.3 性能不达标,吞吐量低

  • 症状:链路通,数据能传,但速度远低于100Mbps。
  • 排查步骤
    1. 检查双工模式重中之重!用交换机管理界面或ethtool(在Linux对端)命令确认链路两端协商出的双工模式是否一致。不匹配会导致大量冲突和重传。
    2. 检查缓冲区数量:是否因为接收或发送缓冲区数量太少,导致缓冲区耗尽?可以在中断处理函数中增加计数器,统计缓冲区耗尽事件。
    3. 检查中断风暴:是否因为每个帧都产生中断,导致CPU大部分时间都在处理中断上下文切换?尝试调整BD的I位,改为多个帧产生一次中断,观察吞吐量变化。
    4. 检查内存位置:使用性能分析工具或精确的周期计数,确认对BD和缓冲区的访问是否真的发生在零等待的SRAM中,而非外部SDRAM。
    5. 检查上层应用:数据源或数据接收器的速度是否本身就是瓶颈?应用程序提交帧或处理帧的速度是否跟得上线速?

6.4 系统不稳定,随机崩溃

  • 症状:长时间运行后,系统死机或跑飞。
  • 排查步骤
    1. 中断嵌套与重入:确保你的ISR和中断处理函数是不可重入的,并且在执行关键操作时屏蔽了同级或更低优先级的中断。MSC8101的中断控制器支持嵌套,设计不当会导致栈溢出或数据损坏。
    2. BD环操作竞争:驱动核心和FCC的DMA引擎会并发访问BD。确保在核心准备修改一个BD(例如,将已发送的BD状态清零)之前,FCC已经完成了对该BD的操作。这通常由硬件保证(通过状态位),但软件读取-判断-修改的序列需要仔细检查。
    3. 内存越界:检查所有缓冲区的分配大小是否足够。特别是接收缓冲区,如果设置为小于1518字节,而收到一个巨帧,可能导致DMA写入越界,破坏相邻内存数据。
    4. 精简现场保存的隐患:如果使用了精简现场保存,请用反汇编工具仔细检查中断处理函数及其调用的所有子函数,确认它们没有使用任何未保存的寄存器。一个安全的做法是,将中断处理函数及其直接调用的函数全部用汇编编写,并严格管理寄存器使用。

调试这类底层驱动,一个硬件调试器(JTAG)和一台网络协议分析仪(或带端口镜像的交换机)是必不可少的。JTAG可以让你设置断点、查看内存和寄存器;协议分析仪可以让你从物理层看到每一个进出的帧,是判断问题出在芯片内部还是外部的终极工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询