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

您所在的位置:网站首页 正点原子lwip 基于正点原子战舰V3的LwIP1.4.1移植过程

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

2023-09-06 12:09| 来源: 网络整理| 查看: 265

原正点原子的移植教程基于之前的内存管理,且在处理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 按下图移植源码至相应目录 keil工程目录 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); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3