美文网首页
lwip 1.4.1到lwip2.1.2升级之路

lwip 1.4.1到lwip2.1.2升级之路

作者: tianxiaoMCU | 来源:发表于2019-01-14 20:48 被阅读0次

    V1.4.1与V2.1.2的文件对比

    根目录

    从解压后的文件结构可以看出,结构上没有改动,因为用了git,所以增加了两个相关的文件,并添加了另外两个文件。

    doc文件夹

    主要增加的doxygen这个文件夹,对查看文档非常有帮助。其它的看看就行了。

    src文件夹

    V2.1.2相对V1.4.1增加了很多的上层应用,这些应用都放在apps这个文件夹里了。

    api文件夹

    这里只多了一个''if_api.c''的一个文件,跟socket有关;

    core文件夹

    snmp文件夹移到apps里边去了,timers.c改成了timeouts.c,增加了其它的几个文件。

    include文件夹

    posix文件夹移到compat去了,ipv4和ipv6里的文件移到lwip了

    netif文件夹

    只是新增了文件。

    test文件夹

    增加了很多测试例程,根据需要看看就好,不影响升级。

    升级步骤

    升级有一个前提,必须保证除移植以外的文件都是官方的,没有被修改过。因为,升级需要替换掉这些文件,如果修改过,那就有得扯了。这里用NUC472_NUC442_BSP_CMSIS_V3.03.000中的FreeRTOS_lwIP_TCP_EchoServer为例进行说明,开发工具为Keil MDK。

    • 1、打开 MDK 工程, 删除工程中的lwip V1.4.1 的源文件(除了移植相关的!!), 然后将 V2.1.2 的源文件直接添加到工程,并调整相关的头文件包含路径;

    • 2、V1.4.1中的ppp_oe.h在V2.1.2中改名为pppoe.h,原工程中包含的头文件作相应的修改;V1.4.1中,原本要在cc.h定义的数据类型,在新版本中已经在arch.h定义。如果你的编译器无法提供stdint.h的话才需要像之前版本一样要在cc.h定义。在本例中就不需要定义,所以删除cc.h中的下面定义

      typedef uint8_t   u8_t;
      typedef int8_t    s8_t;
      typedef uint16_t  u16_t;
      typedef int16_t   s16_t;
      typedef uint32_t  u32_t;
      typedef int32_t   s32_t;
      typedef u32_t     mem_ptr_t;
      
    • 3、V1.4.1中的struct ip_addr在新版中改为ip_addr_t,此处要作相应修改;

    • 4、下载contrib-2.1.0,并用下图中的文件替换原工程中的相应文件
    • 5、编译一下,出现不少错误:

      错误提示 解决方法
      error: #136: struct "pbuf" has no field "ts_nsec" 出现这个是因为本例程的移植中在struct pbuf中增加了 TIME_STAMPING相关的定义。这里涉及到了官方的源码改动,暂时先不管,屏蔽该宏的定义。所以开头就说前提是保证官方源码没有改动,不然就麻烦了!!
      error: #109: expression preceding parentheses of apparent call must have (pointer-to-) function type 这个是因为LWIP_RAND在V1.4.1中是常量宏,定义在lwipopts.h中,而到了V2.1.2,它是宏函数的形式LWIP_RAND(),定义在cc.h中,所以出现这么个提示。本例在sys_arch.c中定义了_LWIP_RAND(),使用系统的tick计数作为随机数,因此在cc.h中定义#define LWIP_RAND() _LWIP_RAND() 即可。没有的话可以使用标准库的rand()
      Error: L6218E: Undefined symbol errno (referred from if_api.o). ethernetif.c中定义int errno;,全局搜索都没找到int errno;的定义,只好自己定义了。
      Error: L6218E: Undefined symbol sys_mbox_trypost_fromisr (referred from tcpip.o). 新版的sys.h中增加了err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg);,将中断和非中断分开了,以前是一起的。本例中的sys_mbox_trypost同时支持了两种方式,所以拷贝一份,将函数名改成这个就可以了。
      Error: L6218E: Undefined symbol sio_open (referred from slipif.o). slipif.c从工程中删除即可,这个没用上。
      Error: L6218E: Undefined symbol sio_read (referred from slipif.o). 同上
      Error: L6218E: Undefined symbol sio_send (referred from slipif.o). 同上
      Error: L6218E: Undefined symbol sio_tryread (referred from slipif.o). 同上

    相关文章

      网友评论

          本文标题:lwip 1.4.1到lwip2.1.2升级之路

          本文链接:https://www.haomeiwen.com/subject/odtddqtx.html