本次实验参考自原子已经移植好的 LWIP(版本:1.4.1)模板来进行的,感谢!

由于要做的一个小项目要用到网络通信,而且想要加上 UC/OS-II 跑个系统,感觉 LWIP 这个轻量级的 IP 协议栈再合适不过了,故浏览了下官方的下载地址(http://ftp.twaren.net/Unix/NonGNU/lwip/),发现此时的最新版是 2.0.3,下载下来对比原子的 1.4.1 版本,觉得新版本有以下优点便于移植:

1.4.1 版本中:
mempsize=memp_get_memorysize();
memp_memory=mymalloc(SRAMIN,mempsize);
ramheapsize=LWIP_MEM_ALIGN_SIZE(MEM_SIZE)+2*LWIP_MEM_ALIGN_SIZE(4*3)+MEM_ALIGNMENT;
ram_heap=mymalloc(SRAMIN,ramheapsize);
手动来分配 memp_memory 和 ram_heap 的内存,需要自己实现内存的动态分配(malloc free)等操作; 2.0.3 版本中:
const struct memp_desc* const memp_pools[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,
#include "lwip/priv/memp_std.h"
}; #define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)] LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM));
已经在 LWIP 的内核中完成了内存的分配,便于移植。

由于只是刚接触 LWIP,目前只是发现这个肤浅的优点,但新版本肯定优化了很多内容,通过源码中的 doc 文档可以得知,以后学习到会再次记录。

大体的移植步骤(细节已经不记得了....)

\1. 创建 LWIP_arch\arch 文件夹,加入以下文件(来自原子的 LWIP 例程):

\2. 将原子的 lwipopts.h 文件拷入 LWIP_include\lwip 目录下

\3. 将源码加入到 uc/os-ii 工程,如下图所示:



enc28j60.c 与 spi.c 文件导入原子的文件即可,其它皆为 LWIP 源文件。

\4. 将 arch.h 中的 LWIP_NO_STDINT_H 值置为 1 以启用 cc.h 文件。

\5. 导入 sys_arch.c 文件,屏蔽掉其中的 malloc 相关函数,自己分配静态内存即可,屏蔽其中的 sys_msleep 函数,使用新版本中自带的 sys_msleep 函数。

\6. 包含各目录下的头文件,其中有些文件需要注意: 例如 #include "lwip/opt.h" 只需要包含 lwip 文件夹所在目录即可。

编写 lwip_app.c 函数

#include "netif/etharp.h"
#include "lwip/dhcp.h"
#include "lwip/mem.h"
#include "lwip/memp.h"
#include "lwip/init.h"
#include "lwip/tcpip.h"
#include "lwip/ip_addr.h"
#include "delay.h"
#include "usart.h"
#include "enc28j60.h"
#include "lwip_app.h"
#include <stdio.h> __lwip_dev lwipdev;
struct netif lwip_netif; extern err_t ethernetif_input(struct netif *netif);
extern err_t ethernetif_init(struct netif *netif); void lwip_pkt_handle(void)
{
ethernetif_input(&lwip_netif);
} void lwip_default_ip_set(__lwip_dev *lwipx)
{
//初步使用静态方式分配 IP 地址,以后再启用 DHCP
lwipx->remoteip[0]=192;
lwipx->remoteip[1]=168;
lwipx->remoteip[2]=0;
lwipx->remoteip[3]=124; lwipx->mac[0]=enc28j60_dev.macaddr[0];
lwipx->mac[1]=enc28j60_dev.macaddr[1];
lwipx->mac[2]=enc28j60_dev.macaddr[2];
lwipx->mac[3]=enc28j60_dev.macaddr[3];
lwipx->mac[4]=enc28j60_dev.macaddr[4];
lwipx->mac[5]=enc28j60_dev.macaddr[5]; lwipx->ip[0]=192;
lwipx->ip[1]=168;
lwipx->ip[2]=0;
lwipx->ip[3]=123; lwipx->netmask[0]=255;
lwipx->netmask[1]=255;
lwipx->netmask[2]=255;
lwipx->netmask[3]=0; lwipx->gateway[0]=192;
lwipx->gateway[1]=168;
lwipx->gateway[2]=0;
lwipx->gateway[3]=1;
lwipx->dhcpstatus=0;
} u8_t lwip_app_init(void)
{
struct netif *Netif_Init_Flag;
struct ip4_addr ipaddr;
struct ip4_addr netmask;
struct ip4_addr gw; if(ENC28J60_Init())return 2; tcpip_init(NULL,NULL);
lwip_default_ip_set(&lwipdev); IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]);
IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
printf("网卡的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);
printf("网卡的IP地址为:........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
printf("子网掩码:..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
printf("默认网关:..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); Netif_Init_Flag = netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&tcpip_input); if(Netif_Init_Flag != NULL)
{
netif_set_default(&lwip_netif);
netif_set_up(&lwip_netif); printf("\r\n******** Netif up ok! ********\r\n");
} return 0;
}

运行效果

将 lwip_app_init() 接口加入到 main 主函数,编译下载运行,效果如下所示:

串口收到以下信息:

ping 测试:

lwIP 2.0.3 移植笔记(基于 STM32 + μC/OS-II)的更多相关文章

  1. RT-thread-2.0.1移植(基于STM32F4xx)

    1.将下载的rt-thread-2.0.1解压后,得到如下图所示的文件列表. 在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉.在libcpu下, ...

  2. 基于STM32的USB枚举过程学习笔记

    源:基于STM32的USB枚举过程学习笔记 基于STM32的USB枚举过程学习笔记(一) 基于STM32的USB枚举过程学习笔记(二) 基于STM32的USB枚举过程学习笔记(三) 基于STM32的U ...

  3. 基于STM32的uCGUI移植和优化

    基于STM32的uCGUI移植和优化 首先在开始这个说明之前,要简要说明下具体的环境: 编译工具:MDK4.20 开发板:安富莱v2版开发板 调试器:JLink  v8盗版 移植篇 相信大家有移植经验 ...

  4. LwIP应用开发笔记之一:LwIP无操作系统基本移植

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

  5. 基于STM32的uCOS-II移植详解

    百度:基于STM32的uCOS-II移植详解 源:基于STM32的uCOS-II移植详解

  6. uC/OS-II 移植笔记

    用过51.AVR.Freescale.STM32,但是写程序一直没有用过实时操作系统,一是因为写的项目不大,二是不太想去看手册学东西.现在写的项目也算比较大,因为需要,所以就学一下,这样也不至于每次的 ...

  7. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  8. 《玩转Django2.0》读书笔记-Django建站基础

    <玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...

  9. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

随机推荐

  1. [转]BSD系统正在死亡?一些安全研究人员这样认为

    摘要:在代码安全上被关注太少,漏洞没有被报告修补,FreeBSD.OpenBSD和NetBSD还能活下来吗? 在德国莱比齐的34c3网站上,IOActive的渗透测试主管Ilja von Sprund ...

  2. golang打造基于mail的提醒服务

    初识golang 逻辑如下: 程序开启http服务器接收请求,且每隔20秒查询一次表auto_backup中flag为0的值,如果有查到且计划执行时间小于当前时间,则将表to_do的数据抓出来,通过邮 ...

  3. PHP单一文件入口框架简析

    <?php /** * PHP单一文件框架设计简析 * 1.MVC架构实现 * 2.URL路由原理 */ //URL路由原理 /** * 路由作用 * 获取url中的c和a变量,执行c类对应的方 ...

  4. one-to-one 一对一映射关系(转 wq群)

    2.配置对应的xml配置文件 person的配置文件 idCard的配置文件 idCard的配置文件  3.测试 运行测试程序后,控制台输出两条语句

  5. 解决Eclipse中无法直接使用Base64Encoder的问题(转载)

    资源出处:https://blog.csdn.net/u011514810/article/details/72725398 Base64的加密解密都是使用sun.misc包下的BASE64Encod ...

  6. win32控制台程序 宽字符与短字符转化

    由于vs各版本之间存在字符设置不兼容问题,特总结char与tchar的互相转换函数,如下,在之后的工程中可以使用. void TcharToChar(const TCHAR * tchar, char ...

  7. 华为SSH认证配置

    [设备型号]华为switch-S5700s ————1: [SW1] rsa/dsa local-key-pair create #创建本地密钥对 The key name will be: SW1_ ...

  8. 使用Nginx+Uwsgi部署Python Flask项目

    第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...

  9. 【病毒分析】对一个vbs脚本病毒的分析

    [病毒分析]对一个vbs脚本病毒的分析 本文来源:i春秋社区-分享你的技术,为安全加点温度 一.前言 病毒课老师丢给我们一份加密过的vbs脚本病毒的代码去尝试分析,这里把分析过程发出来,供大家参考,如 ...

  10. 一分钟理解 HTTPS 到底解决了什么问题

    本文原作者“虞大胆的叽叽喳喳”,原文链接:jianshu.com/p/8861da5734ba,感谢原作者. 1.引言 很多人一提到 HTTPS,第一反应就是安全,对于普通用户来说这就足够了: 但对于 ...