
1. Openwifi是什么一个跑在FPGA上的完整WiFi协议栈Openwifi是当前嵌入式开源社区里少有的、能在FPGA上完整跑通802.11a/g/n物理层PHY和媒体访问控制层MAC的开源项目。它由比利时鲁汶大学等机构的研究者推动在GitHub上以AGPL-3.0许可证开源核心价值在于把WiFi芯片里最底层的RTL代码全部公开。对做无线通信底层开发的人而言这意味着不再需要拿着黑盒WiFi芯片猜内部行为而是可以在自己的FPGA板卡上拉出一根天线真实收发出802.11格式的数据包甚至修改调制方式、改信道接入策略、注入自定义管理帧这在商业WiFi芯片上是根本做不到的。我第一次跑通Openwifi时把sdr设备和普通手机连到了同一个SSID下看到手机成功分配到IP地址的那一瞬间确实有点激动。这个项目解决的最大痛点就是“无线协议栈不可见”的问题。PHY层里的OFDM调制、星座映射、CRC校验、MAC层的退避算法、重传机制所有环节都能用逻辑分析仪抓内部信号或者直接改Verilog代码重新生成比特流验证效果。这个项目适合三类人做FPGA开发但对无线通信协议只停留在理论层面的工程师可以通过它把OFDM、QAM这些抽象概念落到实际硬件上高校里做通信系统验证、协议创新的科研团队Openwifi提供了一个可修改、可复现的实验平台想深入理解WiFi协议栈运行机制的嵌入式爱好者即使不做FPGA开发也可以把它的Linux驱动代码和固件架构当作一份极佳的参考资料。不适合用它的场景也很明确想拿它当生产级无线路由器固件、追求高吞吐量的场景。Openwifi目前的理论速率、并发能力和稳定性与商业WiFi芯片差距明显它的定位始终是研究和实验平台。2. 为什么选择FPGA来实现WiFi架构思路与核心考量2.1 FPGA与WiFi协议栈的天然契合点WiFi协议栈从下到上可以粗略分成物理层PHY、媒体访问控制层MAC和上层协议栈。商业WiFi芯片通常用ASIC把PHY和MAC封死留给用户的是一个寄存器接口和一颗运行封闭固件的内核。这种方式性能优秀但可观测性几乎为零。FPGA恰恰相反所有的内部连线都在代码里显式描述寄存器传输级RTL的每一个信号都可以通过调试工具拉出来看。这种透明性是研究无线协议时极其宝贵的特性。从实现路径来看WiFi PHY层包含大量并行的数字信号处理模块比如OFDM调制解调、快速傅里叶变换FFT、维特比译码、均衡器。这些任务天然适合FPGA的并行计算结构。MAC层则包含大量状态机和时序逻辑比如信道退避计数、帧间隔定时、ACK超时管理FPGA同样能够以精确的时钟周期来处理这些时序敏感的操作。所以Openwifi选择FPGA本质上是因为WiFi协议栈的每一层都能在FPGA上找到高效的映射方式。2.2 软硬件协同的整体架构划分Openwifi的整体架构遵循一个非常清晰的分工原则延迟敏感、时序严格的功能放在FPGA硬件里策略性、复杂且对延迟不敏感的功能放在软件里。具体划分如下层级实现位置主要职责PHY基带处理FPGA RTLOFDM调制/解调、FFT、信道估计、均衡、维特比译码MAC核心时序FPGA RTL帧间隔计时、ACK生成、退避计数器、NAV维护MAC高层逻辑嵌入式CPU软核/硬核关联管理、速率自适应、功率管理、帧聚合策略驱动与协议栈Linux内核驱动网口抽象、SKB管理、与mac80211子系统交互用户态工具应用层程序配置管理、监控调试、抓包分析这种分工方式在通信系统设计里非常经典。硬件负责“快而准”的重复性操作软件负责“灵活多变”的策略逻辑。比如ACK帧的generation必须在收到数据帧后的SIFS时间内发出这个时间窗口在802.11n协议中是16微秒用软件中断来处理基本不可能满足时序所以必须放到FPGA硬件里用状态机完成。而速率适配算法、扫描信道列表这些逻辑就不需要硬实时放在软件里反而更容易维护和调试。2.3 这个架构解决了什么问题我在接触这个项目之前一直觉得WiFi协议栈的学习曲线非常陡峭。一方面是因为协议文档篇幅巨大另一方面是缺乏一个能“动手”的平台。Openwifi的软硬件架构给出了一条完整的学习路径PHY层的数字信号处理链路在RTL里清清楚楚MAC层的时间关键路径精确到纳秒级Linux内核驱动部分则能让你看到netdev子系统如何与一个“非传统”无线硬件对接。三部分串起来就是一个完整的802.11通信系统。同时从工程复用角度讲Openwifi的架构也为二次开发提供了很好的基础。如果你想验证一个新提出的PHY算法可以在RTL仿真环境里先注入测试向量验证完成后把修改后的比特流通过JTAG下载到板卡上再用另一块板卡或者普通WiFi设备做互操作测试。如果你研究的是MAC层的调度策略那工作量更小很多逻辑都在Linux驱动甚至用户态的hostapd配置里就能完成调整。这种“硬件可改、软件可调”的双重灵活性是商业芯片平台完全无法提供的。3. FPGA实现的核心细节从PHY到MAC再到射频前端3.1 PHY层基带处理链路PHY层是Openwifi里最“硬核”的部分也是RTL代码量最大的模块。整个发送链路可以概括为MAC层交付的PSDU物理层服务数据单元先经过加扰、编码、交织映射成OFDM符号再加上训练序列和前导码组成一个完整的PPDU物理层协议数据单元最终经过数字上变频输出到DAC。接收链路则是完全逆向的过程先做帧同步和载波频偏估计再去掉循环前缀、做FFT变换经过信道估计与均衡后依次完成解映射、去交织、维特比译码和解扰。在FPGA实现里最关键的一个模块是FFT。802.11a/g/n的OFDM符号长度为64个子载波20MHz带宽下因此IFFT/FFT点数就是64点。Openwifi在Xilinx FPGA上通常使用Xilinx FFT IP核来实现配置为64点、流水线结构、16位输入输出。FFT IP核的使用并不复杂但需要对接好数据流的时序尤其是数据有效信号和数据索引的同步。我最初调试接收链路时有一个非常隐蔽的问题FFT输出数据的顺序是自然顺序还是比特反转顺序这个必须和后半部分的子载波映射关系严格匹配一旦错乱星座图就会完全散开而这类bug在仿真阶段往往因为测试向量太理想而无法暴露。维特比译码器同样是一个容易出问题的地方。Openwifi支持BPSK、QPSK、16QAM、64QAM几种调制方式对应不同的编码速率1/2、2/3、3/4。Xilinx的维特比译码IP核配置为约束长度7、支持多种码率但需要自己在RTL层面对发射端的删余puncturing过程做精确模拟。一个容易踩的坑是删余模式的起始位置对齐问题。在802.11标准中删余操作是从编码比特流的特定位置开始的如果在发射端和接收端对删余起始点的理解不一致译码结果会整段出错而且错误模式并不是全丢而是随机误码率很高排查起来非常迷惑。3.2 MAC层关键时序逻辑MAC层的RTL实现是Openwifi另外一个值得细看的模块。802.11 MAC的核心是CSMA/CA载波侦听多址接入/冲突避免协议它依赖一套精确的信道状态判断和随机退避机制。Openwifi在FPGA里实现了DCF分布式协调功能的核心部分包括信道忙闲检测通过比较RSSI接收信号强度指示与阈值的瞬时值/平均值来判断信道是否繁忙帧间隔计时包括SIFS短帧间间隔、DIFSDCF帧间间隔、AIFS仲裁帧间间隔等这些计时器必须精确到微秒级协议规定的SIFS是16微秒802.11n HT模式下硬件需要用高精度时钟计数产生准确的时序窗口随机退避在竞争窗口内产生随机数并随退避时隙递减这个逻辑要避免在信道切换过程中出现计数错误ACK与重传在收到正确数据帧后硬件自动在SIFS后回复ACK如果超时未收到ACK则通知上层进行重传。值得一提的细节是MAC层与PHY层的交互接口TXOP/RXOP的握手信号时序。Openwifi在RTL里定义了一个精简的MAC-PHY接口发送时MAC层拉高发送请求信号PHY层准备好后回送发送使能双方在时钟同步下交接数据。这个接口虽然是自定义的但设计思路与802.11标准中的PLCP物理层汇聚协议服务原语一致。我在阅读代码时发现这个握手逻辑里对异常状态的处理做得比很多商业实现还仔细比如PHY层在发送过程中遇到能量检测冲突时会通过中断信号通知MAC层终止本次发送并丢弃不完整的发送数据。3.3 DMA通路与数据缓冲管理FPGA里的MAC层最终要把收到的数据帧交给CPU或者直接通过DMA写入内存。Openwifi在Xilinx平台上是基于AXI总线做数据搬运的MAC层收到的帧先写入FPGA内部的FIFO再由DMA引擎通过AXI4总线写到DDR内存。发送方向则相反Linux驱动把待发送的数据封装成描述符DMA引擎从内存读出数据送入MAC层。这个DMA通路的设计上有一个值得学习的点使用了多描述符环形队列。驱动可以一次性将多个数据帧的描述符提交给硬件硬件按照队列顺序逐个发送发送完成后再通过中断通知驱动回收描述符。这样做的好处是减少了CPU中断频率提升了吞吐量。如果只是每发一帧就中断一次CPU整个系统的吞吐量会被中断处理开销严重拖累。我在调试DMA通路时遇到的问题大多是描述符状态同步问题。CPU和FPGA通过共享内存中的描述符表通信两边都会读写这个表如果缺少内存屏障memory barrier处理CPU缓存了旧数据而FPGA已经更新了新的状态位就会出现发送队列卡死或者数据帧错乱的现象。Openwifi的驱动代码里对描述符的读写顺序做了严格的要求这让我意识到在做FPGA和CPU的数据交互时不仅仅是硬件逻辑要正确软件层面的缓存一致性问题同样需要谨慎处理。3.4 射频前端接口与板级设计FPGA里的基带信号最终要通过射频前端才能变成2.4GHz的无线信号。Openwifi目前支持的射频前端主要是AD9361和AD9371这类集成收发器通过LVDS或CMOS接口与FPGA相连。AD9361是一颗非常经典的软件定义无线电芯片它的基带接口工作在LVDS模式下时通过多条数据线和帧同步信号把12位的I/Q采样数据并行传给FPGA。在FPGA逻辑里对接AD9361主要有两个工作一个是配置芯片的寄存器这可以通过SPI接口完成在Openwifi里有个独立的寄存器配置模块按AD9361的数据手册完成初始化序列另一个是处理基带数据流的位对齐和帧同步AD9361的LVDS时序有几个可配置的模式单通道/双通道、DDR/SDRFPGA里的接收逻辑必须和芯片配置完全一致才能正确采样到I/Q数据。板级设计上一个重要的注意事项是采样时钟的抖动和相位噪声。AD9361输出的采样时钟直接作为FPGA处理基带数据的时钟源如果这个时钟的抖动过大会直接影响接收链路的信噪比。我在一块设计不太理想的板卡上做过测试时钟树上的电源噪声耦合进了采样时钟结果就是接收灵敏度明显劣化原先用频谱仪看很干净的信号解调出来的星座图却始终带一层模糊的弥散。后来在电源网络上增加了LC滤波并把时钟走线远离数字信号线后问题才得到缓解。4. 实操从源码获取到板卡跑通的完整流程4.1 硬件平台与工具链准备运行Openwifi的硬件平台目前最常用的是基于Xilinx Zynq系列SoC的开发板比如ZC706、ZedBoard以及一些第三方的SDR开发板。Zynq的优势在于它集成了ARM Cortex-A9硬核处理器和可编程逻辑Openwifi的Linux驱动和主机协议栈运行在ARM侧PHY和MAC的RTL逻辑运行在可编程逻辑侧两者通过AXI总线通信架构非常契合Openwifi的软硬件划分思路。工具链方面需要准备VivadoXilinx的FPGA开发套件用于综合、实现和生成比特流。版本建议和Openwifi仓库里标注的版本保持一致我用不同版本实测过大多数情况下高版本可以打开老工程但偶尔会遇到IP核版本升级导致的兼容性提醒所以保守起见还是跟随官方建议为妙PetaLinux用于构建运行在ARM处理器上的Linux系统生成包含驱动模块和应用程序的根文件系统SDK或Vitis用于编译设备树和引导程序以及一些裸机调试场景Openwifi源码仓库包括FPGA的RTL工程、Linux内核补丁通常是out-of-tree的驱动模块源码以及用户态工具源码。准备工作里最容易忽略的一项是许可证管理。Xilinx的众多IP核比如FFT、维特比译码器、DMA控制器都需要有效的Vivado许可证才能生成如果用试用版或者某些IP核没有授权综合阶段就会报错。建议在项目启动前先确认开发环境中这些IP核的license是否有效避免做到一半才发现授权缺失。4.2 获取源码与工程结构梳理Openwifi的源码可以从GitHub上直接clone。仓库里的目录结构比较清晰核心目录大致包括fpga/存放FPGA工程的RTL源码、约束文件和IP核配置。这一层的代码量相当可观PHY和MAC的Verilog模块都集中在这里kernel/Linux内核驱动源码通常以补丁或独立模块的方式组织user/用户态程序和配置工具包括用于启动AP模式的脚本、从设备侧抓包的辅助工具等docs/设计文档和说明建议在刚开始接触项目时先花点时间通读尤其是介绍架构总览和系统框图的文档能帮你少走很多弯路。拿到源码后不要急着立刻打开工程跑综合。先花一两个小时把架构文档和数据通路图过一遍搞清楚数据从哪里进、到哪里出、控制信号在哪里介入。如果不做这一步直接钻进Verilog代码里很容易被庞大的模块数量和复杂的接口时序淹没。我在第二次阅读这个项目的源码时就是先在纸上画了一条从“天线接收 → AD9361采样 → 基带解调 → MAC解析 → DMA入内存 → Linux网络栈”的完整数据链路然后再对着源码逐个模块对照理解效率高了很多。4.3 FPGA工程编译从RTL到比特流编译FPGA工程是整个流程中耗时最长的环节。Openwifi的FPGA工程规模不小包含了完整的WiFi PHY和MAC再加上Zynq的ARM硬核系统和AXI互联总线在普通PC上用Vivado跑一次完整实现可能需要2到4小时。这里有几个加速和注意事项增量编译Vivado支持增量布局布线如果只修改了部分逻辑可以只重新生成被修改区域显著缩短编译时间。我通常在调试PHY层的某几个模块时使用这种方式一个小时左右就能出结果资源占用评估Openwifi在Zynq平台上占用约60%至80%的LUT和FF资源不同型号板卡资源差异很大编译前先看工程里的资源利用率报告避免出现布线拥塞导致时序不满足时序约束工程的XDC约束文件里对时钟和接口时序做了约束如果自己添加了外部设备或修改了时钟方案需要同步更新约束否则极容易出现时序违例IP核更新不同Vivado版本的IP核升级对话框各不相同升级时注意检查IP核的配置参数有没有被重置。我遇到过一次FFT IP核升级后输入数据宽度从16位变成了默认的8位导致整个接收链路数据全错的情况排查了很久才定位到是IP核参数在升级时发生了变化。理论上按照官方README文档的步骤从Vivado中运行综合、实现、生成比特流通过JTAG下载到板卡后嵌入式侧的Linux系统就能检测到PCIe或AXI总线上挂载的无线设备。不过仅下载比特流还不够还需要完成驱动模块的加载和配置。4.4 驱动编译、加载与建网连接Openwifi的Linux驱动是以独立模块的形式提供的需要针对目标的Linux内核版本进行编译。我通常在PetaLinux构建过程中就把驱动模块集成进去这样生成的根文件系统里自带驱动省去后续手动拷贝模块的步骤。部分模块还需要依赖mac80211内核子系统因此要注意内核配置里开启CONFIG_MAC80211。驱动加载完成后通过dmesg可以看到无线设备注册成功的日志。此时可以把它当作一个普通的无线网卡来管理用iw命令扫描周围的无线网络或者说用hostapd配置成AP模式。Openwifi的文档里提供了最简配置示例大致是编辑/etc/hostapd.conf指定接口名、SSID、信道、加密方式启动hostapd守护进程配置网络接口的IP地址并启动DHCP服务。如果一切顺利用手机搜索周围的WiFi网络就能看到Openwifi的SSID连接后能够获取到IP地址。这个过程看起来和普通路由器没什么区别但背后的数据处理链路已经完全不同了——你手机发出的每一个数据包都经过了FPGA里的OFDM调制、DAC转换、射频放大最终被射频天线发送出去而这条链路的每一级都是你可以修改和观测的。4.5 数据抓包与性能验证Openwifi最大的乐趣之一是可以从FPGA内部抓数据。除了通过标准的tcpdump在网卡层面抓包外还可以在FPGA逻辑里用调试IP核比如Xilinx ILA抓PHY层解调后的数据。这就好比在普通网卡的“天线端”和“网线端”同时安了探针可以清晰地看到从无线信号到以太网数据包的完整转换过程。我在验证接收链路时用ILA抓了FFT模块的输出数据即解调后的星座点坐标。如果发射端发的是BPSK信号星座点应该分布在实轴的1和-1附近两个点如果是64QAM则应该是8×8的网格状分布。通过观察星座图可以快速判断接收链路里是否存在载波频偏、时钟偏差或信道失真问题。这种从底层观测信号质量的能力是FPGA平台区别于所有商业WiFi芯片的最大优势。性能验证方面Openwifi的吞吐量和距离与理论值有差距这很正常。毕竟它的目的是提供一个可修改的实验平台而不是追求极限性能。一把测速结果可以参考20MHz带宽、单一空间流、64QAM调制、5/6码率时理论速率约58MbpsOpenwifi在理想环境下实测能跑到20到30Mbps的UDP吞吐量TCP吞吐量略低一些。如果距离拉远或者存在多径效应吞吐量会显著下降。要在这个平台上做性能优化方向通常集中在降低中断开销、优化DMA描述符管理、调整PHY层AGC参数与均衡器系数这几个方面。5. 排错指南从编译到运行的常见坑5.1 Vivado综合与实现的典型问题在FPGA工程编译阶段遇到过的问题主要有三类第一类是IP核许可证无效导致综合失败。这类错误通常在综合早期就会暴露提示信息也比较明确但解决方案比较麻烦——要么换用已获授权的IP核版本要么购买完整授权。在学术场景下可以考虑申请Xilinx大学计划提供的免费许可证覆盖面比较广。第二类是时序收敛问题。当修改了PHY层某些组合逻辑较深的模块后容易出现建立时间违例。我的经验是优先检查跨时钟域逻辑是否有同步处理其次是简化关键路径的组合逻辑级数。Openwifi内部存在多个时钟域AD9361的采样时钟、FPGA的处理时钟、AXI总线的时钟它们之间传递数据必须通过异步FIFO或者双寄存器同步器处理缺少同步环节会让时序分析工具无法正确约束并导致实际使用时出现偶发数据错误。第三类是引脚分配冲突。在移植到非官方推荐的板卡时XDC约束文件里的引脚位置必须按照实际硬件连接修改。一个常见问题是GPIO引脚在多个模块间复用Vivado在布局时会报告逻辑冲突按错误提示逐个修改约束文件即可。5.2 AD9361配置与收发信号异常排查射频前端的问题通常表现为“发射距离短”“接收灵敏度低”或者“完全搜索不到网络”。排查有个固定的顺序先确认AD9361的寄存器配置是否正确。Openwifi的代码里有一套完整的初始化序列但在调试时最好还是能回读几个关键寄存器确认状态。例如AD9361的enable状态寄存器、PLL锁定状态寄存器如果PLL没有锁定收发链路完全无法工作。再检查FPGA与AD9361之间的数据接口时序。我之前调试时遇到过“数据偶发错位”的问题原因就是LVDS接口的延迟约束没有设置好。Xilinx FPGA与AD9361之间通常通过IODELAY来调整采样时刻这个延迟值需要根据实际布线长度和时钟相位来校准。Openwifi代码里提供了一个校准机制但前提是外部时钟和复位信号正常否则校准值完全不可用。最后检查天线和射频开关。虽然听起来很基础但确实验到过天线接触不良导致接收信号弱到无法解调或者射频开关状态配置错误导致收发通路不切换。如果怀疑这类问题用频谱仪看天线端是否真的有信号是最直接的判断方法。5.3 驱动加载与建网失败的软件排查驱动模块加载失败时先看内核日志。常见的错误包括模块依赖的符号未导出通常是因为内核版本与模块编译时的内核版本不一致重新编译模块即可解决初始化的硬件地址无效一般是设备树节点配置有误检查设备树里描述FPGA外围设备的中断号、地址范围是否正确DMA内存分配失败常见于系统内存不足或者CMA连续内存分配器配置过小PetaLinux的默认CMA大小可能不够DMA使用建议至少留出64MB到128MB的连续内存。启动AP模式失败的排查顺序也类似先确认网络接口是否有效再检查hostapd配置里的信道是否被雷达信号占用DFS信道尤其需要注意然后是加密参数是否合规。Openwifi的一些滤波器或调制参数在特定信道上可能表现不佳实际测试时优先固定在1、6、11这几个常用信道上能减少很多不可控因素。使用iw工具时如果扫描不到周围的无线网络先不要急着怀疑射频链路。有一种可能是你所在环境周围确实没有足够强的信号源或者是信道设置与周边的路由器不同。此时可以用Openwifi自带的环回测试模式把发射链路直接环回给接收链路验证基带处理是否正常。环回正常说明问题出在射频或天线环节环回异常则要深入检查PHY层的信号处理链路。5.4 调试技巧与工具使用心得调试Openwifi最实用的三个工具是Vivado的硬件管理器ILA、逻辑分析仪和抓包工具。这三者配合使用可以覆盖从RF信号到Linux网络包的全链路。ILA集成逻辑分析仪是调试FPGA内部信号的利器。在综合前把需要观测的信号添加到ILA IP核中重新编译然后在硬件管理器里触发并观测波形。比如调试MAC层的退避计时器可以在ILA里观察信道忙闲信号和退避计数器的关系对照802.11协议确认计数器是否按预期递减。实测下来ILA观测PHY层OFDM调制解调中间节点的时序很有用但要注意ILA会占用大量片上存储添加的信号越多、采样深度越大资源开销越大因此最好分批次观测关键信号而不是把所有信号一次性都加进去。抓包工具方面除了常规的tcpdump外Openwifi还支持在接收路径上做一个“旁路监听”功能即在MAC层把收到的802.11原始终帧导出来用Wireshark分析。这对于查看管理帧、控制帧的交互流程特别方便。调试建网关联问题时用Wireshark抓取Authentication、Association、EAPOL等管理帧的交互过程能很快定位问题出在协议的哪个阶段。另外一个实测很有用的技巧是在调试过程中保持一个已知正常的、可随时回退的配置版本。Openwifi的配置参数非常多信道带宽、调制方式、发射功率、保护间隔等改动一个参数有时会导致完全不同的行为。每完成一轮实验就把配置和对应的实验结果记录下来。我后期在对比不同均衡算法效果时就是通过回溯记录找到最优参数组合的如果没有这些记录面对无数组参数组合根本无从下手。6. 这个项目还能怎么玩二次开发的方向与扩展思路Openwifi虽然是一个研究性项目但它的架构设计给二次开发留了充足空间。简单列举几个我认为值得尝试的方向。第一个方向是PHY层算法的验证。Openwifi的发射链路和接收链路都完整地在RTL里实现了这使它成为验证新型调制编码策略的绝佳平台。如果你想验证一种新的信道估计方法可以只修改接收链路中导频提取和信道均衡相关的模块其他部分保持不变然后用标准WiFi设备作为信号源来测试新算法在实际无线环境下的性能。这种“部分修改、整体验证”的开发方式可以帮你把一个新想法从仿真带到真实环境这一步的提升非常大。我自己的经验是很多算法在仿真环境里表现完美放到真实多径信道下就露馅而Openwifi让我能在一天之内完成从修改到实测的闭环。第二个方向是MAC层的协议创新。因为MAC层的时间关键部分都在FPGA里而策略部分在Linux驱动里所以你可以针对特定场景做定制化改造。比如实现一个专门面向工业控制的TDMA接入机制避开了CSMA/CA的随机退避开销达到更确定性的时延。在Openwifi里这种改造不需要改动PHY层只需要修改MAC层的信道接入状态机并在驱动里增加相应的控制逻辑。虽然工作量大但在其他平台上连入手的门路都找不到。第三个方向是把它当作SDR教学平台。对很多刚开始接触软件定义无线电的学生来说Openwifi的代码量可能偏大但它毕竟是一个完整可运行的802.11系统比在MATLAB里仿真或者用USRP做窄带实验要接近实际得多。我见过有人用它做毕业设计里的原型验证也有人用它给低年级研究生做无线通信实验课的平台。虽然上手曲线稍陡一些但只要熬过最初两周的熟悉期后面的收获会非常大。在做二次开发时必须强调的一点是一定要先跑通原始版本再动代码。Openwifi涉及的模块很多任何一个微小改动都可能引发连锁问题。我在最初接触这个项目时曾试图跳过文档直接改代码结果花了整整一周的时间排查一个因为改动了MAC层某个状态机的状态编码而导致的问题。后来老实从原始版本开始逐个模块理解再针对目标功能做修改调试效率才慢慢上来。这也许是最值得分享的经验——面对一套体量很大的开源代码克制“马上动手改”的冲动先把原始版本跑明白是最快的学习路径。