微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式LWIP网络客户端设计

嵌入式LWIP网络客户端设计

时间:12-28 来源:电子产品世界 点击:

摘要:嵌入式网络客户端需要移植性高、占用资源小的协议栈,设计了基于轻量级协议栈LWIP的网络客户端。采用STM32处理器作为主控芯片,通过以太网控制器EN28J60和RJ45接口连接互联网,移植了操作系统uC/OS-II和轻量级协议栈LWIP,最后对客户端与主机进行联机测试。结果表明:通过主机ping 32字节的数据,4个包所用的时间最长为5ms,最短为3ms,而TTL值均为255;数据收发正确,错误率为0%。说明轻量级协议栈LWIP不仅占用资源小,而且满足嵌入式系统应用的可靠性要求。

引言

嵌入式技术的兴起使得传统的基于PC机的互联网技术优势不再,嵌入式网络客户端与服务端技术成为热点,而该技术需要移植性高、占用资源小的协议栈,轻量级TCP/IP协议栈LWIP (light weight Internet protocol)比较适合嵌入式设备中存储容量有限的情况,而且能实现TCP/IP协议栈的基木功能,不影响设备的网络互联与传输服务[1]。轻量级网络协议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 轻量级

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top