嵌入式LWIP网络客户端设计教程
嵌入式LWIP网络客户端设计教程
本文引用地址: http://embed.21ic.com/hardware/development/201805/53078.html
嵌入式技术的兴起使得传统的基于PC机的互联网技术优势不再,嵌入式网络客户端与服务端技术成为热点,而该技术需要移植性高、占用资源小的协议栈,轻量级TCP/IP协议栈LWIP (light weight Internet protocol)比较适合嵌入式设备中存储容量有限的情况,而且能实现TCP/IP协议栈的基木功能,不影响设备的网络互联与传输服务。轻量级网络协议LWIP依附的硬件操作系统有RT_Thread[2-3]和uC/OS-II[4-5],鉴于uC/OS-II是一款应用较为广泛、技术较成熟的操作系统,本文采用uC/OS-II操作系统设计网络客户端。实验结果表明:ping 32字节的数据,其收发正确,错误率为0%。
1 系统硬件
如图1所示:硬件采用STM32处理器作为主控芯片,通过以太网控制器EN28J60和RJ45接口连接互联网,而且为了进行功能扩展和试验验证,主控芯片也可以由串口与计算机进行数据互传。
STM32F107是主控芯片,它不仅具有USB OTG 和CAN2.0B接口,而且片上集成了以太网10/100 MAC模块。该模块支持MII和RMII两种模式,所以,主控制器只需外接一个物理层PHY芯片就可以实现一个完整的以太网收发器;在时钟信号方面,只需用一个25MHz的晶振就可以给整个主控制器提供时钟,而主控制器还能输出一个25MHz或50MHz的时钟,交外部物理层PHY层芯片使用,这样可以为系统节省一个附加晶振[6]。
以太网控制器是ENC28J60,它符合IEEE802. 3协议的全部规范,可以利用健全的包过滤机制对输入的数据包进行限制。集成了DMA模块,支持数据的高速吞吐率,并结合硬件实现IP地址校验和计算。它和主控器的通信依赖于两个中断管脚和SPI总线实现,数据传输速率高达10 MB/s,为了观察数据传输的活动状态,可以在两个专用的引脚接上发光二极管[7]。
2 操作系统移植
操作系统uC/OS-II移植涉及到的主要内容是[4-5][8]:修改并整合与处理器相关的源文件,包含os_cpu_c.c,os_cpu_a.s,os_cpu.h三个文件。其中os_cpu.h文件负责定义与编译器相关的数据类型、堆栈类型,另外还有几个宏定义和函数声明,在进行移植工作时,由于对一个相同的数据类型,不同的编译器所支持的数据长度却不相同,所以需要修改原来的数据类型。os_cpu_a.s文件主要负责定义与处理器相关的任务切换函数,实现任务上下文的切换以满足任务调度时的需要,另外还定义了时钟中断处理函数和进退临界区宏指令。os_cpu_c.c文件主要负责定义堆栈的初始化函数,以利于操作系统在进行任务切换或中断时对相关操作数据进行堆栈保护,另外还定义了相关的HOOK函数。
首先修改os_cpu_a.asm文件,将原来的RSEG CODE:CODE:NOROOT(2)改成:
AREA |.text|, CODE, READONLY, ALIGN=2;(其中AREA|.text|代表选择段|.text|,CODE指明代码段,READONLY代表默认情况:只读。由于当ALIGN=n,则字节数为2^n,故此处ALIGN=2表示对齐4字节。)
THUMB ;Thumb指令集
REQUIRE8 ;说明当前文件是八字节对齐堆栈需求
PRESERVE8 ;说明当前文件属于八字节对齐堆栈
修改os_cpu.h文件,注释掉下面的这三个函数:Void OS_CPU_SysTIckHandler(void);Void OS_CPU_SysTIckInit(void);UINT32 OS_CPU_SysTIckClkFreq(void);
修改os_cpu_c.c文件,注释掉以下定义和函数:
#define OS_CPU_CM3_NVIC_ST_CTRL (*((volaTIle INT32U *)0xE000E010))
#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014))
#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018))
#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01C))
#define OS_CPU_CM3_NVIC_PRIO_ST (*((volatile INT8U *)0xE000ED23))
#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000
#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004
#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002
#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001
#define OS_CPU_CM3_NVIC_PRIO_MIN 0xFF
void OS_CPU_SysTickHandler (void)函数
void OS_CPU_SysTickInit (void) 函数
3 轻量级协议栈LWIP的移植
LWIP是轻量级的TCP/IP协议栈,协议栈中涉及的函数与数据结构和操作系统及硬件不相关,如果需要使用uC/OS-II操作系统的函数,必须通过操作系统模拟层进行调用。所以移植LWIP协议栈,实际上就是移植到uC/OS-II操作系统。操作系统模拟层为定时器、同步处理、消息传送机制等服务提供一组外留的接口函数,为LwIP提供两种进程间通信方式:信号量和邮箱。创建任务函数、临界保护函数以及信号量和邮箱操作函数均由uC/OS-II提供,进行针对LwIP的移植任务时,就是修改相关接口函数(包括信号量操作函数、邮箱操作函数、临界保护函数、sys_thread_new( )函数、sys_arch_timeouts( )函数),从而实现LwIP操作系统模拟层的函数利用[4~5]。
LWIP的数据包包头是14个字节,基于LWIP的以太网接收的数据包格式以一个数据结构来描述:PACK_STRUCT_BEGIN
struct eth_hdr {
PACK_STRUCT_FIELD(struct eth_addr dest); //目标的媒质接入控制层地址
PACK_STRUCT_FIELD(struct eth_addr src); //源的媒质接入控制层地址
PACK_STRUCT_FIELD(u16_t type); //类型
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
其中几个PACK_STRUCT_xxx 的宏定义与编译器字对齐相关,上面的目标dest、源src和类型type三个字段分别对应目标的媒质接入控制层地址、源的媒质接入控制层地址、数据类型。
4 结论
测试前需要把计算机与嵌入式网口模块的IP地址配置在同一网段,IP地址分别为192.168.1.100,192.168.1.102。如果想查看IP地址配置情况,运行CMD命令行,执行ipconfig/all命令。配置完以后,接着ping嵌入式网口的IP地址,结果如图2所示。
从图2可以看出:主机ping 32字节的数据,4个包所用的时间最长为5ms,最短为3ms;而4个包的TTL值均为255, 这是由于最优路径选择算法定下来以后,经过一段时间稳定后,网络拓扑结构也稳定了,数据包的路由路径也会相应稳定在一个最优路径上。整个过程的数据收发正确,错误率为0%。
嵌入式LWIP网络客户端设计教程相关推荐
- 赛灵思 Xilinx Versal 自适应计算加速平台嵌入式设计教程
嵌入式设计教程 教程 描述 Versal 自适应计算加速平台 (UG1305) 本教程旨在提供有关将赛灵思 Vivado® Design Suite 流程应用于 Versal™ VMK180/VCK1 ...
- linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计
本嵌入式网络摄像机采用高性能ARM9芯片微处理器,内置嵌入式Web服务器. 通过嵌入式多任务操作系统采集摄像机视频数据:采集的视频信号数字化后经MJPEG算法压缩,再通过内部总线送到内置的Web服务器 ...
- 《『若水新闻』客户端开发教程》——06.设计新闻内容UI
本节课主要讲解新闻客户端设计新闻内容界面的设计思路. 主要把一些基本的组件按照需求进行组合. 效果图 课程下载 下载地址:http://115.com/file/e77sp42i
- android新闻客户端发展趋势,基于Android平台的新闻客户端设计与实现
杨苏雯 摘 要 在Android开发平台上,并在JavaWeb开发的PC端新闻网站的基础上结合现在的需求开发了移动版的新闻客户端App,这个系统设计主要分为用户登录验证模块.新闻列表的显示功能模块以及 ...
- android客户端设计,Android客户端设计.ppt
Android客户端设计 图16 .android.score包下各文件说明 .android.score包存放所有的功能界面,处理各种业务逻辑,是"豹考通"客户端的核心,该包下所 ...
- android新闻客户端实验报告,基于Android平台的新闻客户端设计与实现
摘 要 在Android开发平台上,并在JavaWeb开发的PC端新闻网站的基础上结合现在的需求开发了移动版的新闻客户端App,这个系统设计主要分为用户登录验证模块.新闻列表的显示功能模块以及新闻内容 ...
- 基于Android的MJPEG网络摄像机设计
1 系统硬件组成与网络架构 摄像机硬件核心采用三星公司推出的基于ARM9架构的S3C2440A芯片,该处理器主频达到400 MHz可以满足实时压缩,MJPEG视频流可以达到320×240分辨率25 f ...
- C#毕业设计——基于C#+asp.net+FTP的FTP客户端设计与实现(毕业论文+程序源码)——FTP客户端
基于C#+asp.net+FTP的FTP客户端设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+FTP的FTP客户端设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...
- 《嵌入式 - Lwip开发指南》第5章 LWIP测速
最近有个网友在询问关于LWIP的速度,本文就LWIP网速做个简单测试.为了对比,本文将使用无系统和有系统两种环境. 5.1网络测速工具介绍 不过在测速之前,需要介绍下测速的工具,这里有两个软件:iPe ...
最新文章
- 汇编语言 第3版 王爽 检测点6.1自己的答案
- #大学生活#锐捷客户端与VMWare
- JSP实现医院住院管理系统
- WINCE的内存配置
- “阳光天使”2007全国小姐大赛北京赛区决赛
- 小程序--计算正负数个数
- Google浏览器开发者工具:CSSViewer(一个Css查看器)
- 非常棒的FLASH版本PPT制作工具PREZI
- 从入门到入土:[SEED-Lab]MD5碰撞试验|MD5collgen实验|linux|Ubuntu|MD5 Collision Attack Lab|详细讲解
- Helm 3 完整教程(二十二):如何设置 Chart 安装完成后提示 NOTE 信息
- android之隐藏状态栏、图标、布局
- CentOS安装及注意事项
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树...
- linux无法侦听10000以上的端口,linux – git-daemon:“无法在主机(null)端口9418上分配任何侦听套接字”...
- ug添加imachining变量_UG变量设置
- php抽奖幸运,幸运大转盘-jQuery+PHP实现的抽奖程序
- MAC电脑如何用苹果电脑微信版实现多开
- sql语句的编程手册(转)
- STM32 MCP2515连发 多发 MCP2515收发程序 多路CAN通信 2路CAN
- 支付与对账业务的流程
热门文章
- 学计算机和服装哪个好,学服装设计用什么电脑好_服装设计用什么软件
- 【点云处理之论文狂读前沿版11】—— Unsupervised Point Cloud Pre-training via Occlusion Completion
- 很厉害很有用的Hosts,其实很简单!
- python一定要有主函数_Python主函数从不调用其他函数?
- MySQL密码重置(windows版本)
- 计算机网络学习笔记之物理层
- 用php实现计算两人名字之间的缘分
- 什么运动耳机不容易掉、佩戴稳固的运动耳机推荐
- 中国联通无信号无服务器,联通逐渐关闭2G、3G信号服务?中国联通:雨我无瓜...
- 数字图像平滑技术入门(图像滤波处理、降噪处理)