引言
S1C33209是EPSON公司推出的RISC结构的32位高性能CMOS微处理器,具有高速、低功耗、低电压操作、精简指令集等特点,提供乘与累加功能,既可用于办公设备,也特别适用于需要高级数据处理的便携设备,可以进行高速运算、灵活的I/O口控制和高效的数据操作。S1C33209具有8KB的内部RAM,其运算速率可达60MHz,加上优化的多数为单时钟周期的指令集,使S1C33209吞吐量大为提高。S1C33209比常规MCU有更快的运算速度及可靠的性能、可重复编程的结构,使得精简的TCP/IP能够在其中可靠运行。
1 硬件平台结构及设计
信息家电远程访问时,通信数据量不大,10M以太网的通信速率即可满足要求;其次信息家电对实时性的要求不高,可定位在秒级。
在这种情况下,构造了家电网络硬件平台服务器S1C-WebServer,其结构如图1所示。S1C33-WebServer主要由三部分组成,即S1C33209微处理器、RTL8019AS全双工以太网控制器(RealTek公司出品,100脚的TQFP封装,最大速率10Mbps,自带16KB的SRAM,工作在Ethernet II和IEEE802.3、10Base5、10Base2、10BasetT下,全双工,支持8位与16位数据总线,与NE2000兼容)、可擦写Flash(采用Intel的E28F320,容量为4MB)。考虑到Flash的擦写在程序调试中不太方便,所以为S1C33209外围扩展512KB的SDRAM。在S1C33209中,运行用户程序和S1C33-Stack。在Flash中,存放S1C-WebServer的各种Web资源信息,综可处理Web页面、图像文件等,与PC机上WebServer中的硬盘可以存储大量的不同页面。Flash的容量决定了WebServer的资源文件的大小。RTL9019AS是Ethernet控制器,负责S1C33209与Ethernet的数据传递。在信息家电已具备RS232或相关标准接口的条件下,使用家庭自动化总线HAB(Home AutomaTIon Bus)作为S1C33-WebServer与家庭网络协议SHNP(Simple Home Networks Protocol)。家电通过RS232接口与S1C33-WebServer连接,经由EEthernet接入Internet。
经过分析,S1C33209与RTL8019AS读写时序是兼容的,而且MCU的读写时延比RTL8019AS小得多。MCU与RTL8019AS的连接如图2所示。RTL8019AS的工作电压为5V,而S1C33209的工作电压为3.3V,所以RTL8019AS的数据线输出需要电平的转换。选用2个8位(采用16位数据总线)的具有双向数据传输功能的74HC245来完成,由于S1C33209的输出电平符合RTL8019AS输入电平的要求,所以地址线可以直接相连,而不需电平转换,RTL8019AD中断信号(INT0)为高电平有效,在S1C33209中选用端口中断输入的K60端口与之相连。由于S1C33209的中断有效方式(高、低电平或脉冲)可以根据对寄存器的设置调节),所以不用对INT0作反向或电平转换。
2 精简TCP/IP协议栈的实现
构建的S1C33-Stack运行在以S1C33209嵌入式CPU为基础的硬件平台上,是一组可配置的多种Internet协议的组成。这些协议按照分层协议栈的方式组织,包括应用层的HTTP、DHCP、SMTP,传输层的TCP、UDP,网络层的IP/ICMP、ARP,通过链路层和物理层(如Ethernet)进行数据的交互。S1C33-Stack的结构模型如图3所示。S1C33-Stack利用S1C33的高速处理能力处理TCP/IP数据包,避免了在有限容量的RAM中缓存大量数据,使得控制器可以处理比内部RAM总线更多的数据包。利用嵌入的S1C33-Stack,Webserver能通过Hypertext Transfer Protocol(HTTP)与任何浏览器通信,能够提供各种类型的资源,如HTML、图片文件等。这些资源可以使用一种特殊的文件系统URI,被存放在容量为4MB的Flash中。这种文件系统可包含任意多的目录,对URL的长度也没有限制。
考虑到嵌入式系统的可用资源有限,在此采用经过裁减的TCP/IP协议栈—uIP。uIP协议主要包括TCP/IP协议组中的四个基本的协议:ARP、IP、ICMP、TCP。链路层协议,如PPP,则作为设备驱动在uIP底层实现。应用层协议,如HTTP、FTP、SMTP则作为应用程序在uIP上层实现。
(1)地址解析协议ARP
该协议将IP地址映射成以太网MAC地址。在uIP中,ARP的执行依靠维持一张表来完成IP地址和MAC的地址的映射。当有一个IP数据包要发送到以太网上时,从ARP表中查询相应的MAC地址。如果在ARP表中找不到IP地址则送出相应的ARP请求。当目的主机收到ARP请求报文后,发送ARP REPLY报文将请求的MAC地址送出。当收到ARP REPLY后,ARP表被更新。每隔10s,ARP表就被新新一次,旧的ARP表项将被删除。每个ARP表项的生存周期是20min。
(2)网间协议IP
在uIP中,IP层的代码有两个功能:验证到来的IP报文报头的正确性,并且对TCP和ICMP报文实行分流。因为不考虑IP的分片和重组,uIP中IP层的代码非常的精简。
(3)网间报文控制协议ICMP
在uIP中,仅有一种类型的ICMP信息被实现:ICMP ECHO主要用于应用程序ping,检查网络是否连通。在uIP中,ICMP ECHO通常以一种很简单的方式进行处理;将ICMP类型由“ECHO”改为“REPLY”,同时调整ICMP校验,交换发送方和接收方的IP地址。
(4)传送控制协议TCP
为了减少对内存的使用,在uIP中,TCP并不使用滑动窗口来接收和发送数据,到达的TCP报文并不进行缓冲而是立刻交给应用程序处理。但是应用程序本身可以对要发送的程序本身可以对要发送的数据进行缓冲,因为每次连接中通常有若干的TCP报文要发送。uIP网络通信模块结构如图4所示。
网络通信需要要底层RTL8019AS驱动程序的支持,参考RTL8019AS与S1C33209的资料说明文档,编写出针对此系统的RTL8019AS驱动。
uIP并不缓存到达的数据包,当网络上有数据包(在这里专指出太帧)到达网卡时,网卡驱动程序将暂存在网卡缓存中的数据包,一次一个的以DMA形式传送到目标板上的RAM中。这时将会有一段代码将到达目标板RAM中的数据包复制到全局数组uip_buf[]中,uIP协议栈程序随后对uip_buf[]中的数据进行操作。
当上层应用程序或协议栈程序产生了向网络上发送的数据包时,也将数据包放入uip_buf[]。然后调用网卡驱动程序,将uip_buf[]中的数据读到网卡的缓存中,随后发送到网络中。
在此要说明一下协议栈与网卡驱动程序、应用程序之间的同步机制问题。在系统初始化的时候,通过操作系统提供的系统调用vcre_tsk()创建三个任务:任务一(task1),uIP协议栈;任务二(task2),家电监控程序;任务三(idle_task),空闲任务。而网卡驱动程序则作为硬件中断,由“检测到网络上传过来数据包”事件激发。
整个协议栈程序流程图如图5所示。
任务一的优先级最高,任务二次之,任务三的优先级最低。当系统开始运行时,任务一首先进入RUN状态,在任务一中加入系统调用wai_flg(),由于没有网络请求,任务一随后进入WAIT状态。此时任务二进入RUN状态。当网络上有数据包到达,网卡驱动程序作为硬件中断开始执行。在退出中断前,通过系统调用set_flg(),将任务一期望的标志位置位。当中断返回后,由于任务一的等待条件已经满足,任务一的优先级又高于任务二,因此任务一进入RUN状态,即uIP协议开始处理数据。如果网络上一直有数据包到达,则任务一和中断程序不断的切换。当网络任务完成,返回到任务二的断点处继续向下执行。
由于uIP不缓存网络数据,因此在任务一执行的过程中,即uip_buf[]正在被操作时,将关闭所有中断。这样可以避免数据包被破坏,缺点是实时性差了一些,但是满足本系统要求。
3 操作系统
本系统使用的操作系统是由EPSON公司提供的ROS33V31。ROS33是为S1C33系列MCU提供的一种嵌入式实时操作系统,符合uITRON 3.0标准。使用ROS33可以迅速、有效地开发针对打印机、PDA以及各类控制设备的嵌入式应用程序。
ROS33具有以下特点:
*支持uITRON 3.0标准——符合该标准的S级*最大任务数为255,采用优先级调度机制,支持9种不同的优先级,提供信号灯、邮箱、消息缓冲等多种通信机制:
*内核优先并紧凑——最小可为1.7K;
*响应快——最快调度响应时间为7.8μS(CPU主频为33MHz,下同),最大中断屏蔽时间为4.3μs ;
*高级语言支持——除汇编语言外,还支持基于ANSI标准的C语言编程。
注释:μITRON将系统功能分成四级。R级(必要级)只提供包括实时、多任务OS所需的基本系统调用;S级(标准级)提供所有标准的系统调用;E级(扩展级)包括附加的和扩展的系统功能;C级(CPU依赖级)的系统功能依赖于具体的CPU和系统实现方式。
ROS33基本内核按功能划分为6大部分:
*任务管理——负责系统中任务状态的变迁;
*任务相关的同步管理——通过睡眠/唤醒、挂起/解挂等操作,处理相关任务及任务之间的同步关系;
*同步与通信——通过信号灯、事件、邮箱等通信机制,实现独立任务之间的同步与通信;
*系统管理——对系统环境的管理;
*时钟管理——日历时钟、定时器、定时任务等的管理;
*中断管理——开/关中断。
图6给出了ROS33内核的概念模型。
4 Web服务器及上层应用程序框架
WEB服务器所采用的方式称为uip_connect,比通常在设计中所使用的Socket套接字更适合于嵌入式系统下面即是WEB服务器的大体框架。
#include<uip.h>
void http_listen_init(void){
uip_listen(80);
} //http listen初始化
void listen_init(void){
http_listen_init();
}
void applicaTIon(void){
if(uip_connected()) //如果当前的连接状态为connected
switch (uip_conn->lport){
case htons(80):
httpd; //如果80 PORT有数据到达,则调用HTTP处理HTML文件的传送
}
}
首先,服务器与客户机建立连接,再通过侦听端口80,判断是否有客户请求到达,若有则将调用应用程序httpd进行相应处理,否则,继续侦听。Httpd是用于处理HTTP请求的应用程序,具体设计在协议栈uIP中有描述。uip.h是协议uIP的一个头文件。
在应用软件上实现简单WEB服务器功能,其主要由两个模块构成:一是用户登陆模块;二是家电监控模块。用户登陆模块需要解决用户的合法性检查,即接收用户输入的用户名和密码,进行校验,合法则进入家单监控页面,非法则发出警告页面。家电监控模块针对各家电的硬件情况,收集信息家电的状态码,并通过网页形式显示。
在两个模块中,有一部分相似的处理,即对输入的数据进行解析。现在定义数组htmlinputs来存放解析后的信息。对表单输入的数据进行解析后,将其name值和value值分别存放在htmlinput_struct.name和htmlinput_struct.value里,便于以后的处理。变量htmlinputcount存放表单里输入变量的个数。定义如下:
struct htmlinput_struct htmlinputs[100];
int htmlinputcount=0;
除此外,定义函数get_inputs()和translate()对输入的数据进行处理。
Int get_inputs();//将从表单输入的数据分别装到对应的name/value数据队中
Void translate(char*sourcestr);//解读编码URL字符
具体程序代码在此就不再多述。
整个上层应用程序的流程图如图7所示。
5 小结
以太网作为接口,以S1C33系列微处理器为硬件平台,利用软件化的精简嵌入式TCP/IP,能够实现HTTP服务。当然在系统成熟的条件下,还可以考虑把以太网接口替换为无线网络接口。本文为信息家电网络接入Internet提供了一种无需额外的PC或网关设备的解决方案。这种低成本、高性能的方案,具有可靠、灵活的特点,适用于通信速率不太、允许时延大于1s且需要连接Internet的家庭自动化设备。此外用户还可以根据需要,按照此方法,构造自己的网络服务器,可为普通的电气设备或系统如公共服务设备、家庭医疗保健设备、工业自动化系统等,赋予接入Internet的能力。