系统远程监测和控制或许是微控制器应用最重要的功能之一。想象一下:一个巨大的高尔夫球场的草坪洒水系统,最好能够向主机自动报告故障状况。这样的系统几乎无需人工监测其是否正常工作。 RS-232 串口或红外等多种通信方式可用来实现系统远程器件的控制和监测。然而,所有这些方法都受限于具体的接口标准,其中包括:是否与传输媒介和协议兼容、距离限制等。以太网网络协议(IP) 网络协议提供了一个应对上述挑战的解决方案,所有现代操作系统都带有 IP 栈。而 IP 可在各种传输媒介上运行,到目前为止,以太网的应用最普遍。此外,以太网得益于交换和路由网络拓扑结构,因此不受距离限制。借助于先进的 MAC/PHY 集成电路与板载缓冲器,可以用微控制器和以太网 IP 实现控制,并且几乎可以从所有远程系统采集数据。本文演示了如何利用免费的 uIP 堆栈和 SPI 至以太网转换 IC 实现 MAXQ2000 微控制器联网。 uIP 介绍 uIP (读作“micro IP”)提供了一个最小规模的 IP 堆栈,其中包括 TCP、UDP 和 ICMP 协议。uIP 由 Adam Dunkels 开发,采用 BSD 方式授权。完整的源代码可从 https://github.com/adamdunkels/uip 下载。当然,对于大多数应用,没有必要完全运行 TCP/IP,过于浪费。uIP 具有一整套功能,符合全功能主机的最低需求,并且可以避免其它简单 IP 堆栈存在的“特殊情况”。编译环境 Rowley CrossWorks 1.1 build 1 C 编译器用于编译、汇编和链接项目。为方便调试,所有代码优化功能均被禁用。最终代码仅占用 MAXQ2000 程序闪存存储器的一小部分。 MAXQ2000 有 2kB 的数据存储器。使用这种数据存储器时必须谨慎,因为缓冲器必须用来处理 IP 数据包的内容。为了最大限度地利用数据存储器,所有常数都存储在代码空间内,并根据需要复制到一个固定大小的 RMA 缓存区。 uIP 堆栈的使用 uIP 堆栈可以看成一个事件循环,超时基于结构时钟设定。在主循环中,MAC/PHY 接收到的数据包由 uip_arp_ipin()和 uip_input()处理。这些调用会产生一个输出数据包,必须由 MAC/PHY 驱动程序传输。然后检查计时器,清理已关闭连接及一段时间未出现的 ARP 表项,并调用应用程序回调函数以进行重发。主要事件循环为样板代码,大多数应用中无需改变。注意:uIP 实现了非常小的 TCP 窗口尺寸,这一点非常重要,只能有一个重要的(un-ACKed)数据包等候处理,有时可能需要重发。实际应用处理由函数 UIP_APPCALL 完成。调用时,应用程序回调功能会检查几个功能并返回 uIP 当前状态。其中最重要的状态是:uip_connected()、uip_closed()、uip_aborted()、uip_timedout()、uip_newdata()和 and uip_rexmit()。前四个函数管理输入连接的打开和关闭;后两个函数管理数据的输入和输出。当新数据到达套接字等待应用程序处理时,uip_newdata()将返回一个非零的结果。然后应用程序进行数据处理,这些数据保存在 uip_appdata 指向的缓冲区中,也可以返回响应。所有数据,包括以太网链路层和 IP 头储存在 uip_appdata。如果网络丢掉返回至 peer 的数据的任何部分,应用将通过计时器超时调用应用程序回调功能并且 uip_rexmit()返回一个非零的结果。在这个点上 uIP 与其他 IP 堆栈不同。通常情况下,TCP 数据包的转发由 IP 协议栈处理。当 uip_rexmit()标记出现时 uIP 需要应用程序转发丢失的数据,可以节省存储空间。转发可以通过重新生成数据来实现,或将先前产生的数据保存在缓冲区以供转发。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !