首页 > 文章中心 > 正文

RT-Thread 网络通信系统的设计

RT-Thread 网络通信系统的设计

ARMCortex-M3内核可以对4GB空间进行简单和固定的存储器映射,片内512kB的Flash用作存储器异常/中断向量表以及操作系统的镜像,系统复位后从中读取指令执行;64kB的SRAM为程序的运行空间和数据空间,启动代码先将系统镜像复制到SRAM后执行。此外,该CPU内置灵活的静态存储控制器(FlexibleStaticMemoryController),可以方便外扩总线型的SRAM,NorFlash存储器。由于处理器内部没有集成MAC电路,网络功能需通过网络接口芯片来实现物理层通信。

DM9000A由3.3V供电,支持IEEE的802.3网络传输协议的10/100M以太网物理层单芯片收发器,片内集成滤波器、16kB的FIFO的SRAM缓存,自带可触发中断的MII管理接口并支持中继模式和节点模式、全双工和半双工模式的转换[2]。通过RJ45连接到Internet,综合LwIP程序包、通信协议(TCP/UDP)和网络编程函数,即可实现网络数据传输。

底层网络驱动DM9000A的网络设备驱动程序分为设备的初始化和数据的发送接收两部分。DM9000A的初始化过程是在CPU配置内部网络控制寄存器(NCR)、中断寄存器(ISR)等寄存器后进行的,具体过程包括软件复位、设置网络工作模式、设置PHY、选择模式、使能唤醒时间、使能RX/TX中断,使能数据接收功能等。初始化完成后,DM9000A进入等待数据发送/接收状态,图2是其数据传输流程图。当处理器发送数据时,先将TCP或IP数据打包成以太网数据帧,然后通过16bit总线写入到DM9000A的数据缓存区,再将数据长度等信息写到DM9000A的相应寄存器内后使能发送;当DM9000A接收到外部网络传来的网络数据时,将数据帧缓存在内部SRAM中,由CPU通过标志位对接收到的数据进行处理[3]。

RT-Thread操作系统

RT-Thread是采用面向对象风格设计、C语言实现的开放源代码的RTOS,其突出特点是小型、实用和可裁剪。其核心能够小到仅占用2.5kB的ROM和1kB的RAM空间;系统线程调度核心是完全bitmap方式,可使计算时间完全固定;配置文件rtconfig.h包含多种选项,能够对Kernel细节进行精细调整,并可对文件系统、网络协议栈、图形用户界面及FinshShell等组件进行可选配置。

RT-Thread系统移植RT-ThreadKernel代码目前支持多数主流CPU芯片,其bsp(板级支持包)含有所支持的各平台的移植代码,并会包含有两个汇编文件,一个是系统启动初始化文件,一个是线程进行上下文切换的文件,其他的都是C源文件。移植时选好开发平台后仅需修改rtconfig.py和rtconfig.h文件。RT-Thread源码具有非常好的移植性,可以非常容易的移植到其他开发环境下。本系统采用MDK开发环境,修改rtconfig.py文件中CROSS_TOOL=‘keil’和EXEC_PATH=‘D:/Keil’后,并配置rtconfig.h使能LwIP和FinshShell(其他组件可根据需要配置)。

RT-Thread初始化RealViewMDK的用户程序入口是main()函数,main()函数调用rt_thread_startup()函数(RT-Thread多平台下的统一入口点),函数中包含了RT-Thread操作系统的启动流程:包括初始化系统相关的硬件,初始化定时器、调度器等系统组件,初始化系统设备,初始化各个应用线程、并启动调度器。其中用户代码入口位置是rt_application_init(),在这个函数中可以初始化用户应用程序的线程,当打开调度器后,用户线程也将得到执行。

LwIP协议栈

LwIP是一种源代码开放的TCP/IP协议栈的实现,占用的体积大概在几十kB的RAM和40kB的ROM代码左右,因此十分适合于使用到嵌入式设备中。

LwIP协议初始化LwIP由协议的实现模块(IP,ICMP,UDP,TCP)、操作系统模拟层、缓冲与内存管理模块、网络接口函数和API接口函数等相对独立的模块组成。使用LwIP协议栈,需要初始化协议栈,同时协议栈本身会启动一个TCP/IP的线程,和协议相关的处理都会放在这个线程中完成[4]。

LwIPAPILwIPAPI在LwIP的应用中,可以充分发挥其内部结构优势,且不必在协议栈和应用程序之间复制数据,故可以使应用程序巧妙地直接处理内部缓冲区。LwIPAPI主要使用两种数据类型,netbuf和netconn。netbuf是描述网络缓存,对应的函数为netbuf_new()、netbuf_delete()、netbuf_ref()、netbuf_data()等;netconn是描述网络连接,对应的函数为netconn_new()、netconn_delete()、netconn_connect()、net-conn_recv()、netconn_write()等。

BSDSocket网络编程LwIP提供了一个轻型BSDSocketAPI的实现,为大量已有的网络应用程序提供了兼容的接口。LwIP的socket接口实现都在函数名前加有lwip前缀,同时在头文件中把它采用宏定义的方式定义成标准的BSDSocketAPI接口。BSD是UNIX/Linux系统中通用的网络接口,也广泛应用于嵌入式系统和实时操作系统中,不仅能够支持不同的网络类型,而且拥有内部进程之间的通信机制,图3显示了通过BSDSocket网络编程实现的分层结构[5]。

嵌入式网络应用实现

RT-Thread实时操作系统可实现多任务的调度管理,上层应用程序则可通过LwIP协议栈及调用LwIPAPI来实现网络通信及网络任务,再配合操作系统的RTGUI,DFS文件系统及设备驱动等组件来增加系统的实用性及扩展性。

HTTP协议通信过程超文本传输协议(HTTP)是一个实现WWW的应用层协议,是一种请求/响应协议,当基于HTTP的客户端/服务器数据交换有请求产生时,就开始一次HTTP数据通信。其过程如下:浏览器(客户端)首先提取出URL中的主机,然后向DNS发出请求、解析主机名的IP地址(服务器侦听端口一般为80);DNS将解析地址返回给浏览器;浏览器向该地址请求建立TCP连接;客户端发出请求报文,服务器向客户端发送响应报文,并将指定数据发送给客户端;结束后断开连接[6]。

WebServer实现WebServer任务是基于LwIPAPI接口函数来实现应用,图4为其任务流程图。从图中可以看出当用户通过网络连接访问服务器页面时,HTTP协议首先和服务器建立TCP连接,服务器通过进入netconn_accept()函数,并等待其邮箱信息的到来,等待期间线程被挂起。通过两次握手后,客户端就把HTTP请求报文作为第三次握手的第三个报文的数据发送给服务器,服务器收到HTTP请求报文后,就把所请求的页面作为响应报文返回给客户。该WebServe通过建立数据处理函数HTML编写服务器设置界面后,可应用于远程网络控制系统,通过在网页程序中加入<META/>标记,浏览器可以自发周期性的刷新页面,用户在浏览器端可及时收到远程现场传感器采集的数据,并可控制及设置参数来调节和监控远程现场环境,图5为基于HTTP协议实现的嵌入式远程网络监控系统的测试效果[7]。

系统网络通信测试LwIP协议已经实现了大部分的Socket网络连接函数,要实现Socket的基本通信,只需要在此基础上通过调用其Socket网络连接函数即可实现简单的客户机/服务器网络数据通信。为测试本网络通信系统的可靠性和稳定性,在RT-Thread操作系统下增加TCP客户端和UDP服务器网络测试程序线程,其实现过程与WebServer类似,不同之处是基本网络通信过程采用了更为标准化的BSDSocketAPI来实现,数据处理过程也和各测试任务相关。经TCP&UDP测试工具及RT-Thread自带的FinshShell的测试表明,该系统发送数据和接收数据稳定可靠,传输速率可达10Mb/s以上,满足多数嵌入式网络通信设备的要求。

结束语

本文详细介绍了利用STM32单片机,在移植RT-Thread实时操作系统的基础上,实现了几乎完整的TCI/IP协议栈,并且操作系统还采用模块化设计,用户在使用时可根据需要进行裁剪以节约资源。此外通过建立嵌入式网络应用程序检测了其通信性能,表明该系统为构建嵌入式设备的网络通信提供了一种低成本高可靠性的解决方案;结合嵌入式设备友好的人机界面、易于升级和扩展等优点,本通信系统在广播电视播控系统、网络媒体传播技术、智能监控领域中有着广泛的应用前景。

作者:陈希超王健单位:杭州电子科技大学电子信息学院聚光科技(杭州)股份有限公司

文档上传者