导言
嵌入式技能的鼓起使得传统的根据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%。