0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LwIP的无操作系统基本移植

CHANBAEK 来源:木南创智 作者:尹家军 2022-12-14 14:53 次阅读

现在,TCP/IP协议的应用无处不在。随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结。

1 、技术准备

我们采用的开发平台是STM32F407和LwIP协议栈。在开始之前,我们需要做必要的准备工作。

首先要获得LwIP的源码,在网上有很多,不同版本及不同平台的都有,不过我们还是建议直接从官方网站获得。

其次,需要硬件平台,我们采用了STM32F407ZG+DM9161的网络接口方式,这并不是必须的,其他硬件平台也是一样的。

最后,因为我们后面要在操作系统下移植,采用的操作系统是FreeRTOS,所以还需下载FreeRTOS的源码。

2 LwIP****简要说明

LwIP是一款免费的TCP/IP协议栈,但它的功能趋势十分完备。LwIP 具有三种应用编程接口 (API):

  • Raw API :为原始的 LwIP API。它通过事件回调机制进行应用开发。该 API 提供了最好的性能和优化的代码长度,但增加了应用开发的复杂性。
  • Netconn API :为高层有序 API,需要实时操作系统 (RTOS)的支持 (提供进程间通讯的方法)。 Netconn API 支持多线程工作。
  • BSD Socket API :类似 Berkeley 的套接字 API (开发于 Netconn API 之上) 。

对于以上三种接口,前一种只需要裸机即可调用,后两种需要操作系统才能调用。所以据此LwIP存在两种移植方式:一是,只移植内核,此时应用程序的编写只能基于RAW/Callback API进行。二是,移植内核和上层API,此时应用程序编写可以使用3种API,即:RAW/Callback API、Sequential API和Socket API。

3 LwIP****的无操作系统基本移植

在移植之前,我们需要对源码有一些了解,以及清楚API如何使用,才能进行很好的移植。在源码的文件中有两个文本文件:rawapi.txt和sys_arch.txt。在rawapi.txt文件中,作者说明了怎样使用协议栈的Raw/Callback API进行编程。而在sys_arch.txt文件中,说明了如何移植,规定了移植者需要实现的函数宏定义等。接下来我们就据此来实现移植。

其实,进行无操作系统的移植,所需要做的工作并不多,一是需要定义几个协议在所需要的头文件。二是需要编写网卡的驱动程序,而写驱动程序是主要工作所在。

首先我们说需要定义的头文件。根据sys_arch.txt文件中的要求,我们需要实现cc.h、lwipopts.h和perf.h三个头文件,线描述如下:

  • cc.h文件主要完成协议栈内部使用的数据类型的定义,以保证平台无关性。
  • lwipopts.h文件包含了用户对协议栈内核参数进行的配置。
  • perf.h文件是实现与系统统计和测量相关的功能。

其次要实现网卡的驱动,事实上我们采用STM32F407自带的网卡,以及ST的开发库时,驱动大部分都写好了,我们只需要完成硬件IO部分的配置以及一些必要的参数配置就可以了。

接下来就是实现几个必要的函数,按照LwIP作者给出的模板,需要实现5个函数如下:

  • **low_level_init **调用以太网驱动函数,初始化 STM32F4xx 和 STM32F2x7xx 以太网外设
  • **low_level_output **调用以太网驱动函数以发送以太网包
  • low_level_input 调用以太网驱动函数以接收以太网包
  • ethernetif_init 初始化网络接口结构 (netif)并调用low_level_init以初始化以太网外设
  • ethernetif_input 调用low_level_input接收包,然后将其提供给LwIP栈

以上这些函数都实现后,我们需要使协议运转起来,所以我们还需要做两件事,一是对协议及网卡初始化;二是实现对数据的轮询,当然也可使用中断方式,不过在这里我们使用查询方式。

初始化部分,除了初始化默认网络接口的参数外,需要注册2个函数,一是初始化网络接口函数 ethernetif_init 一是数据包接收函数 ethernet_input 实现如下:

1 /* LwIP初始化配置 */
 2 void LWIP_Init_Configuration(void)
 3 {
 4   /* IP赋值 */
 5   IP_ADDRESS[0] = 192;
 6   IP_ADDRESS[1] = 168;
 7   IP_ADDRESS[2] = 2;
 8   IP_ADDRESS[3] = 110;
 9   NETMASK_ADDRESS[0] = 255;
10   NETMASK_ADDRESS[1] = 255;
11   NETMASK_ADDRESS[2] = 255;
12   NETMASK_ADDRESS[3] = 0;
13   GATEWAY_ADDRESS[0] = 192;
14   GATEWAY_ADDRESS[1] = 168;
15   GATEWAY_ADDRESS[2] = 2;
16   GATEWAY_ADDRESS[3] = 1;
17  
18   /* 在无操作系统环境下初始化LwIP协议栈 */
19   lwip_init();
20  
21   /* 固定IP地址初始化(IPv4) */
22   IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
23   IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
24   IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);
25  
26   /* 添加无操作系统的网络接口参数 */
27   netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
28  
29   /* 注册缺省的网络接口 */
30   netif_set_default(&gnetif);
31  
32   if (netif_is_link_up(&gnetif))
33   {
34     /* 连接正常时,启用网络接口 */
35     netif_set_up(&gnetif);
36   }
37   else
38   {
39     /* 连接故障时,停止网络接口 */
40     netif_set_down(&gnetif);
41   }
42  
43 }
44 初始化完成需要调用ethernetif_input接收数据才能实现通讯,其实现很简单。
45 /* 以太网轮循处理函数 */
46 void EthernetProcess(void)
47 {
48   ethernetif_input(&gnetif);
49  
50   /* 无操作系统超时检测 */
51   sys_check_timeouts();
52  
53 }

这样每次查询都会检查是否有数据收到,并通过ethernet_input函数发送到协议栈进行处理。其实,可能大家会发现还有一个 sys_check_timeouts() 函数,它是一个超时检测函数,要求调用一个名为 sys_now() 的函数来返回系统时钟,而 sys_now() 函数是我们需要实现的,各个系统复杂程度不同,在这里我们使用了STM32的HAL库,所以实现就很简单了。

4 、结论

前面已经完成了无操作系统LwIP的移植,那怎么知道我们的移植是否成功呢?接下来我们对它进行必要的验证。

首先我们查看目标板在网络上的配置是否正确。我们打开命令行窗口,运行ipconfig命令,查看MAC地址和IP地址配置:

我们配置的MAC地址00:08:E1:00:00:00和IP地址192.168.2.110显示正常。接下来我们采用ping命令测试网络链接:

上图显示网络连接正常,说明我们的LwIP在无操作系统情况下移植正常。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6289

    浏览量

    121897
  • 移植
    +关注

    关注

    1

    文章

    367

    浏览量

    27854
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1272

    浏览量

    78304
  • LwIP
    +关注

    关注

    1

    文章

    82

    浏览量

    26629
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 #LWIPLWIP-19 ENC28J60模块LWIP操作系统移植1-3

    LwIPENC28J60
    水管工
    发布于 :2022年11月11日 14:57:07

    #硬声创作季 #LWIPLWIP-19 ENC28J60模块LWIP操作系统移植1-4

    LwIPENC28J60
    水管工
    发布于 :2022年11月11日 14:57:43

    #硬声创作季 #LWIPLWIP-20 ENC28J60模块LWIP操作系统移植2-1

    LwIPENC28J60智能操作系统
    水管工
    发布于 :2022年11月11日 14:58:06

    #硬声创作季 #LWIPLWIP-20 ENC28J60模块LWIP操作系统移植2-2

    LwIPENC28J60智能操作系统
    水管工
    发布于 :2022年11月11日 14:58:44

    #硬声创作季 #LWIPLWIP-20 ENC28J60模块LWIP操作系统移植2-3

    LwIPENC28J60智能操作系统
    水管工
    发布于 :2022年11月11日 14:59:25

    #硬声创作季 #LWIPLWIP-20 ENC28J60模块LWIP操作系统移植2-4

    LwIPENC28J60智能操作系统
    水管工
    发布于 :2022年11月11日 15:00:04

    #硬声创作季 #LWIPLWIP-20 ENC28J60模块LWIP操作系统移植2-5

    LwIPENC28J60智能操作系统
    水管工
    发布于 :2022年11月11日 15:00:45

    #硬声创作季 #LWIPLWIP-20 ENC28J60模块LWIP操作系统移植2-6

    LwIPENC28J60智能操作系统
    水管工
    发布于 :2022年11月11日 15:01:21

    一起讨论讨论 STM32F407 DP83848 LWIP 操作系统移植

    之前一直看原子的操作系统移植LWIP,看了很久没搞懂,甚至一步一步照着操作也没成功。然后又转向ST官网,修改官网例程。照着网上以为网友分享
    发表于 05-03 09:13

    如何解决lwip移植出错问题?

    原子哥,在做LWIP操作系统移植的时候,液晶显示有问题,调试一下出现的截图,求助一下,该怎么修改代码
    发表于 07-01 04:35

    为什么LWIP操作系统移植但ping不通IP?

    显示无法访问目标主机
    发表于 10-09 04:35

    为什么UCOSIII中移植LWIP会出现编译错误?

    移植的时候其实也就是把已经通过了的UCOSIII的源码拷进原子哥的LWIP操作系统移植那个例程里面,但是文件添加完后,一直有这个编译错误
    发表于 10-10 21:35

    LWIP操作系统移植不能识别jlink

    用原子的 网络实验1 LWIP操作系统移植无法识别jlink其他基础例程,UCOS等例程都可以,就这一个程序无法识别,换过电脑,换jlink都一样,配置也都一样,请问原子哥和各位大神
    发表于 03-11 04:36

    NXPl788上lwip的无操作系统移植,基于Embest开发板

    NXPl788上lwip的无操作系统移植,基于Embest开发板
    发表于 03-26 15:59 85次下载

    LwIP的带操作系统基本移植

    现在,TCP/IP协议的应用无处不在。随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结。
    的头像 发表于 12-14 15:35 662次阅读
    <b class='flag-5'>LwIP</b>的带<b class='flag-5'>操作系统</b>基本<b class='flag-5'>移植</b>