LWIP 移植文件

来源:互联网 发布:盘锦网络维护培训学校 编辑:程序博客网 时间:2024/05/17 07:31

要将以太网驱动和LWIP链接在一起还需要一些中间文件,这些文件很重要。这些中间文件包括:cc.hcpu.hperf.hsys_arch.csys_arch.h

stm32f4x7_eth_bsp.c   netconf.c   为硬件驱动配置文件。

stm32f4x7_eth.c  驱动库传输层硬件配置文件。

 

 st官网资料是相当可以利用的,



 

 按照图片所示步骤,一步一步便找找到了自己所要的开发包了。

lwIP移植工作()cc.hCPU和编译器的相关接口

Lwip的移植主要是三个接口部分:

1、与CPU或编译器相关接口(includecc.h文件)

2、与操作系统的接口;

3、与底层网卡驱动的接口。

一、与CPU或编译器相关接口

CPU或编译器相关接口(includecc.h文件),主要包括数据长度,字的高低位顺序,编译器对C语言struct结构字节对齐问题(c语言中struct结构是四字节对对齐的,但lwip中是根据struct结构中不同数据的长度来读取数据的)

 

lwIP移植工作 sys_arch.h sys_arch.c与操作系统的接口

与操作系统的接口,主要分为四个部分

1sys_sem_t信号量: 在sys_arch中应实现如下sys_sem_t结构体和处理函数

       struct sys_sem_t

      sys_sem_new()            //创建一个信号量结构

      sys_sem_free()            //释放一个信号量结构

      sys_sem_signal()           //发送信号量

      sys_arch_sem_wait()     //请求信号量

2sys_mbox_t消息:LwIP使用消息队列来缓冲、传递数据报文,在sys_arch中应实现如下sys_sem_t结构体和处理函数

       struct sys_mbox_t

      sys_mbox_new()   //创建一个消息队列

      sys_mbox_free()    //释放一个消息队列

      sys_mbox_post()   //向消息队列发送消息

      sys_arch_fetch()    //从消息队列中获取消息

3sys_arch_timeout()函数:LwIP中每个与外界网络连接的线程都有自己的timeout属性,即等待超时时间。这个属性表现为:每个线程都对应一个sys_timeout结 构体队列,包括这个线程的timeout时间长度,以及超时后应调用的timeout函数,该函数会释放连接和回收资源的工作。如果一个线程对应的sys_timeout为空(NULL),说明该线程对连接做永久的等待。

timeout结构体已经由LwIPsys.h中定义好了,而 且对结构体队列的数据操作也由LwIP负责,我们所要实现的是如下函数:struct sys_timeouts* sys_arch_timouts(void),这个函数的功能是返回目前正处于运行态的线程所对应的timeout队列指针。timeout队列属于线 程的属性,因此是与OS相关的函数,只用由用户实现。

sys_thread_new创建新线程函数:LwIP可以是单线程运行,即只有一个TCPIP线程(tcpip_thread),负责处理所有的TCP/UDP连接,各种网络程序都通过TCPIP线程与网络交互。但LwIP也可以多线程运行,以提高效率,降低编程复杂度。这时需要用户实现创建新线程的函数:void sys_thread_new(void(*thread)(void* arg),void* arg);


lwIP移植工作 ethernet.c网卡驱动程序

网卡驱动程序

       LwIP的网络驱动有一定的模型,/src/netif/ethernetif.c文件即为驱动的模版,用户为自己的网络设备实现驱动时应参照此模块。在LwIP中可以有多个网络接口,每个网络接口都对应了一个struct netif。这个netif包含了相应网络接口的属性、收发函数。LwIP通过调用netif的方法netif->input()netif->output()进行以太网packet的收发等操作。在驱动中主要做的就是,实现网络接口的收发、初始化以及中断处理函数。驱动程序工作在IP协议模型的网络接口层,它提供给上层(IP层)的接口函数如下:

void ethernetif_init(struct netif* netif)   //网卡初始化函数

void ethernetif_input(struct netif*netif)       //网卡接收函数,从网络接口接收以太网数据包,并把其中的IP报文向IP层发送,在中断//方式下向网卡ISR调用

ett_t ethernetif_output(struct netif* netif,struct pbuf*p,struct ip_addr* ipaddr)       //网卡发送函数,给IP层传过来的IP报文加上以太网//包头,并通过网络接口发送

void ethernetif_isr(void) //网卡中断处理函数ISR


 

 

 

 

0 0
原创粉丝点击