lwIP 2.0.3 移植笔记(基于 STM32 + μC/OS-II)
本次实验参考自原子已经移植好的 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,ðernetif_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)的更多相关文章
- RT-thread-2.0.1移植(基于STM32F4xx)
1.将下载的rt-thread-2.0.1解压后,得到如下图所示的文件列表. 在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉.在libcpu下, ...
- 基于STM32的USB枚举过程学习笔记
源:基于STM32的USB枚举过程学习笔记 基于STM32的USB枚举过程学习笔记(一) 基于STM32的USB枚举过程学习笔记(二) 基于STM32的USB枚举过程学习笔记(三) 基于STM32的U ...
- 基于STM32的uCGUI移植和优化
基于STM32的uCGUI移植和优化 首先在开始这个说明之前,要简要说明下具体的环境: 编译工具:MDK4.20 开发板:安富莱v2版开发板 调试器:JLink v8盗版 移植篇 相信大家有移植经验 ...
- LwIP应用开发笔记之一:LwIP无操作系统基本移植
现在,TCP/IP协议的应用无处不在.随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛.在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结. 1.技术准备 ...
- 基于STM32的uCOS-II移植详解
百度:基于STM32的uCOS-II移植详解 源:基于STM32的uCOS-II移植详解
- uC/OS-II 移植笔记
用过51.AVR.Freescale.STM32,但是写程序一直没有用过实时操作系统,一是因为写的项目不大,二是不太想去看手册学东西.现在写的项目也算比较大,因为需要,所以就学一下,这样也不至于每次的 ...
- 《玩转Django2.0》读书笔记-Django配置信息
<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...
- 《玩转Django2.0》读书笔记-Django建站基础
<玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...
- 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)
本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...
随机推荐
- Final——无线网络密码破解——WPA/WPA2
Final--无线网络密码破解--WPA/WPA2 20154305 齐帅 ↓ ↓ ↓ * # % & 郑 重 声 明 & % # * ↓ ↓ ↓ 本实验教程用于探索无线路由安全漏洞, ...
- 两种 js下载文件的方法(转)
function DownURL(strRemoteURL, strLocalURL){ try{ var xmlHTTP = new ActiveXObjec ...
- p112 the podocyte
正常人尿液只有一很少的蛋白质.尿蛋白特别是白蛋白的出现,是肾小球疾病的重要特征,也是众多肾脏疾病的关键的诊断标记,包括了统计数据或者说经济效应上都很重要的那些肾病.糖尿病肾病等等.可能没被广泛认识的是 ...
- jsp获取当前项目跟路径
在jsp中获取当前项目的根路径: <% String basePath = request.getScheme() + "://"+ request.getServerNam ...
- Redis和memcached缓存技术
缓存的定义:缓存就是在内存中存储的数据备份,当数据没有发生本质变化的时候,我们避免数据的查询操作直接连接数据库,而是去 内容中读取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度 ...
- python网络编程 双人多人聊天
在学习网路编程时,我们首先要考虑的是其中的逻辑,我们借助打电话的形式来了解网络编程的过程, 我们打电话时属于呼叫方,接电话的属于被呼叫方,那么被呼叫方一直保持在待机状态,等待主呼叫方 呼叫,只有在被呼 ...
- hbuilder真机调试时,手机端无法连接电脑测试的处理办法
首先保证手机端与电脑处在同一网段 关闭电脑防火墙 电脑服务端需要配置iis网站,同时在hbuilder的manifest.json 配置与iis网站ip一致的url
- Windows环境下MySQL 5.6安装与配置
1将MySQL压缩包解压到自定义目录下. 2.添加环境变量 右键单击我的电脑->属性->高级系统设置(高级)->环境变量. 点击系统变量下的新建按钮 1) 输入变量名:MYSQ ...
- 从字节码看java类型转换【 深入理解 (T[]) new Object[size] 】
我们都知道,java中对类型的检查是很严格的,所以我们平操作时,也往往很小心. 如题: (T[]) new Object[size],这种写法是一般我们是不会干的!但是有点经验的同学,还是会遇到这样写 ...
- Linux — 文件、目录管理
目录与路径 . 此层目录 .. 上层目录 - 之前一个工作目录 ~ 主文件夹 ~ account 指定用户的主文件夹,account --账号名称 cd 切换目录 pwd (print worki ...