基于正点原子战舰V3的LwIP1.4.1移植过程

原正点原子的移植教程基于之前的内存管理,且在处理LwIP定时事件时没有使用1.4.1版本中自带的处理函数sys_check_timeouts(),本文在正点原子的DM9000驱动程序下修改了一些移植过程,记录流程以备以后查看使用。

  • 一、工程目录搭建
    在基础工程根目录下创建LWIP文件夹,复制源码lwip-1.4.1至该目录中,并创建文件夹arch(移植必需的头文件)、lwip_app(lwip应用程序代码,分/inc 、/src两文件夹)
  • 二、keil工程配置
    1.创建工程目录LWIP_CORE、LWIP_API、LWIP_NETIF、LWIP_ARCH、LWIP_APP
    按下图移植源码至相应目录
    基于正点原子战舰V3的LwIP1.4.1移植过程_第1张图片
    2.头文件目录添加
    基于正点原子战舰V3的LwIP1.4.1移植过程_第2张图片
  • 三、移植头文件
    1.cc.h
    协议栈内部使用的数据类型定义、调试信息输出相关宏、大小端定义等
    2.perf.h
    系统统计和测量相关的头文件,不需要使用直接将宏定义为空
#ifndef __PERF_H__
#define __PERF_H__

#define PERF_START    //空定义
#define PERF_STOP(x)  //空定义

#endif /* __PERF_H__ */

3.lwipopt.h
对内核的参数配置,否则使用opt.h中默认参数

  • 四、网卡驱动
    1.在ethernetif.c中修改网卡驱动程序
    1)static void low_level_init(struct netif *netif)
    2)static err_t low_level_output(struct netif *netif, struct pbuf *p)
    对DM9000_SendPacket()封装
    3)static struct pbuf * low_level_input(struct netif *netif)
    对DM9000_Receive_Packet()封装
    4)err_t ethernetif_input(struct netif *netif)
    5)err_t ethernetif_init(struct netif *netif)

2.在ethernetif.h中添加函数声明和网卡名称

#ifndef __ETHERNETIF_H__
#define __ETHERNETIF_H__
#include "lwip/err.h"
#include "lwip/netif.h"

#define IFNAME0     'L'
#define IFNAME1     'Y'
err_t ethernetif_init(struct netif *netif);
err_t ethernetif_input(struct netif *netif);

#endif

3.读取网卡数据包交给内核处理
可以在lwipcomm.c中定义如下函数

/************************************
*操作:读取数据包
*说明:当接收到数据后调用,从网络缓冲区中读取接收到的数据包并将其发送给LWIP处理 
************************************/
void lwip_pkt_handle(void)
{
    ethernetif_input(&DM9000_netif);
}

五、安装LwIP时钟
在lwipcomm.c中添加时钟函数,即使用定时器中断,每10ms对全局变量lwip_localtime加10。
1.4.1版本中使用sys_check_timeouts()处理内核的各种定时事件,要求实现一个sys_now()返回当前系统时间

/************************************
*操作:获取当前时间,用于内核定时
*说明:
************************************/
unsigned int sys_now(void)
{
    return lwip_localtime;
}
  • 六、初始化协议栈
    在lwipcomm.c中初始化DM9000和协议栈内核
    声明一个全局的系统网络接口结构 struct netif DM9000_netif
    初始化代码
void LwIP_Init_task(void)
{
    struct ip_addr ipaddr, netmask, gw;
    
    DM9000_Init();
    lwip_init();
    IP4_ADDR(&ipaddr, 192, 168, 1, 30);
    IP4_ADDR(&netmask, 255, 255, 255, 0);
    IP4_ADDR(&gw, 192, 168, 1, 1);
    netif_add(&DM9000_netif, &ipaddr, &netmask, &gw, NULL, ethernetif_init, ethernet_input);
    netif_set_default(&DM9000_netif);
    netif_set_up(&DM9000_netif);
}

你可能感兴趣的:(stm32)