lwIP TCP/IP 协议栈笔记之九: 有操作系统(FreeRTOS)移植

目录

1. lwIP添加到工程

2. 添加文件

3. 修改网卡驱动

4. 协议栈初始化

5. 例程


LwIP 不仅能在裸机上运行,也能在操作系统环境下运行,而且在操作系统环境下,用户能使用NETCONN API 与Socket API 编程,相比RAW API 编程会更加简便。操作系统环境下,这意味着多线程环境,一般来说LwIP 作为一个独立的处理线程运行,用户程序也独立为一个/多个线程,这样子在操作系统中就相互独立开,并且借助操作系统的IPC 通信机制,更好地实现功能的需求。

LwIP 在设计之初,设计者无法预测LwIP 运行的环境,如果LwIP 要运行在操作系统环境中,那么就必须产生依赖,即LwIP 需要依赖操作系统自身的通信机制,如信号量、互斥量、消息队列(邮箱)等,所以LwIP 设计者在设计的时候就提供一套与操作系统相关的接口,由用户根据操作系统的不同进行移植,这样子就能降低耦合度,让LwIP 内核不受其运行的环境影响,因为往
往用户并不能完全了解内核的运作,所以只需要用户在移植的时候对LwIP 提供的接口根据不同操作系统进行完善即可。

1. lwIP添加到工程

 比较简单,与上节提到的无操作系统步骤类似,不做赘述

2. 添加文件

添加通用文件 lwipopts.h、cc.h、pref.h,

添加系统需要文件sys_arch.h 和 sys_arch.c实现系统抽象层相关功能,具体实现见之前的文章:

https://blog.csdn.net/XieWinter/article/details/98781176

懒得编写,官方有现成的例子,可以直接拷贝使用,至于关于freertos配置需要合适

contrib-2.1.0\ports\freertos

3. 修改网卡驱动

参考contrib-2.1.0\examples\ethernetif 修改。

参考https://blog.csdn.net/XieWinter/article/details/99544178

本质来讲,就是从让数据的收发,从无操作系统的轮询模式,切换到受IPC控制的多任务。

4. 协议栈初始化

使用LwIP,那就必须先将协议栈初始化,我们就创建一个函数,在函数中初始化协议栈,注册网卡,设置主机的IP 地址、子网掩码、网关地址等。

void TCPIP_Init(void)
{
  
  tcpip_init(NULL, NULL);
  
  /* IP addresses initialization */
  /* USER CODE BEGIN 0 */
#ifdef USE_DHCP
  ip_addr_set_zero_ip4(&ipaddr);
  ip_addr_set_zero_ip4(&netmask);
  ip_addr_set_zero_ip4(&gw);
#else
  IP4_ADDR(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3);
  IP4_ADDR(&netmask,NETMASK_ADDR0,NETMASK_ADDR1,NETMASK_ADDR2,NETMASK_ADDR3);
  IP4_ADDR(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3);
#endif /* USE_DHCP */
  /* USER CODE END 0 */
  /* Initilialize the LwIP stack without RTOS */
  /* add the network interface (IPv4/IPv6) without RTOS */
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);

  /* Registers the default network interface */
  netif_set_default(&gnetif);

  if (netif_is_link_up(&gnetif))
  {
    /* When the netif is fully configured this function must be called */
    netif_set_up(&gnetif);
  }
  else
  {
    /* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }

/* USER CODE BEGIN 3 */

/* USER CODE END 3 */
}

注意:

 tcpip_init(NULL, NULL);

netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);

5. 例程

ping 测试基本响应

工程链接:https://download.csdn.net/download/xiewinter/11596792

 

你可能感兴趣的:(嵌入式开发,TCP/IP,LWIP)