基于μC/OS-Ⅱ和LwIP嵌入式设备以太网通信研究与实现
2018-01-09刘培刚杜靖中
刘培刚,杜靖中
(1.中国民用航空局第二研究所 四川 成都 610041;2.北京中企建发监理咨询有限公司 北京 101300)
基于μC/OS-Ⅱ和LwIP嵌入式设备以太网通信研究与实现
刘培刚1,杜靖中2
(1.中国民用航空局第二研究所 四川 成都 610041;2.北京中企建发监理咨询有限公司 北京 101300)
文中介绍一种基于高性能、低成本ARM处理器--STM32的嵌入式设备以太网通信技术的系统设计,系统充分利用μC/OS-II实时操作系统和LwIP轻量型网络协议栈的特点,通过以太网控制器DP83848和RJ45接口连接网络,实现上位机和客户端的双向数据传输。测试结果表明,基于μC/OS-II和LwIP的嵌入式设备联网系统设计是正确和可靠的。
LwIP;μC/OS-II;STM32;DP83848;以太网通信
随着工业现场控制智能化的发展,嵌入式设备迫切需要接入局域网甚至Internet[1],但完整的TCP/IP协议栈代码量庞大,移植于资源有限的嵌入式设备上并不合适[2]。LwIP(Light Weight IP)是瑞典计算机科学院Adam Dunkels等开发的一个小型开源的TCP/IP协议栈[3]。LwIP是轻量级IP协议,有无操作系统的支持都可以运行,实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。μC/OS-Ⅱ是一种基于优先级的抢占式多任务实时操作系统,包含了任务管理和调度、任务间同步与通信、中断时钟管理以及内存管理等功能,多年的实际应用验证了其稳定性和可靠性[4]。本文基于LwIP和μC/OS-Ⅱ,研究并实现了嵌入式设备的以太网通信功能。
1 μC/OS-Ⅱ和LwIP简介
1.1 μC/OS-Ⅱ操作系统
嵌入式实时操作系统μC/OS-II是一个可裁减的实时多任务抢占式内核,具有高度的可移植性,特别适合应用于小型嵌入式系统中。其性能可以和很多商业操作系统相媲美,是一款典型的实时操作系统,应用在许多领域当中,例如消费类电子、工业控制等。
μC/OS-II主要分为5个部分,分别为核心处理部分、时间处理部分、任务调度部分、任务间通信部分和操作系统移植部分。1)核心处理部分是该操作系统最重要的部分,主要包括任务控制块初始化、内存初始化、事件初始化、任务调度初始化和邮箱队列初始化等,操作系统所需的最基本的工作都在这一部分完成;2)时间处理部分为操作系统提供心跳,是操作系统得以运行的最基本保障,μC/OS-II的最小时钟单位是time tick(时钟节拍),具体大小因不同硬件而异,一般与时间相关的操作都是在这里完成的;3)任务调度部分是操作系统的精华所在,主要完成与任务相关的一些操作,比如任务的创建,任务的删除等操作;4)任务间通信部分用于任务间的相互通信和对临界资源的访问,主要包括信号量操作、邮箱操作、消息队列操作和事件标志等;5)CPU移植部分主要是在指定的CPU上完成操作系统所需的接口,因μC/OS-II是一个通用性的操作系统,所以不可能实现和具体硬件相关的操作,只能预留出接口让移植者来完成,这部分代码需要汇编和C语言共同完成,主要包括任务级和中断级的任务调度,以及时钟中断的处理,为操作系统提供最基本的时间基准[5-6],而与微处理相关的汇编语言代码只有一小部分而且全部集中在 OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C 3个文件中。
1.2 LwIP协议
LwIP协议与传统的TCP/IP协议的设计方式是一样的,也是以分层的协议设计方式来设计的。LwIP协议为嵌入式系统开发提供了一个即灵活又松散的轻量级嵌入式网络协议[7]。协议的每一层当中,每个子协议也分别作为一个单独的模块来实现。虽然这些协议都是以独立的形式来实现,但是它们不是按照传统的协议那样来严格进行划分。换而言之,应用层的应用协议和协议底层之间没有严格的分开来,应用层协议对底层协议所使用的缓冲机制非常清楚。应用层协议与底层协议可以通过共享内存的方式,来实现整个通讯的过程。简单的来说就是各个协议层之间,可以使用相同的内存区间。例如,应用层可以直接对底层缓冲区直接操作,从而避免了过多的数据复制操作。这就是专为嵌入式开发的LwIP在设计的过程当中与传统TCP/IP最不一样的地方。
尽管LwIP是专为嵌入式系统开发的精简版、轻量级的网络协议,但仍然功能较全。除了支持传统TCP/IP协议的基本功能外(IP/ICMP/UDP/TCP),还支持包括其他一些机制,操作系统模拟层、缓冲与内存管理子系统、网络接口、Internet校验和计算及API接口等,这样很大程度上便于嵌入式系统的开发。
2 方案设计
2.1 芯片选择介绍
该系统主要硬件电路由处理器和网络通信模块两部分组成。
处理器选用意法半导体公司生产的基于Cortex-M3内核的STM32F107VCT6,该单片机是一款具有高性能、低成本、低功耗的32位处理器,工作频率为72 MHz,内置256kB的Flash和64kB的SRAM。
芯片内部集成了介质访问控制器(MAC),只需外接一个物理层PHY芯片就可以实现一个完整的以太网收发器[8-9]。内部MAC与外部的PHY通过介质独立接口(MII)或是精简介质独立接口(RMII)传输以太网数据包。
以太网控制芯片采用美国国家半导体(NS)公司生产的DP83848,该芯片是一款10/100 Mbit/s单路物理层以太网收发器器件,支持10/100 M的以太网通信,同时也支持MII和RMII接口模式,集成度高,具有全功能、低功耗等性能。
DP83848传输线接口是一个差分线路,网口插座采用内置网络变压器、状态显示灯和电阻网络的RJ45插座HR911105A,具有信号耦合、电气隔离、阻抗匹配、抑制干扰等优点。
2.2 通信模块设计
在本设计中直接采用精简介质独立接口(RMII)接入方式,相比介质独立接口(MII)的方式可以减少一半的接入信号线数量,同时支持平行交叉网线自适应。内部MAC接收到来自PHY传递的数据包并将其通过FIFO传递给直接内存访问(DMA),最终由DMA将以太网数据包直接传递给总线,同理,通过总线传递到DMA的数据包可以由PHY芯片DP83848传递到HR911105A。图1为通信设计结构框图,图2为PHY芯片硬件设计原理图。
图1 通信模块设计框图
2.3 μC/OS-Ⅱ的移植
μC/OS-II中的源代码在STM32F107VCT6的移植过程中,主要分为不需要修改和需要修改两部分。不需要修改的文件只需添加到工程目录中即可,在这里重点介绍需要修改部分。需要修改源代码的文件为OS_CPU.C、COS_CPU.H 及 OS_CPU_A.ASM[10]。
OS_CPU.C中要修改的函数是OSTaskStkInit,其他的9个函数不需要包含任何代码,但是必须声明。OSTaskStkInit的作用是把任务堆栈初始化。堆栈中的LR和PC需初始化为任务的入口地址值,便于任务切换时跳转到正确执行语句的地方。
OS_CPU.H头文件中需要修改的内容有两部分:与处理器相关的少量代码部分和与编译器相关的数据类型重定义部分。其中与处理器相关部分代码包括任务切换宏定义、处理器堆栈增长方向及临界区访问处理。
OS_CPU_A.ASM汇编文件中有4个函数需要修改:分别为OSSstartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。OSSstartHighRdy函数只在操作系统开始调度任务前执行一次,目的是启动多任务调度。OSCtxSW是任务切换函数,在任务执行过程中,μC/OS-Ⅱ内核会启动OSCtxSW进行任务切换,确保进入就绪态的任务始终是当前任务优先级最高的任务。汇编函数OSIntCtxSW是中断级任务切换函数,若在任务执行时有中断发生,且中断服务程序所执行的任务比正在运行的任务的优先级更高时,这时候中断服务程序所执行的任务就会进入就绪态,在中断返回之前,μC/OS-Ⅱ内核就会调用函数OSIntCtxSw。系统时钟节拍的中断服务函数是OSTickISR。处理器STM32F107VCT6中有一个专门用来定义系统时钟节拍定时器SysTick。
图2 DP83848硬件设计原理图
2.4 LwIP的移植
2.4.1 CPU或编译器相关头文件编写
在移植LwIP之前需要将CPU或编译器相关的头文件添加到工程中,并修改相应代码。
cc.h:定义常用数据类型、同步机制、与编译器相关的LwIP结构体封装宏、与平台相关的调试输出。为了增加协议栈可移植性,LwIP避免使用int、long等数据类型,而是使用在cc.h文件下自主定义的数据类型,包括 u8_t,s8_t,u16_t,s16_t,u32_t,s32_t,em_ptr_t,ys_prot_t等,这样一方面增加了代码的可读性,同时消除处理器的字长差异引起的协议栈移植问题[11]。
perf.h:定义性能测量使用的宏。在pbuf_free(),tcp_input(),udp_input(),ip_forward()中使用到,用户可以根据实际需要定义需要测试的对象和数据记录。
cpu.h:定义字节排放顺序,#define BYTE_ORDER LITTLE_ENDIAN为小端模式,即将高位数据保存在高地址中。
2.4.2 操作系统模拟层的移植
操作系统模拟层存在的目的主要是为了方便LwIP的移植,它在底层操作系统和LwIP之间提供了一个接口。这样,我们在移植LwIP到一个新的目标系统时,只需修改这个接口即可[12-13]。
由于μC/OS-Ⅱ提供了创建任务函数、临界保护函数以及丰富的信号量和邮箱操作函数,进行一定的修改,便可实现LwIP操作系统模拟层的函数。与操作系统相关的结构和函数实现包含在sys_arch.c和sys_arch.h中。
1)定义操作系统平台需要的数据类型:sys_sem_t,sys_mbox_t,sys_thread_t,sys_prot_t。
2)信号量操作函数的实现。sys_sem_new():建立并返回一个新的信号量;sys_sem_free():释放信号量;sys_sem_signal( ):发送信号量;sys_arch_sem_wait():等待由参数sem指定的信号并阻塞线程。
3)邮箱操作函数的实现。邮箱一次接收多条消息更高效,邮箱中的消息是指针。本文移植中邮箱的实现机制为:系统同时建立多个邮箱,通过一个单向链表链接在一起。每个邮箱一次可以接收多条消息,接收消息的最大数量由消息数组的大小决定。需要实现的函数:sys_mbox_new();sys_mbox_free( );sys_mbox_post( );sys_arch_mbox_fetch( )。
4)创建新线程函数的实现。void sys_thread_new(void(*thread)(void*arg),void*arg)。
5)系统超时函数的实现。struct sys_timeouts*sys_arch_timeouts(void)。
2.4.3 网络接口初始化设置
在LwIP中利用struct netif结构实现对不同网络接口的操作,在stm32f107_eth_bsp.c文件中编辑网络设备驱动程序,并主要实现网卡初始化、接收和发送网络数据以及网络中断处理函数这几部分功能。
1)建立硬件配置文件stm32f107_eth_bsp.c
该文件主要实现GPIO引脚初始化,配置和使能全局中断,使能以太网时钟等。
2)建立网络连接配置文件netconf.c
netconf.c文件主要负责搭建底层设备与LwIP之间的接口。一方面要完成LwIP内存区初始化以及MAC地址等的设置,另一方面要实现网络驱动与LwIP的对接,告诉LwIP如何接收来自底层网络的数据和如何将数据信息发送出去[14]。
3)ethernetif_init()初始化底层接口
该函数一方面负责完成对ethernetif结构体的初始化,该结构体拥有响应ARP查询的核心数据,是对网络底层硬件设备的描述[15-16]。另一方面利用输出netif类型参数实现向LwIP.注册发送函数以及链路层发送函数,最后调用low_level_init(netif)实现对硬件设备的初始化,并建立稳定的接收线程。
3 测试验证
以PC机作为服务器,设备作为客户端,服务器IP为192.168.12.6,端口:8087,客户端IP为192.168.12.197,在PC机上使用ping命令测试网络是否连通,从图3可以看出,通信状况良好,主机发送的32bit的数据均成功返回,耗时均小于1ms,整个过程的数据收发正确,丢包率为0%。采用网络调试助手验证数据收发功能,如图4和5所示均能正常收发。
图3 ping通信结果
图4 网络数据接收
图5 网络数据发送
4 结束语
文中基于μC/OS-Ⅱ操作系统和LwIP协议栈,采用CPU芯片 STM32F107VCT6,PHY芯片 DP83848,实现了嵌入式设备的以太网通信,该方案结构简单、性能可靠、经过实际测试和验证,应用效果很好,为嵌入式设备接入以太网提供了很好的解决方案,具有较高的推广价值。
[1]张洁.Lwip协议栈在嵌入式Linux下的移植与实现[J].微计算机信息,2011,28(4):94-96.
[2]杨俊.基于μCOS-II和LwIP的嵌入式Web服务器实现[J].电气自动化,2011,33(3):62-64.
[3]Shang Junyan,Ding Huafeng.Application of lightweight protocol stack LwIP on embedded Ethernet[C]//International Conference on Electrical and Control Engineering(ICECE 2011),Yichang,China,2011.
[4]刘涛.μC/OS-II任务调度算法的改进与实现[D].沈阳:沈阳工业大学,2013.
[5]周超.基于Cortex-M3的以太网串口服务器的设计与实现[D].武汉:武汉理工大学,2012.
[6]任哲,房红征,曹靖.嵌入式实时操作系统μC/OSII原理及应用[M].第3版.北京:北京航空航天大学出版社,2014.
[7]金仲乾,苗克坚,王毅航.基于μC/OS-II的LwIP协议栈的移植和改进[J].科学技术与工程,2013(1):517-521.
[8]于春雪.基于STM32F107的高速以太网接口设计与应用[J].电声技术2011,35(9):63-67.
[9]刘火良,杨森.STM32库开发实例指南[M].北京:机械工业出版社,2013.
[10]刘波文,孙岩.嵌入式实时操作系统μC/OS-II经典实例—基于STM32处理器[M].第2版.北京:北京航空航天大学出版社,2014.
[11]蔡雄飞.嵌入式TCP/IP协议LwIP的内存管理机制研究[J].杭州电子科技大学学报,2012(8):118-121.
[12]王祖云,杨思国.嵌入式LwIP协议栈的移植与测试研究[J].计算机与数字工程,2014(2):272-318.
[13]焦海波.μC/OS-II平台下的LwIP移植笔记[EB/OL].http://bbs.elecfans.com.
[14]陆旭.基于μC/OS-II和LwIP的嵌入式设备监控平台研究[D].重庆:重庆大学,2013.
[15]胡亦万.基于Cortex-M3的LwIP移植以及嵌入式WEB的应用研究[D].南昌:南昌大学,2013.
[16]Xiong Shengjiang,Dai Wenwen,Yan Wei.Design and Implementation of LWIP Ethernet Based on SOPC AXI Bus[C]//Proceedings of 2012 International Conference on Electronic Information and Electrical Engineering,2012,16(1):35-40.
Research and implementation of embedded equipment ethernet communication based on μC/OS-Ⅱand LwIP
LIU Pei-gang1,DU Jing-zhong2
(1.The Second Research Institute of CAAC,Chengdu 610041,China ;2.Beijing Zhongqi Construction Supervision Consulting Co.Ltd.,Beijing 101300,China)
This paper introduces a kind of embedded devices networking technology of system design based on high-performance and low-cost ARM processor STM32.The system makes full use of the realtime operating system uC/OS-II and light weight internet protocol stack.Through the ethernet controller DP83848 and RJ45 interface to connect to the internet.Realize the PC and client double data transmission.Test results show that the system design of embedded devices connected to network based on the uC/OS-II and light weight internet protocol is correct and reliable.
LwIP; μC/OS-II; STM32; DP83848; ethernet communication
TN919.6
A
1674-6236(2017)16-0129-05
2016-07-15稿件编号:201607112
刘培刚(1985—),男,重庆人,硕士,工程师。研究方向:电子技术应用开发。