LwIP移植心得

2024-05-02 18:08
文章标签 移植 心得 lwip

本文主要是介绍LwIP移植心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LwIP终于能跑了,总结下:
平台是LPC2136+ENC28J60,32K的RAM,软件是uCOS-II 2.51+LwIP 1.1.1。
感觉主要解决两个问题:
操作系统仿真层的移植。这个基于uCOS-II的代码太多了。COPY下就行!
1,设备驱动的移植.
驱动的移植主要就是完成ethernetif.c的工作。作者已经给好了驱动的接口。
struct netif {
  struct netif *next;
  struct ip_addr ip_addr;
  struct ip_addr netmask;
  struct ip_addr gw;
  err_t (* input)(struct pbuf *p, struct netif *inp);
  err_t (* output)(struct netif *netif, struct pbuf *p,
       struct ip_addr *ipaddr);
  err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
  void *state;
#if LWIP_DHCP
  struct dhcp *dhcp;
#endif
  unsigned char hwaddr_len;
  unsigned char hwaddr[NETIF_MAX_HWADDR_LEN];
  u16_t mtu;
  char name[2];
  u8_t num;
  u8_t flags;
};
主要就是:
    err_t (* input)(struct pbuf *p, struct netif *inp);
        这个是被驱动调用的,传递一个数据包给TCP/IP栈。
    err_t (* output)(struct netif *netif, struct pbuf *p,struct ip_addr *ipaddr);
        这个是被IP模块调用的,向以太网上发送一个数据包,函数要先通过IP地址获得解决硬件地址,然后发包。
    err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
        这个是直接发送数据包的接口。

相应的作者在ethernetif.c里面给了几个函数框架,这个文件相当于一个硬件抽象层。
static void low_level_init(struct netif *netif)
    网卡初始化函数
static err_t low_level_output(struct netif *netif, struct pbuf *p)
    链路层发送函数,实现err_t (* linkoutput)接口。
static struct pbuf *low_level_input(struct netif *netif)
    得到一整帧数据
static err_t ethernetif_output(struct netif *netif, struct pbuf *p,struct ip_addr *ipaddr)
    实现发送线程,实现err_t (* output)接口。
static void ethernetif_input(struct netif *netif)
    实现接收线程,识别数据包是ARP包还是IP包
err_t ethernetif_init(struct netif *netif)
    初始化底层接口,给作者给好了驱动的接口赋值啊啥的。

其实,写驱动的时候只要自己再建个ethernet.c,实际的网络硬件控制的文件
然后提供几个函数
比如:
void EMACInit( void )
    硬件的初始化
void EMACPacketSend ( u8_t *buffer, u16_t length )
    用来将buffer里面的包复制到网络设备的发送缓冲里面,发送。
u16_t EMACPacketReceive ( u8_t *buffer, u16_t max_length  )
    用来将网络设备的接收缓冲里面的包数据复制到buffer里面。
u16_t EMACPacketLength ( u16_t max_length )
    获得包长度
    还有其他控制类函数。

最后,用ethernet.c里的函数完成ethernetif.c里的框架。这样脉络可能会清楚一点。

2,应用层的那边的问题。
有几个概念。
1.lwip提供三种API:1)RAW API 2)lwip API 3)BSD API。
    对于多任务系统而言,因为lwip采用的是将TCP/IP协议放在一个单独的线程里面,所以那个线程是tcpip_thread。采用RAW API回调技术,就得把应用层程序写在tcpip_thread这个线程里面,作为同一个任务运行。
    而采用lwip API,就可以将TCP/IP协议和应用层程序放在不同的任务里面,通过调api_lib.c提供的函数,编写相应的应用层代码。好象一般都会采用这种方式。
    BSD API就是那sockets.c里面的,没用过。

2.任务间是如何调度的。
如图这样,
点击看大图
    从底层到应用层,一般将底层数据接收做为一个线程,可以建个任务也可以直接在中断里解决。
然后tcpip_thread是一个线程,最后是应用层一个线程。
    底层的邮箱投递活动是通过调用tcpip.c里的tcpip_input。这个函数向tcpip_thread投递消息。高层的投递应该是通过tcpip_apimsg。

遇到的问题:
1,一开始移植的时候,驱动写好的,能PING通,但TCP的任务没反应,这个我那问题是lwip协议栈的问题,换个版本的协议栈就搞定了,网上吧,下的协议栈,有的是有问题的。

现在开始应用层的开发了......
参考了一个例子

点击下载

这篇关于LwIP移植心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954858

相关文章

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

libmad音频解码库-Linux交叉编译移植

下载并解压libmad-0.15.1b.tar.gz 下载链接:https://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz $tar -xvf libmad-0.15.1b.tar.gz$cd libmad-0.15.1b 1、先执行下面的命令:这条命令是为了适配高版本的gcc,因为高版本的gcc已经将-fforce-mem去除了:

arm linux lua移植

lua: lua home 1.下载lua源码 lua下载 lua-5.3.4.tar.gz 2.解压: tar xvf lua-5.3.4.tar.gz 3.修改makefile and luaconf.h $修改 lua-5.3.4/Makefile #INSTALL_TOP= /usr/local INSTALL_TOP= $(shell pwd)/out #修改安装目录(当前目录/o

ZYNQ LWIP (RAW API) UDP函数学习

1 RAW API接口 RAW API是基于回调函数实现的API接口,它是很底层的API接口,这需要开发者对LwIP有较深的了解才能很好使用它,RAW API的核心就是对控制块的处理,因为对于报文数据的处理、注册回调函数等都是需要开发者自己去实现,都是比较麻烦的,但是有一个优点,那就是处理数据效率高。 2 RAW API的UDP函数说明 udp_new()–新建控制块 在使用UDP协议进行通

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

招聘面试程序员的一些心得

         最近雅虎北研解散的消息触动了各大互联网公司 HR 的神经。公司里一下子面试的任务多了起来。正好借机会总结一下自己毕业后作面试官以来参与若干场技术面试的一点心得,分享一下。        当好一个面试官其实也很不容易,不但要练就一双火眼金睛,把优秀的人才和水货在短短的面试的几十分钟里分辨出来,同时面试官本身就是候选人观察公司的一个窗口。在面试中,面试官还要注意很多接人待

android4.4的Keyguard心得

在总结锁屏代码之前,有两个中心思想要铭记于心 A) KeyguardHostView就是我们最终所要展示的界面,所以不论用什么方法手段,都要将这个KeyguardHostView添加到窗口中,后续填充它,都是细节问题 B) 那么问题来了,通常我们将一个view添加到窗口中会用什么方法呢?          答案有两种 1 WindowManager.addView()  2 Lay

qt和VS动态库调用心得

1 动态库调用 1.1 QT动态库调用 1.1.1 创建一个动态链接库步骤 1)create C++类库 2).pro文件里增加路径DESTDIR= ..\MyDebug 3)编译 注:主要的不同,两点:增加了一个***_global.h和class***SHARED_EXPORT   1.1.2 调用动态链接库 1).pro文件里增加DESTDIR= ..\MyDebug,也可