单片机的TCP/IP的实现与UNIX的不同

发布者:CaptivatingEyes最新更新时间:2015-07-08 来源: 51hei关键字:单片机  TCP  IP  UNIX 手机看文章 扫描二维码
随时随地手机看文章
TCP/IP最先是在UNIX系统里实现的,后来的LINUX、DOS、WINDOWS也实现了TCP/IP,随后TCP/IP协议也被移植到其它嵌入式的处理器上,例如8位的MCS51单片机、AVR单片机,16位的ARM、C166以及32位的MIPS、ARM等芯片上。 TCP/IP协议的最底层IP层,很多定义都是16位或32位的,例如源IP地址(32位)目的IP地址(32位),校验值(16位),特别是较验值,是以16位为单位进行计算的,这样使得能够处理16位、32位运算的CPU,比如80286、80386……,ARM、MIPS、DSP,就有很大的速度上的优势。而8位机MCS51处理则会慢很多。
  由于指令的原因,以及资源上的原因,在UNIX上实现的TCP/IP协议的原代码并不能够直接移植到8位的单片机上。最早期的LINUX1.0版的内核是最小的实现TCP/IP的操作系统,它的程序的大小大概在1兆字节。而现在的红旗LINUX,红帽子LINUX,内核多达几十兆,整个系统要几张光盘来装。早期的LINIX因为小,而被移植到掌上电脑,PDA等产品中。 单片机的程序空间是极为有限的,直接寻址的空间仅64K字节,这跟电脑的存储空间相比要差几个数量级。除了程序空间小之外,可用的内存RAM也是非常小的,最多只能扩64K的RAM,而电脑的RAM至少在1兆以上。单片机的运算速度也极为有限,一般只有2MIPS,而电脑上的处理能力在100MIPS以上。
  有些人提到有没有必要在单片机上实现TCP/IP的问题。因为TCP/IP是一种标准,以太网也成为局域网的标准。在很多情况下运用以太网和TCP/IP,能够简化结构。比如目前较热的智能小区,因为布线的原因,不能为每个家庭布很多线,而以太网的8芯双绞是一定有的。例如宽带上网,是直接通过以太网的,如果你制造的设备,比如安全产品,远程抄表产品,家居智能产品能够走以太网的话,可以利用现成的以太网络。但如果走其它网络,比如RS485、CAN单线、LONWORKS等,那么需要另外布线。布线是复杂的,还涉及到消防安全等。从成本看,用以太网实现联网要比CAN、LONWORKS等更为便宜,集线器、交换机现在都非常便宜,而且将来有三网合一的趋势,电话、电视、计算机三网合一。将来的趋势可能是高速的以太网的天下,电话信号、电视信号、联网都在以太网上跑。尽管目前还未能实现,但是这种趋势是不可避免的。
   有网友提到就算要利用以太网,也没有必要跑TCP/IP。那么为什么要跑TCP/IP呢? TCP/IP是一标准,这个标准使得数据传输不一定是要局域网,而可以在互联网、跨地区跨国界。例如你在某一区域安装了很多监控产品,但数据中心可能不设在那个区域,而设在其他地区。TCP/IP有两种协议TCP和UDP;TCP保证了数据传输的正确性,(如果你的数据只跑以及网层,那么你的数据完整性是要你的编程来保证的,校验的计算。数据包的丢失需要你手工处理,而TCP把这些所有你要处理细节都帮你处理了。UDP可以面向广播的、视频的、音频的等方面的应用。实现TCP/IP的协议的好处是可以统一平台,比如智能小区的产品,如果大家都遵守TCP/IP的协议,那么大家的产品才能兼容,假设一个大型的智能社区,这个社区可能由多家设备供应商进行建设,可能有某些厂商做平台、做软件,一些厂商做硬件。如果大家遵守TCP/IP协议,各自的远程抄表产品,智能防盗产品就有可能兼容,对地产开发商来说,可以选择多个供应商,有利于竞争,也避免某个厂家倒闭造成重大影响。
   题外话说的多了,还是回到本章要谈的内容吧。由于单片机与电脑的差别很大,两者的实现有很大的不同。在电脑里编写TCP/IP程序,你可以不考虑代码大小、代码速度,但在单片机上这些都是你要考虑的问题。 综合来说,单片机实现与UNIX实现TCP/IP有如下区别:   (1)、操作系统。不论是WINDOWS、UNIX、LINUX,它们都有一个多任务操作系统,这使得代码编写简单化,而在单片机上,因为资源的原因而无法使用多任务操作系统,这使得代码结构变为顺序执行+硬件中断的方式,而在电脑里却可以并发地执行。对程序执行结构,单片机要考虑更多。
   (2)、内存分配。WINDOWS或UNIX的内存分配是动态的,根据需要随时分配,随时撤消 。我们阅读一些关于LINUX、UNIX的书,它们都是mbuf的存储结构。mbuf是一个存储链,这个链可以动态地增加和减小。比如在数据包很少的情况下,UNIX分配一个2K字节的缓冲区可能就够用了,但如果数据包很多,就有可能要分配64K甚至更多的缓冲区,可分配的内存要根据CPU的可用内存来调整。 但是在单片机却不能够这样做。一个最大的以太网数据包有1500多个字节,分配一包的缓冲区就要1.5K字节,而一般实现TCP/IP的单片机只外接一块32K字节的RAM。而这32K字节的RAM要被各个协议所用,而不仅仅是存放收到的数据包。一般的做法是分配一个256×6=1536个字节的RAM来存放收到的以太网数据包。收到一包就处理一包。而UNIX却可以收很多包才处理。在单片机里,存放收到的以太网数据包的RAM是固定的,而不是动态分配的。所有UNIX关于内存管理、内存分配、mbuf的结构在单片机里并不适用。这些代码对单片机是无用的。
   (3)、指针。在电脑里,指针只有一种,就是指向某一地址的RAM,而在单片机里指针有几种:
   1、 指向外部RAM的指针 例uchar xdata *p 使用指令 movx @dptr 占二个字节
   2、 指向程序ROM的指针 例uchar code *p 使用指令 movc 占二个字节
   3、 指向内部的RAM的指针 例uchar data *p 使用指令 mov @ri 占一个字节
   4、 指向外部RAM的分页指针 例uchar pdata *p 使用指令 movx @ri 占一个字节
   5、 一般指针,可以指向以上的任何一种 占三个字节
   6. 还有其它用于分组切换的指针。
  在电脑里,所有程序都必须先放在RAM里才能运行,所以它的指针只有一种情况,就是指向RAM。而单片机的结构和电脑的结构有很大差别,指针类型很多,对指针运算的速度也不一样,由于第5种指针"一般指针"运算很慢,同时又需要占用很多程序空间,这使得指针运算不能从UNIX源代码直接移植到单片机上,而UNIX实现TCP/IP的源代码中,用的最多的就是指针,而在单片机里一般要求少用指针,或使用特定类型的指针。这使用UNIX的源代码需要作很多的改动。
  (4)、参数传递。在UNIX实现的TCP/IP源代码中,一般有很多的参数传递,而在单片机里允许传递的参数是有限的(因为受到内部RAM的限制),同时参数传递的过程要浪费程序代码空间,也降低单片机执行速度。所以在单片机的实现里,一般不要做太多的参数传递,而多使用公共的全局变量来实现调用的过程。这种情况下,UNIX的一般源程序是相对独立的,受其它函数或变量的影响很小,而单片机里各程序的相互依赖程度要大。因为在单片机里往往共享某一数据、某一变量。
  (5)变量定义。UNIX和KEIL C51虽然都是C语言,但两者又有所不同,对于一些变量的定义,两者却不能通用。例如,单片机的特殊寄存器定义,sfr sfr16 sbit等,在标准C里是没有的。在标准C里支持的结构,在KEIL C里也有可能不支持,比如一些C++的语法。在处理上的特殊性,也可能不一样,比如IP地址类型,在UNIX里一般将IP地址定义为数组:
uchar ip[4]; 而在单片机里,我的定义是
union IP_address_type{uchar bytes[4];
uint words[2];
ulong dwords;}
IP 被定义为共用体,而不是简单的一个数组。为什么要这样做,是因为单片机处理的特殊性,例如比较两个IP地址IP1,IP2是否相等,如果使用数组,比较是麻烦的: 要写成 if(IP1[0]==IP2[1])**IP1[1]=IP2[1]**…… 用共用体可以简化为
if(IP1.dwords==IP2.dwords)…… 有时候,我们又要把IP地址按16位来计算,比如较验和计算,那么IP地址按16位加可以写成: IP.dwords[0]+ IP.dwords[1], 有时,我们又要对IP地址按字节赋值,比如IP地址从24C02里读出来,需要按字节赋值:可以为 IP.bytes[0]=×× IP.bytes[1]=×× IP.bytes[2]=×× IP.bytes[3]=××
如果不作这样的定义,运算将复杂很多。而且一些编译会认为类型混乱而无法编译。 在单片机里使用共用体会简化很多。而在UNIX里要对这些值作改变,一般是利用指针进行的。在电脑里,用指针运算是方便的,而且速度也快,但在单片机里,却不能够方便地使用指针。 在UNIX里的一些结构类型的定义都要被改写。这样也使得UNIX的源代码不能直接用在单片机上。
   (6)、协议支持。在UNIX里可支持比较完整的TCP/IP协议,但在单片机里无法做到,这是因为单片机根本没有足够的代码空间来支持这些协议。一般在单片机里实现与需要有关的部分,而不使用的协议则一概不支持。例如文件共享SMB协议,在UNIX、WINDOWS都支持,但单片机上却没有必要。一般只能在单片机中实现:ARP、IP,ICMP、TCP、UDP这些协议,而更高层的协议,http、smtp、ftp一般是不需要支持的。虽然有些单片机例如AVR上网方案实现了http、smtp、ftp协议,但我们认为实用性不太,因为AVR上网方案用的是MEGA103,而该芯片要150元左右,高昂的造价使得AVR上网方案没有得到广泛的应用。单片机应用的TCP/IP协议大多是为了完成数据采集和数据传输,而不是网页浏览、文件传输这些功能。就对某一协议而言,例如ARP协议,UNIX系统支持以太网、令牌环等网络的ARP,但单片机里只支持以太网,也就是说,对于某一协议,也有可能要作简化。IP包最大可以为65K,可以分段传输,而在单片机里根本无法容纳如此大的数据包,因此一般是不支持分段的。单片机一般采用发送小数据包的方式,以避免分段。
   (7)、硬件接口。在UNIX或WINDOWS里,对网卡驱动无一例外都是采用中断方式。而在单片机的应用中,大部份的方案都是查询式的。因为电脑的处理速度快,一次中断的处理时间也很短,不会影响系统内的其它中断。但在单片机里就不行了,处理一次中断,收取一个数据包一般要几毫秒的时间,这将封锁其它中断的产生(只有高优先级的中断可以执行),而单片机往往还存在其它一些中断,比如串口按收中断,A/D条件中断、键盘中断等需要被执行,这就使得消耗时间长的网卡中断改为查询式执行。在电脑里,对网卡的驱动相对简单,而在单片机里需要处理的事情更多。比如缓冲区溢出,阅读一些驱动程序源代码,你可能发现在电脑里的一些程序根本没有处理溢出的代码。因为电脑执行快,网卡缓冲区的溢出几乎是不会发生的,不要说10M网卡,就是100M网卡,电脑也能够很快处理。电脑往往采用即插即用方式来驱动网卡,而单片机却不能这样做,因为即插即用要很多代码来实现,而使用跳线方式,电脑里驱动NE2000的网卡,一般都是用16位DMA的方式,而在单片机里却只能用8位DMA方式。这也使用UNIX对网卡驱动的代码不能直接移植。
关键字:单片机  TCP  IP  UNIX 引用地址:单片机的TCP/IP的实现与UNIX的不同

上一篇:中断方式下进行串口通讯的正确方法
下一篇:单片机60S倒计时汇编语言

推荐阅读最新更新时间:2024-03-16 14:24

51单片机按键控制花样灯
/**************************************************** * 本程序实现用按键控制花样灯。 * * 当K1按下时,灯从0xfe向左跑一遍; * * 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置; * * 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。 * * 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。 * *
[单片机]
德州仪器:具更高效率和更低功耗,16位MCU在三表市场大展拳脚
    到目前为止, 8位MCU 所取得的巨大成功可归结两个主要的因素:CPU内核的继承性和价格,许多著名的CPU比如8051、68HC05、6502和Z80都是8位的架构,许许多多的工程师在他们还在上大学的时候就学习在这些架构下编程。在基于MCU的产品设计中,工程师的技巧和经验是影响设计的关键因素,所以大多数的工程师都会选择熟悉的MCU进行设计,这就形成新的CPU架构被工程师使用的无形障碍。另外,过多的8位MCU供应商之间的竞争导致了比较低的价格,也是8位MCU普及的原因。 但如果从CPU架构的角度对8位MCU做更深入的分析,您可以发现8位的MCU在今天的许多应用中实际在做 16位MCU 的事情,并且由于这一点在性能上有
[工业控制]
用AVR单片机模拟的串口程序
在一些应用中 , 经常要用到双串口,但是一般单片机只提供一个串口,其实完全可以用普通I/O口模拟一个串口。以下的程序是我编写的模拟串口程序,程序中使用了单片机的定时器0,和INT0中断。数据的发送和接收由中断程序自动进行。程序已经过AVR仿真器仿真和实际烧片使用,证明可靠。有一点需要说明的是,此模拟的串口为半双工方式。 主程序中,单片机将标准串口设置为115200bps,将模拟串口设置为19200bps。单片机将标准串口收到的数据从模拟串口发送出去,将模拟串口接收到的数据从标准串口发送回来。 ;*****************************************************************
[单片机]
基于单片机和DS18B20的数字温度计
温度测量是从金属(物质)的热胀冷缩开始,常用的检测方法有电阻式、热电偶式、PN结型、辐射型、光纤式及石英谐振型等。这些检测方法都是基于温度变化引起其物理参数(如电阻值,热电势等)变化的原理。随着大规模集成电路工艺的提高,出现了多种集成的数字化温度传感器。 这里提出一种基于MSP430单片机翻的小型测温系统设计方案,主控制器采用MSP430单片机,数字温度传感器DS18B20通过单总线(1-wire)与单片机连接,系统结构简单,抗干扰能力强,适合于恶劣环境下澍量现场温度,可应用于仓库测温、楼宇空调控制和生产过程监控等领域。 1 数字式温度计的总体设计 该系统以单片机为数字温度计的主控制器,以集成数字温度传感器为温度信息
[单片机]
基于<font color='red'>单片机</font>和DS18B20的数字温度计
ARM-Linux开发与MCU开发比较
1.ARM-Linux应用开发和单片机开发的不同 这里先要做一个说明,对于ARM的应用开发主要有两种方式:一种是直接在ARM芯片上进行应用开发,不采用操作系统,也称为裸机编程,这种开发方式主要应用于一些低端的ARM芯片上,其开发过程非常类似单片机,这里不多叙述。还有一种是在ARM芯片上运行操作系统,对于硬件的操作需要编写相应的驱动程序,应用开发则是基于操作系统的,这种方式的嵌入式应用开发与单片机开发差异较大。ARM-Linux应用开发和单片机的开发主要有以下几点不同: 应用开发环境的硬件设备不同 单片机:开发板、仿真器(调试器)、USB线; ARM-Linux:开发板、网线、串口线、SD卡; 对于ARM-Linux
[单片机]
51单片机的外设
51单片机的外设究竟该怎样理解?做以下实验。 实验1:外部中断0的实验 实验步骤:将一根杜邦线的一端接到P3^2口上,另一端接电源或者地 实验程序: #include reg52.h sbit led = P1^0; void mian(void) { while(1){ if(IE0){ led = 0; } else{ led = 1; } } } 实验结果:当杜邦线另一端接电源时,led灭;当接地时,led就亮 结论:无论配置与否,51单片机的外部中断这个外设都在工作着,不可能禁止 实验2:定时器0的实验 实验程序: #include reg52.h sbit l
[单片机]
基于单片机的电梯自动控制系统的设计与实现
伴随着社会的发展与进步,人们的生活水平的提高和节约用地的倡导,越来越多的高楼耸立,使人们的生活和工作受到很大的影响,垂直运输的问题也随之出现,人们迫切需要一套安全、快捷、高效、稳定的电梯控制系统。电梯控制模型的设计主要涉及数电、模电、单片机及接口技术、C51的编程等知识,可谓知识面含量非常广,但因现代的微电子技术、计算机技术和嵌入式微控制器技术等的飞速发展,让我们做出应用型的电梯已成为可能。目前各小区居民楼都已经安装上了快捷、方便的电梯系统,但某些方面如安全性和稳定性还有待提高,用户也给出了更高的要求。 目前电梯控制主要有继电器控制、可编程控制器控制、微机控制(单片机控制)这3种控制方式。利用单片机控制电梯具有成本低、高精度的重量检
[单片机]
基于<font color='red'>单片机</font>的电梯自动控制系统的设计与实现
基于C8051F016单片机和功率放大器实现程控三相交流功率源的设计
前言 程控三相交流功率源的应用十分广泛,它被大量应用于冶金、通信、化工、电力及军工等诸多行业。用于交流调压、调功、调光及电机软启动等工业自动化控制领域,还可以用于计量以及产品的性能试验等方面。用于计量和产品试验等领域的功率源对于其输出波形要求较高,要求功率源输出完整的正弦波信号,对于正弦波的失真度有一定的限制。目前此类交流功率源的实际输出功率都很小,它们一般只强调单项指标,即电流或电压输出。而用于电能表计量时,其功率源输出的不是真实的功率,而是利用产生“虚功率”的方法来实现电能的计量。在某些产品的性能试验或计量过程中需要产生实际的交流功率,且要求其任意相的电流、电压、相位都能够独立调节。目前的交流功率源都无法满足要求,本文介绍的三
[单片机]
基于C8051F016<font color='red'>单片机</font>和功率放大器实现程控三相交流功率源的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved