基于SX52的嵌入式Web服务器的快速实现
摘要:介绍了如何利用现有软件虚拟模拟高效构筑可现场控制的嵌入式Web服务器,一些方法也可用于其他资源有限的小型嵌入式网络设备中。
关键词:单片机 嵌入式系统 Internet Web服务器
随着互联网的日益普及,信息共享的程度不断提高,网络仪表及网络控制设备的流行逐渐成为趋势。如何通过互联网共享以单片机应用系统为中心的小型嵌入式设备的信息,成为当今电子界的热门话题。传统的互联网应用以PC为中心。如今,互联网应用正在转到以嵌入式设备为中心。用单片机实现嵌入式互联网方案的技术难点是:如何利用单片机本身有限的资源对信息进行TCP/IP协议处理,使之变成可以在互联网上传输的IP数据包。目前解决这个问题有两种方案:一种是PC网关+专用网,缺点是要增加布线和第三方协议转换软件;另一种是32位MCU+RTOS,弊端是开发难,成本极高。而用软件方法实现网络协议比采用集成网络协议的芯片,具有节省空间、降低成本的优点,更重要的是可以随意配置甚至修改各种协议,且能通过软件升级方式跟随未来的发展。八位单片机目前仍占有很大的市场份额,而通过美国Ubicom公司的SX52微控器进行网络控制更具其独特优势,主要体现在:(1)速度快,在100MHz频率下能达到100MIPS;(2)现成的协议模块供使用,即使对不熟悉网络协议的开发人员也能简单套用。虽然其它八位单片机也能用软件实现精简的TCP/IP协议,如PICl6C76等,但上面所说两大优点是采用SX52MCU的充分理由。套用成熟的现有程序是最具效率的开发办法,这也是避免目前国内普遍存在的低水平开发的有效途径。虽然目前还没有单独的TCP/IP软件虚拟模块提供,但在演示板程序的基础上,可以采用其成功的网络协议模块和一些适用于小型嵌入系统的做法构筑现场控制Web服务器。
1 SX52控制器简介
SX52 MCU与PIC单片机有很多地方相似,它也采用RISC指令系统,带可擦写上万次的片上Flash程序存储器,具在系统编程等。SX52的流水线指令操作可1个时钟周期执行一条指令。没有中断嵌套使中断响应时间固定为3个时钟周期,适用于一些要求强实时性的系统。5个可驱动30mA电流的I/O口可自由设置为TI'L或CMOS输入电子,262×8bit的SRAM数据空间,4096×12bit的EE/Flash程序空间。内部集成有模拟比较器、定时器、捕捉/PWM比较器、欠压检测、看门狗等多种功能部件。具有三个特殊器件配置寄存器,其长度分别为12位,(FUSE、FUSEX、DEVICE),硬件配置灵活多样,加密性能好,能有效地防止产品被盗版或仿制的可能性。已提供的软件虚拟模块有UART、A/D、DTMF、PWM、FSK、IRDA、VC等众多常用功能块。应用微控器用软件方法替代硬件功能是一大特色,可以避免一些常用功能的重复开发。
javascript:window.open(this.src);" style="cursor:pointer;"/>
2 联网的实现
对于资源紧缺的小型嵌入系统,一般都要对TCP/IP协议族做一些精简处理。Wing Poon等提供的演示板程序集合了如下模块:ARP、DHCP、ICMP的echo响应,精简的TCP/IP、HTYP、SMTP等;还可以看到应用了I2C以及∑-△A/D的软件虚拟模块。由于程序空间的限制,当实现DHCP时,只能用SMTP。底层采用8019AS网络接口芯片。网页通过12C存储于24C256中,中断程序可用于A/D虚拟模块的计数及TCP/IP协议族的各个定时器。
系统设计主程序流程如图1。当IP包头有选项或存在分片时,此包被简单丢弃而不处理。TCP能同时打开两个连接,连接1用于SMTP(套接字用Bank 3,TCBI_BANK),连接2用于HTTP(套接字用Bank 4,TCB2_BANK)。TCP不使用滑动窗口的流量控制,发送时每发一个分组就停下来等待确认。程序中发送的数据长度放在变量Tcp2Un-AckMSB、Tcp2UnAckLSB中。在接收模块TcpProcPktln中只有接收到Ack包后才复位这两个变量;而发送模块Tcp·Transmit中只有这两个变量为零才允许发送下一段数据,否则检查Tcp2TimeMSB是否超时;如是则重发。TCP接收模块TcpProcPktln检查端口号及32序列号是否与套接字内的相符,如不符则可能是收到重发的包,TCP简单地发Ack的空包并丢弃本包;否则处理本包数据同时清除上次发送数据长度变量Tcp2UnAckMSB、Tcp2UnAckLSB,以便在TcpTransmit中能发送下一段数据。
子模块TcpAppTxBytes、TcpAppRxData是TCP处理发送及接收数据的模块。用户如不变更原TCP/IP的精简设计,只要修改这两个模块就能实现自己特定的应用功能。
16位校验和Checksum的计算对于很少或没有数据缓冲的系统来说并不容易,一般有两种方法处理。一是在TCP头的检验和域放任意一个16位数,数据发送的同时计算Checksum,然后在数据最后附加2个字节以保证之前任意取值的正确。这种方法的缺点是要让接收的应用程序忽略最后2个字节的数据,可能导致许多程序的运行异常。二是先对产生的数据计算Checksum,但不发送,然后再产生同样的数据加上正确的校验和发送。显然要求系统产生重复的数据有时是不现实的,利用网卡芯片8019的缓冲可以解决这一问题,将数据写入8019的同时计算Checksum,最后将Checksum写入8019后调用NicSendTxFrame才真正发送数据。javascript:window.open(this.src);" style="cursor:pointer;"/>
3 Web服务器实现
TCP在Web服务器下采用的状态转移见图2。
(1)服务器在closed状态下