资讯动态

LWIP在Windows下基于CMake与MinGW-W64的移植避坑指南

发布时间:2026/9/28 2:00:05 来源:尧图企业网站定制
折腾过LWIP做嵌入式网络开发的朋友应该都有这种感觉在单片机上把协议栈跑起来其实不算太难反倒是想先在PC上做点协议验证、抓包调试、性能摸底的时候一堆跟嵌入式毫无关系的环境问题会先把你拦在门外。LWIP在Windows下的移植表面上就是源码拉下来、CMake一配、编译通过但实际操作里CMake和MinGW-W64工具链的搭配坑我前前后后踩了将近两周查过的issue讨论比看协议源码的时间还多。这篇东西不是LWIP协议本身的教程也不是CMake入门手册而是专门针对LWIP Windows CMake MinGW-W64这套组合的避坑记录。适合这几类人看想在Windows上快速跑通LWIP做上层应用调试的嵌入式工程师、准备把LWIP移植到自研RTOS但想先在PC上熟悉协议逻辑的开发者、以及被CMake各种诡异报错折磨到怀疑人生的同学。我会从工具链选型讲起把源码选择、CMake参数、MinGW-W64版本陷阱、pcap依赖、常见编译错误一条一条捋清楚。先说一个反直觉的结论在Windows上移植LWIP最难的部分往往不是LWIP本身而是让CMake觉得你用的是Windows、但又不完全是Windows。这句话我后面会反复解释。1. 移植前的三件事版本分支、模拟层选型、工具链策略1.1 先搞清楚你拿到的LWIP源码是哪个物种很多人从官网或GitHub拉下来的LWIP源码解压后第一反应是看src目录里面有core、api、netif等子目录这没问题。但如果你拉的是老版本release比如2.0.x或者2.1.2会发现顶层根本没有CMakeLists.txt只有一堆分布在各目录的.mk文件。LWIP的构建体系长期以来都是给Makefile用的CMake支持是后来才补上的而且不同版本之间的CMake支持力度差异极大。我推荐的基线版本是STABLE-2_2_0_rev2及以上的release或者直接拉master分支。从2.2.0开始源码树的CMakeLists.txt设计得相对完整contrib目录下的移植层也同步维护得比较好。这里有个关键区别LWIP的项目分为两个仓库lwIP主协议栈源码和lwIP-contrib移植示例、模拟层、应用示例新版构建通常需要两个一起用CMake配置里会通过LWIP_CONTRIB_DIR变量指定contrib路径。另外一个容易忽略的点有些人从STM32CubeMX生成的工程里提取LWIP源码来用这种源码是ST维护的适配版里面已经带好了lwipopts.h和arch/cc.h但它是给IAR/Keil/STM32CubeIDE用的拿到Windows CMake环境里反而是累赘。因为ST版的移植层对裸机或STM32 HAL做了强耦合跑在Windows用户态下会出现大量编译错误。所以如果你是用CubeMX生成的LWIP代码想改到Windows跑我建议放弃这个思路老老实实回官方仓库拉一份干净的源码重新做移植层。1.2 LWIP在PC上有几种模拟运行层别选错LWIP本身设计为无OS依赖可以在裸机、RTOS、或者普通操作系统进程里运行。在PC上做运行验证常见的有三条路contrib/ports/unix官方自带基于pthreadlibpcap用一套模拟的sys_arch层实现互斥锁、信号量、邮箱等OS原语网络收发通过pcap包捕获库直接读写物理网卡。这是最接近真实嵌入式部署方式的移植推荐优先使用。contrib/ports/win32也是官方维护的Windows专用移植依赖WinPcap/Npcap但整体代码比unix版旧很多API没跟上新版本LWIP构建体验稍差。自己写最小模拟层只用src/api RAW API跑协议逻辑不接物理网卡只做内存级回环测试。这条路适合做协议栈单元级验证但网络数据出不了本机。选择上我的建议是如果你的目的是在Windows上跑一个完整的、可以ping通可以telnet的LWIP实例直接选unix模拟层配合pcap。它名义上叫unix但在MinGW-W64环境下是可以正常编译运行的——前提是工具链配置对这也是这篇文章后面所有内容的由来。1.3 工具链策略不是最新就是最好统一和稳定才是关键Windows下可用的GCC工具链很多MinGW.org的原版、MinGW-W64含多个分支、MSYS2、Cygwin、WinLibs等。对于LWIP CMake这个场景MinGW-W64是公认最顺的选择。为什么特意排除MSYS2和Cygwin倒不是说它们不行但这两个环境自带POSIX模拟层会让你的源码在它以为自己是Windows、但依赖了Linux头文件的灰色地带里游走。LWIP的unix模拟层里有不少#include pthread.h、#include semaphore.h、#include pcap.h的代码在MSYS2里你可能依赖它自带的POSIX包侥幸编译过但一旦切回纯MinGW环境就处处报错。问题在于你根本分不清哪些代码是干净的跨平台写法哪些是碰巧依赖了MSYS2的手工补丁——这种模糊地带对调试来说是灾难。MinGW-W64就干净得多它只给你Windows原生API 标准C库POSIX层的功能pthread、semaphore等通过winpthreads单独提供能过就是能过不能过直接报错原因清晰。这里还要强调一个版本玄学MinGW-W64编译器在Windows上的位数和异常处理模型直接影响LWIP这种带大量底层操作的项目。我建议直接用x86_64-w64-mingw32-gcc的64位版本配合--enable-threadsposix这个构建选项编译出来的工具链MinGW-W64官方安装包的默认选项里基本都带。用错了线程模型会在链接pthread相关符号时各种undefined reference排查起来很痛苦。2. MinGW-W64安装阶段的高频翻车点2.1 不要装错位数WinPcap开发库的架构必须和编译器一致这大概是移植过程中最隐蔽的深坑。LWIP的unix模拟层需要libpcap来收发原始以太网帧而Windows上libpcap的替代品是WinPcap开发者包WpdPack或Npcap SDK。WpdPack的Lib目录里同时提供了x64和32bit两个子目录里面是wpcap.lib和Packet.lib两个导入库文件。问题来了如果你用的是64位MinGW-W64编译器就必须链接Lib/x64下的wpcap.lib如果你用的32位编译器则必须链接Lib/32bit下的。这俩文件不能混用否则链接阶段会报一堆奇怪的undefined reference或者更隐蔽的——链接成功但运行时一调用pcap函数就崩溃。因为32位导入库里的函数签名和调用约定在64位进程里是错位的。我的建议是不管机器有没有64位需求直接全部统一到64位环境64位编译器 x64的WpdPack 64位版本的Npcap/WinPcap驱动。Windows上ppc驱动本身是内核态的和用户态代码位数无关所以驱动装一个就行。2.2 PATH环境变量里的真假美猴王MinGW-W64的安装过程中一个极常见的问题是PATH变量里同时存在多个MinGW相关路径。比如你以前装过Dev-Cpp自带了老版MinGW32、或者装过Qt自带工具链、或者用Chocolatey装过其他GCC这些工具链的bin目录都会往PATH里塞。CMake在搜索编译器的时候用的是find_program机制按PATH顺序找gcc.exe。如果你PATH里先出现的是老版MinGW32的bin目录CMake会直接用它来配置整个工程然后你在CMakeCache里看CMAKE_C_COMPILER发现路径完全不是你想要的。这个问题的坑爹之处在于编译器版本不一致带来的报错往往不会直接说编译器不对而是体现在某个头文件找不到、某个宏没定义、某个内建函数不存在让人以为是代码问题。我自己吃过的亏装了mingw-w64-install之后因为PATH里Dev-Cpp的路径还排前面CMake配置完成后编译LWIP时报#error Unknown target这类跟平台判断相关的错误。最后排查了半小时才用gcc -v发现版本完全不对。所以安装完工具链第一件事就是gcc --version gcc -dumpmachine-dumpmachine应该输出类似x86_64-w64-mingw32的结果如果输出的是i686-w64-mingw32或mingw32就要检查PATH顺序了。2.3 安装路径里的空格与中文目录这个其实是老生常谈但每次都能坑到人。MinGW-W64安装时如果你自定义安装目录千万不要选C:\Program Files\...这种带空格的路径更不要选带中文的路径。CMake生成的Makefile里会硬编码编译器路径而Make在处理带空格的路径时需要额外转义LWIP的CMake脚本本身没做这么完善的路径处理一旦在-isystem或-I参数里出现带空格路径构建过程会冒出一堆莫名其妙找不到头文件的错误。最稳妥的安装路径格式是C:\mingw64干净、无空格、无特殊字符。同理LWIP源码的clone目录和contrib目录也不要放在带空格的路径下。我一般习惯把整个工作区放C:\work\lwip-win32这样的结构里。另外提醒一句MinGW-W64官方在SourceForge上的那个installer界面选择架构时有个下拉框默认是i68632位一定要改成x86_64。很多教程截图没强调这一点导致有人按照默认值装了32位工具链后面跑64位库又全乱了。2.4 编译器自带的库缺失导致链接期大面积告警MinGW-W64安装完成后bin目录下除了gcc.exe、g.exe还有libwinpthread-1.dll、libgcc_s_seh-1.dll等运行时DLL。LWIP unix模拟层启用了pthread之后编译出的exe运行时就依赖这些DLL。问题出在如果你把exe拷到别的机器跑或者PATH里没有MinGW-W64的bin目录程序会直接报找不到libwinpthread-1.dll无法启动。这个问题在开发机上不太明显因为你的PATH里通常有MinGW的bin但一旦你想把测试程序交给同事或移到其他目录运行就会暴露。解决方案有两个一是把MinGW-W64的bin目录永久加入系统PATH仅限自己开发机二是用静态链接在CMake里加上set(CMAKE_EXE_LINKER_FLAGS -static-libgcc -static-libstdc -Wl,-Bstatic -lwinpthread -Wl,-Bdynamic)我更推荐第二种这样产出的exe完全独立方便环境复现。3. CMake配置的关键参数与宏定义3.1 源码版本和CMakeLists的对应关系LWIP主仓库的CMakeLists.txt在2.2.0版本之后才开始具备完整的配置选项包括LWIP_USE_OS、LWIP_BUILD_APPS、LWIP_HAVE_SYS_SOCKET_H等选项。如果你用STABLE-2_2_0_rev2这个版本CMakeLists已经能正常处理contrib的路径。在实际操作中我会先把仓库结构固定下来lwip-win32/ ├── lwip/ # 官方协议栈源码 ├── lwip-contrib/ # 官方移植与应用代码 └── build/ # CMake构建目录然后CMake配置时明确传递几个关键变量cmake -S lwip -B build \ -DLWIP_CONTRIB_DIR../lwip-contrib \ -DCMAKE_SYSTEM_NAMEWindows \ -DCMAKE_C_COMPILERgcc \ -DLWIP_USE_OS1LWIP_USE_OS1是这里面的核心开关。LWIP源码内部通过这个宏决定是否启用sys_arch层操作系统模拟层。在unix模拟层里这个宏必须为1否则协议栈会以裸机模式编译而你export出来的接口就没有对应的OS原语实现链接必失败。3.2 避免平台宏的误判CMAKE_SYSTEM_NAME的双刃剑这是CMake配置LWIP时最微妙的地方。set(CMAKE_SYSTEM_NAME Windows)会让CMake预定义WIN32、_WIN32这些平台宏同时会告诉CMake使用MinGW工具链规则寻找编译器和查询库。对LWIP来说_WIN32是需要的因为源码里有#ifdef _WIN32之类的平台分支但CMake同时会尝试去查找Windows平台的SDK和库可能在find_library阶段引入一些你根本用不到的Windows系统库。反过来的问题是如果不设置CMAKE_SYSTEM_NAMECMake在MinGW环境下会默认按MSVC Windows或者宿主系统来处理导致编译器检测时虽然找到了gcc但生成的compile command里缺少-D_WIN32LWIP源码里的Windows专用代码不被激活反而走了Linux分支然后include一堆Windows下不存在的头文件。我验证下来的正确姿势是显式设置CMAKE_SYSTEM_NAME Windows同时不要用CMAKE_TOOLCHAIN_FILE直接让它走MinGW内置规则。如果你用toolchain file方式反而容易在某些CMake新版本里触发交叉编译检查报compiler appears to be targeting MSVC之类的干扰信息。3.3 依赖pcap头文件和库的三种途径LWIP unix模拟层的核心网络读写在contrib/ports/unix/netif目录下它直接调用libpcap的API。CMake必须能正确找到pcap的头文件和导入库。官方contrib的CMake脚本里写的是find_path(PCAP_INCLUDE_DIR pcap.h)和find_library(PCAP_LIBRARY wpcap)所以你有几种方式让CMake找到它们第一种最省事把WpdPack/Include和WpdPack/Lib/x64塞到系统环境变量CPATH和LIBRARY_PATH里要求MinGW支持这两个变量实测是支持的。CMake的find_path/find_library会默认搜索这些路径。第二种手动传给CMake变量cmake -S lwip -B build \ -DPCAP_INCLUDE_DIRC:/WpdPack/Include \ -DPCAP_LIBRARYC:/WpdPack/Lib/x64/wpcap.lib这里的PCAP_LIBRARY变量名不是固定的取决于contrib/ports/unix/CMakeLists.txt里的find_library写的变量名。不同版本可能是PCAP_LIBRARY也可能是LIBPCAP_LIBRARY建议直接打开文件看一眼再传。第三种如果你用Npcap SDK路径结构和WpdPack基本一致把Include、Lib/x64指向Npcap SDK对应目录即可。这里有一个值得强调的细节wpcap.lib是MSVC格式的导入库MinGW的链接器默认能正确处理MSVC格式的导入库吗答案是能。MinGW的ld可以直接链接MSVC编译生成的.lib导入库只要它是标准COFF格式。真正不能用的场景反而是MSVC的静态库.lib里包含对象文件在某些情况下会与MinGW的运行时库冲突。但wpcap.lib只是跳转到wpcap.dll的转发壳所以没问题。3.4 几个必要的编译宏和链接选项在LWIP里lwipopts.h是配置协议栈行为的核心头文件。unix模拟层在contrib/ports/unix/include下带了一个默认的lwipopts.h但为了在Windows上正常编译有几个宏需要额外确认LWIP_NOASSERT建议在Windows模拟层置1。LWIP源码里大量使用LWIP_ASSERT在正常协议运行中它会检查各种内存边界和状态机一旦不满足就调用LWIP_PLATFORM_DIAG输出并进入abort()。在PC上调试上层应用时频繁abort非常影响验证效率所以先关掉断言等逻辑稳定了再打开。LWIP_PLATFORM_BYTE_ORDERx86_64是小端这个宏一般不需要显式设置但如果某些MinGW版本的头文件没有正确定义字节序需要手动加#define LWIP_PLATFORM_BYTE_ORDER LWIP_LITTLE_ENDIAN。PACK_STRUCT_FIELD/PACK_STRUCT_STRUCT在unix模拟层下默认是__attribute__((packed))编译器对结构体对齐的处理在MinGW下正常不需要改。LWIP_RAND()默认LWIP_RAND是空函数TCP的ISN初始化依赖它如果保持空会导致每次启动的初始序号固定这在调试时会带来两个连接互相干扰的假象。建议定义为一个返回rand()的宏或者用GetTickCount()做种子。链接选项上CMake里需要保证-lwpcap和-lws2_32都在链接参数里。ws2_32是Winsock库LWIP的模拟层内部虽然不直接跑Winsock但部分辅助代码比如错误码转换会引用它漏掉的话会报__imp_WSAGetLastError之类的undefined reference。4. 真实环境里的四个高频故障与完整排查链路下面这四条故障是我自己从零到一搭环境时实际遇到过的每条都是典型的排错半小时、解决在一念之间问题。4.1 故障一unistd.h找不到现象CMake配置成功执行构建后大量报错集中在#include unistd.h找不到。这个错误的根源要从两个层面看。第一层LWIP主源码里src/arch.h或src/include/lwip/arch.h会根据平台宏来决定是否include unistd.h在Linux下这是正常的因为unistd.h是POSIX标准头文件用来声明read/write/close等函数。但Windows的MinGW环境里默认没有这个头文件MinGW-w64提供了compat版本unistd.h但路径很偏默认搜索规则里不推荐依赖它。第二层也是更常见的根因某些LWIP源文件里直接无条件#include unistd.h典型地方是contrib/ports/unix下的netio和simnodes代码没有用#ifdef LWIP_UNIX_LIKE_OS包起来。这些代码本来是给Linux准备的在Windows下编译时必须通过LWIP_UNIX_LIKE_OS之类的宏做过滤。排查链路遇到这个错误先不要急着改代码用grep -R #include unistd.h找出所有引用位置。然后看这些引用是在哪些宏保护之内。如果是官方unix模拟层目录里的文件通常是这段代码本身就需要这些POSIX函数那你需要做的是在编译选项中定义对应平台宏打开MinGW对POSIX辅助函数的支持——比如确认你编译器是posix线程模型版本但如果报错的源文件进入了lwip/src/core这种协议栈核心目录那就说明平台的宏判断错了CMake在编译协议栈源文件时应该通过-DLWIP_UNIX_LIKE_OS1让核心源码跳过那部分POSIX特定代码。这里的核心操作是逐个打开报错文件读代码、看条件编译而不是盲目加-Dunistd之类的手工补丁。我最后用的方案是在CMakeLists里给LWIP_SOURCES的编译接口统一加上target_compile_definitions(lwip PRIVATE LWIP_UNIX_LIKE_OS1)同时在调整unix模拟层的源码时把跨平台部分包一层#ifdef __unix__。4.2 故障二pcap头文件找到了但库链接却报错现象CMake配置阶段明确输出找到了pcap.h和wpcap.lib整个工程编译完成但链接阶段报../bin/wpdpack.dll相关错误或者报skipping incompatible字样。skipping incompatible ... when searching for -lwpcap这句话是MinGW链接器的经典抱怨直译是在搜索wpcap库时跳过了不兼容的文件。要么是find_library找到了32位的lib但你的工具链是64位要么是某个路径下还保留着一个带-前缀的Unix风格libwpcap.aMinGW按-lwpcap搜索时优先按libwpcap.a或libwpcap.dll.a的命名规则匹配结果匹配到了错误文件。排查链路执行构建时把VERBOSE1传进去cmake --build build --verbose从输出的完整链接命令行里看-lwpcap展开后的实际路径。如果显示的是C:/WpdPack/Lib/x64/wpcap.lib但后面跟了skipping incompatible大概率你的编译器是32位的。如果显示的是某个libwpcap.dll.a而且路径不是你指定的WpdPack目录说明CMake变量没传对搜索的是自动找到的wsl库。另外一个很阴间的可能性WinPcap的驱动没有安装或Npcap没有装WinPcap兼容模式。链接阶段本身能通过但exe运行到pcap_findalldevs_ex时崩溃或返回空列表。cmd窗口里跑net start npcap可以查驱动状态但如果你用的是WpdPack库且装的是Npcap必须在安装Npcap时勾选WinPcap API兼容模式否则函数可以调用但拿不到任何网卡设备。4.3 故障三协议栈编译过了但TCP/IP收不到任何数据包现象exe能启动、LWIP初始化日志正常打印但ping不通LWIP的IP地址用tcpdump/Wireshark也看不到来自LWIP的响应包。这个坑的排查链路和前面的编译问题性质完全不同已经进入了运行时阶段。我当时的排查顺序是这样的第一步确认LWIP跑在哪个网卡上。unix模拟层的默认行为是用pcap_findalldevs枚举本机所有网卡默认选第一个非回环设备。如果你的PC是笔记本第一个设备可能是虚拟机的虚拟网卡、蓝牙PAN网卡、或者WLAN网卡。LWIP绑定在WLAN上后路由器或同一局域网内的其他机器是能访问的但如果你只想和本机通信局域网里的机器和这台机器用的是不同物理网卡包根本不会到LWIP监听的网卡上。用默认配置在Windows笔记本上的表现就是ping不通但抓包软件能看到ARP请求反复发送。这个问题需要通过代码里修改默认网卡选择策略来解。contrib/ports/unix/netif/ethernetif.c里有类似pcap_open_live的调用可以传PCAP_IF_LOOPBACK或指定网卡名。我调试阶段的做法是在打开pcap前打印所有网卡名、描述、IP地址然后指定用与需求IP段匹配的网卡。如果只是本机验证可以用pcap在回环设备上跑但注意Windows对回环设备的语义和Linux的lo不完全一样尤其在LWIP自己的ARP缓存场景里会有点绕不建议把回环当第一选择。第二步查看LWIP的IP分配。contrib/ports/unix/port/netif.c里默认调用了静态IP接口一般是192.168.1.10/24和你需要通信的网段可能不在同一个段。如果你的exe在和网段192.168.1.x的机器通信那没问题但如果是测试笔记本网卡在192.168.137.x就完全不在一个广播域里。第三步检查Wireshark是否能抓到LWIP发出的ARP请求。如果抓到的全是ARP的“who has 192.168.1.10”而没有response说明LWIP可能卡在初始化哪里了或者网卡选择错了如果能抓到response但ping还是不通可能涉及Windows防火墙拦截了ICMP。LWIP在用户态通过pcap和物理网卡交互发出的原始帧Windows防火墙不认为是合法网络栈流量会拦截。这种我遇到过两次解决方法是打开防火墙的入站ICMPv4规则或者直接临时关闭防火墙测试来验证。4.4 故障四CMake缓存污染导致的幻想错误现象修改了CMakeLists.txt里的某个路径或打开了某个选项之后重新cmake报了一个看起来完全无关的旧错误而且删除build目录后重新配置就好了。这个幻想错误会浪费大量时间尤其是当你反复调整工具链路径时。根因很简单CMake的CMakeCache.txt会缓存首次配置时检测到的所有路径、变量、编译器特征。你改了源码或CMakeLists但缓存的CMAKE_C_COMPILER、PCAP_LIBRARY、LWIP_CONTRIB_DIR还是旧值。尤其在你切换MinGW-W64版本或重新安装工具链之后缓存里的编译器路径还是旧的CMake重新配置时发现路径不存在会尝试用旧的工具链规则做compiler test然后把错误信息包装成编译器无法编译简单测试程序这种超级误导的结果。排查链路遇到任何编译器找不到、库版本不对、CMake Error at CMakeLists.txt之类信息第一步永远是删build目录从头来一遍。这不是玄学这是CMake使用者的基本素养。有一个更精细的建议不要直接删build目录可以保留CMakeCache.txt备份然后用cmake -U *PCAP* -U CMAKE_C_COMPILER* -S lwip -B build这种定向删除缓存的命令。但在LWIP移植这个场景下我建议还是全删重来更快因为整个配置时间也就几十秒。5. 编译完成后的联通验证与后续扩展5.1 一套标准的验证流程经过前面那些折腾当你的程序能在Windows下成功编译、运行、打印出TCP/IP initialized successfully之类的日志后不要急着庆祝先跑一套标准的联通性验证流程确认协议栈不是外强中干打开Windows命令行ipconfig确认你绑定的物理网卡IP。假如是192.168.137.1但程序里静态设置LWIP为192.168.1.10先改代码把LWIP IP改成同网段。在同机器的另一个终端执行ping LWIP_IP。如果通了说明ARP、IP、ICMP这链路基本正常。如果ping不通用Wireshark抓包看两点有没有ARP请求发出LWIP有没有回应。这一步不能省因为网络问题必须靠观察包来定位而不是靠猜。进一步验证TCP层可以用Python或Netcat做一个简单的TCP测试在Windows上开一个监听端口然后在LWIP里写个TCP client去连接它或者反过来用LWIP开一个HTTP服务器用浏览器访问。能用浏览器打开LWIP的web页面说明TCP窗口、顺序号、重传机制都正常工作了。我自己实测时比较喜欢用contrib/apps/httpd里的http示例编译进去后直接浏览器访问LWIP的IP地址如果能出页面整个TCP协议栈的运行状态就很清楚了。5.2 从Windows模拟环境迁移到真实嵌入式平台最后说一个经验层面的东西。很多人会问我在Windows上跑通LWIP对真实单片机的移植到底有多大帮助答案是有帮助但需要把控好度。我在Windows上完成调试后最直接的收益是理解了协议栈初始化的完整流程lwip_init要做什么、netif_add和netif_set_up的先后关系、TCP/UDP的API调用模型。这些逻辑在单片机上几乎可以原样复用因为协议栈本身屏蔽了硬件差异。但有三块东西在Windows上验证不了换到单片机上必须重新处理一是物理网卡驱动的收包过程Windows用pcap轮询单片机靠中断DMA二是存储规划PC上有虚拟内存单片机要靠malloc或内存池管理三是功耗管理这种属于产品化需求模拟环境管不到。我自己在做RTOS移植时惯用的方法是把Windows模拟环境作为上层应用逻辑验证台把STM32等实际硬件留到最后的设备驱动联调阶段。这样分工可以大幅缩短在开发板上的调试时间——多数协议逻辑问题在Windows上就能定位不需要频繁烧录板子看串口打印。另外有一个可以立即用起来的小技巧在Windows模拟环境里你可以很方便地把所有LWIP事件的日志输出到文件然后用脚本做回归测试。比如构造不同的TCP连接、断开、重连场景把协议栈行为全部记录下来。这在单片机上做起来非常费劲但在Windows环境下几乎零成本。这也是我坚持折腾这个移植环境的最大理由。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑