<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>木客网</title>
	<atom:link href="http://woodfeed.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://woodfeed.com</link>
	<description>囍</description>
	<lastBuildDate>Wed, 10 Mar 2010 09:33:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>认领博客</title>
		<link>http://woodfeed.com/%e8%ae%a4%e9%a2%86%e5%8d%9a%e5%ae%a2/</link>
		<comments>http://woodfeed.com/%e8%ae%a4%e9%a2%86%e5%8d%9a%e5%ae%a2/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 09:33:51 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[生活随记]]></category>

		<guid isPermaLink="false">http://woodfeed.com/%e8%ae%a4%e9%a2%86%e5%8d%9a%e5%ae%a2/</guid>
		<description><![CDATA[QQREADER5A506122C50B4B1D
精彩文章win主机404实现伪静态翻页错误bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...让WordPress支持中文tag和链接有的人用文章名做固定链接（%postname%），但是汉字标题出来后，地址栏的链接就变为...Linux常用命令详解(2)三 文件管理
1.Diff  2. find  3. ln  4.locate  5. ...wp主题k2k2是一款功能强大且外观易于定制的主题。...Linux常用命令详解(5)七 系统管理
1 adduser 2 passwd 3 date 4 exit 5 f...浅谈机器人在线迷宫中的控制策略问题循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理...地址解析协议ARP和反向地址解析协议RARPARP，全称Address Resolution Protocol，中文名为地址解析协议...霍尔传感器霍尔传感器是一种磁传感器。用它可以检测磁场及其变化，可在各种与磁场有关的场合中使用。霍尔...光电编码器的特性及应用光电编码器，是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是...linux下Vi编辑器命令大全文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等，...]]></description>
			<content:encoded><![CDATA[<p>QQREADER5A506122C50B4B1D</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/wp-replacement-of-domain-names/" title="WP更换域名">WP更换域名</a><br /><small>首先进入MySQL后台phpMyAdmin：
点结构体旁边的SQL按钮，在下面命令框内分...</small></li><li><a href="http://woodfeed.com/yigeshidaidejieshu/" title="迈克尔-杰克逊逝世 一个时代的结束">迈克尔-杰克逊逝世 一个时代的结束</a><br /><small>“据2006年底统计，其正版专辑全球销量已超过7.5亿，被载入“吉尼斯世界记录大全”。他...</small></li><li><a href="http://woodfeed.com/my-domain-is-woodfeed/" title="域名选择了WoodFeed——木客网">域名选择了WoodFeed——木客网</a><br /><small>        哎，终于发现了网民的力量是多么的强大啊！想N多域名，都被注册了！至到Wo...</small></li><li><a href="http://woodfeed.com/my-alexa-ranking-updated-today/" title="3天后的今天alexa又更新了">3天后的今天alexa又更新了</a><br /><small>今天排名又更新了。



...</small></li><li><a href="http://woodfeed.com/a-different-day/" title="不一样的一天">不一样的一天</a><br /><small>为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...</small></li><li><a href="http://woodfeed.com/digital-compression-coding-techniques/" title="数字压缩编码技术">数字压缩编码技术</a><br /><small> 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li><li><a href="http://woodfeed.com/detail-to-explain-the-nfs-under-linux/" title="Linux下NFS详解">Linux下NFS详解</a><br /><small>NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...</small></li><li><a href="http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/" title="win主机404实现伪静态翻页错误">win主机404实现伪静态翻页错误</a><br /><small>bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/%e8%ae%a4%e9%a2%86%e5%8d%9a%e5%ae%a2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>注册了一个域名laeon.com</title>
		<link>http://woodfeed.com/a-new-domain-name-laeon-com/</link>
		<comments>http://woodfeed.com/a-new-domain-name-laeon-com/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 01:44:29 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[生活随记]]></category>
		<category><![CDATA[joomla!]]></category>
		<category><![CDATA[laeon]]></category>
		<category><![CDATA[laeon.com]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=561</guid>
		<description><![CDATA[前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~
这个比较短，五个字母 LaEon.com 。已经用joomla!建了一个测试站点，大家去看看怎么样~哈哈~
<a href="http://laeon.com">http://laeon.com</a>]]></description>
			<content:encoded><![CDATA[<p>前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~<br />
这个比较短，五个字母 LaEon.com 。已经用joomla!建了一个测试站点，大家去看看怎么样~哈哈~</p>
<p style="text-align: center;"><a href="http://laeon.com">http://laeon.com</a></p>
<p style="text-align: center;"> </p>
<p>Joomla!是一套在国外相当知名的内容管理系统</p>
<p>　　（Content Management System, CMS），它属于Portal（企业入口网站）类型，顾名思义，就是比较适合作为商业类型的网站程序。一般人对这类型的内容管理系统可能会有以下的别名来称呼：</p>
<p>　　■ 架站程序（或软件）<br />
　　■ 快速架站程序（或软件）<br />
　　■ 整站程序</p>
<p>　　Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统，可以在Linux、 Windows、MacOSX等各种不同的平台上执行。目前是由Open Source Matters (www.opensourcematters.org)这个开放源码组织进行开发与支持，这个组织的成员来自全世界各地，小组成员约有150人，包含了开发者、设计者、系统管理者、文件撰写者，以及超过2万名的参与会员。目前，Joomla!最新的版本是1.6。</p>
<p>　　<strong>Joomla!的优秀特点</strong><br />
　　当然每个知名的开源码程序都会有其吸引人的优点，反之当然会有缺点。以下整理出在网络上来自使用者对Joomla!程序的喜好重点：</p>
<p>　　<strong><br />
　　先进的网站技术的运用：</strong><br />
　　Joomla!应用了非常多的网站进步的新技术，像是「网站快取技术」可以加速网站的反应与效能。「RSS新闻联播与新闻读取」是最近十分热门的网站新闻读取的技术，在部落格程序中（Blog）中十分常见。「SEO搜寻引擎最佳化」这个是目前所有网站必备的技术之一，这个功能主要是让搜寻引擎更容易的浏览您网站上的数据，让更多人在搜寻引擎上找到您的网站，相当于为自己的网站带来更多的人潮和商机。</p>
<p>　　庞大的附加套件及商机：<br />
　　来自全球上千种不同网站应用的附加套件及美工设计布景，都是以这套系统为基础而开发。使用者可以很方便的安装上这些附加套件，如同在桌上计算机中的Windows操作系统中，安装新的软件一般。开发社群总是发挥无止尽的创意，不断的开发符合使用社群需求的产品。Joomla!的商用套件市场目前也有许多价廉物美的软件及美工设计布景主题。</p>
<p>　　<strong>简单且丰富的操作接口：</strong><br />
　　Joomla!的操作接口除了美观之外，也花了很多心力在设计这些接口的简易操作性。虽然初次使用者，需要花一点时间学习一下操作的方式，才能运用自如。但相信学会使用之后，这是很值得的。另外可搭配的多种所视即所得编辑程序，更可让对网页设计语言不熟悉的管理者，很简易的就可以管理和编辑网站上的文章。</p>
<p>　　<strong>高度的客制和开发的弹性：</strong><br />
　　对于网站程序开发者和美工设计者，Joomla!保留了最大的客制化弹性和整合能力。全世界的网站相关开发人员，都十分关注与推荐这套系统。是由于这套系统不断在强大能力与客制弹性之间找寻平衡点，受到许多知名厂商的使用。</p>
<p>　　Joomla!的历史</p>
<p>　　Mambo软件最早在2001年五月份由澳洲Miro公司所开发，由于Miro公司有商业化的考虑，原先发布并采用GNU/GPL授权的软件版本，在版本3.0.5之后就不再支持。<br />
　　后来由Robert Castley（现已离开核心小组）接手后续的开发原始码版本，并招募新的志愿者。Mambo发展至4.5.1版本之后，整合了许多新的网站技术，以及新的操作接口，在2004年获得Linux User &amp; Developer Award 2004的「Best Linux or Open Source Software」奖项，自此大放异彩从此，在开源码的内容管理系统中占有一席之地，受到使用社群的高度重视。<br />
　　Mambo 2005年8月后由于原先的所有人Miro公司，希望能深入参与开发工作及决定未来的发展方向，引起和核心开发小组之间的意见不合，前开发小组领导人 Eddie Andrew带领几乎八成的原小组成员，成立新的开源码计划Joomla!。而原有的Mambo计划，则由Miro公司重新招募成员与自行雇用开发人员，继续发展下去。目前Joomla!发布的1.0.x版本与Mambo4.5.2版本功能相差无几。</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/mail-problem-in-windows-host-for-wp/" title="WordPress使用win主机出现的邮件问题">WordPress使用win主机出现的邮件问题</a><br /><small>邮件问题是很头痛的，我搞了N天，首先就是肯定用不了自带的mail()函数来发注册邮件和评...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-4/" title="Linux常用命令详解(4)">Linux常用命令详解(4)</a><br /><small>五 磁盘维护
1 mkfs(make file system)
六 系统设置
1 exp...</small></li><li><a href="http://woodfeed.com/all-commands-about-the-vi-editor-under-linux/" title="linux下Vi编辑器命令大全">linux下Vi编辑器命令大全</a><br /><small>文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等，...</small></li><li><a href="http://woodfeed.com/apache-mod_rewrite-for-301-redirect/" title="Apache mod_rewrite 实现301重定向">Apache mod_rewrite 实现301重定向</a><br /><small>它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li><li><a href="http://woodfeed.com/detail-to-explain-the-nfs-under-linux/" title="Linux下NFS详解">Linux下NFS详解</a><br /><small>NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...</small></li><li><a href="http://woodfeed.com/simple-smar-electric-ehicles/" title="简单智能电动车">简单智能电动车</a><br /><small>本简易智能电动车跷跷板分为电动车智能行驶和跷跷板两个主要部分，都以单片机为控制核心，根据...</small></li><li><a href="http://woodfeed.com/internet-control-message-protocol-icmp/" title="网际控制报文协议ICMP">网际控制报文协议ICMP</a><br /><small>ICMP协议是一个非常重要的协议，它对于网络安全具有极其重要的意义。（RFC-792）I...</small></li><li><a href="http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/" title="win主机404实现伪静态翻页错误">win主机404实现伪静态翻页错误</a><br /><small>bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...</small></li><li><a href="http://woodfeed.com/location-type-pid-control-algorithm/" title="位置式PID控制算法">位置式PID控制算法</a><br /><small>输出值与阀门开度一一对应，所以称为位置式PID控制算法。...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/a-new-domain-name-laeon-com/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>网际控制报文协议ICMP</title>
		<link>http://woodfeed.com/internet-control-message-protocol-icmp/</link>
		<comments>http://woodfeed.com/internet-control-message-protocol-icmp/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 10:00:44 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[TCP/IP]]></category>
		<category><![CDATA[ICMP]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=560</guid>
		<description><![CDATA[ICMP协议是一个非常重要的协议，它对于网络安全具有极其重要的意义。（RFC-792）Internet控制报文协议(网际控制报文协议)。]]></description>
			<content:encoded><![CDATA[<p><strong>ICMP协议</strong><br />
它是TCP/IP协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时，会自动发送ICMP消息。我们可以通过Ping命令发送ICMP回应请求消息并记录收到ICMP回应回复消息。通过这些消息来对网络或主机的故障提供参考依据<br />
ICMP是“Internet Control Message Protocol”（Internet控制消息协议）的缩写。它是TCP/IP协议族的一个子协议，用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据，但是对于用户数据的传递起着重要的作用。<br />
我们在网络中经常会使用到ICMP协议，只不过我们觉察不到而已。比如我们经常使用的用于检查网络通不通的Ping命令，这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。</p>
<p><strong>ICMP的重要性</strong><br />
ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。例如，在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中，其防火墙遭受到的ICMP攻击达334050次之多，占整个攻击总数的90%以上！可见，ICMP的重要性绝不可以忽视！<br />
比如，可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定，向主机发起“Ping of Death”（死亡之Ping）攻击。“Ping of Death” 攻击的原理是：如果ICMP数据包的尺寸超过64KB上限时，主机就会出现内存分配错误，导致TCP/IP堆栈崩溃，致使主机死机。<br />
此外，向目标主机长时间、连续、大量地发送ICMP数据包，也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”，使得目标主机耗费大量的CPU资源处理，疲于奔命。</p>
<p><strong>ICMP的主要功能</strong></p>
<p>从技术角度来说，ICMP就是一个“错误侦测与回报机制”，其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性﹐其功能主要有：</p>
<p>· 侦测远端主机是否存在。<br />
· 建立及维护路由资料。<br />
· 重导资料传送路径。<br />
· 资料流量控制。</p>
<p><strong>ICMP的消息类型</strong></p>
<p>我们需要认识到，ICMP协议在某些情况下不会发送错误信息。ICMP不会对ICMP信息做出响应。如果ICMP回应其它ICMP消息，这些消息的数量会爆炸性增长而演变为一场ICMP消息风暴。为了防止出现广播风暴，ICMP消息也不会回应一个广播或者多播地址。<br />
最有用的ICMP数据包类型“目标不可达”（类型三）的消息。错误消息一般由路由器生成，并且发送给数据包的来源。大多数错误信息还将发送给与发送的数据包有关的应用程序。在这种情况下，TCP协议将广泛使用ICMP协议。</p>
<p>在IPv4协议中最常用的ICMP消息类型有以下几种:<br />
•回显应答(类型0)和回显请求(类型8):这是Ping程序发送的信息。<br />
•目标不可达(类型3)<br />
•源抑制(类型4):这是一种用于通知发送者路由器或者主机出现阻塞现象的ICMP消息，发送者需要降低发送速度。<br />
•重定向(类型5):这个消息用来向可以访问两台路由器的主机说“请使用另一台路由器”。我们在此系列讲座中未来的路由问题中再详细讨论这个问题。<br />
•路由器信息应答(类型9)和路由器信息请求(类型10)<br />
•超时(类型11):这个消息有两种用途。第一，当超过IP生存期时向发送系统发出错误信息。第二，如果分段的IP数据报没有在某种时限内重新组合，这个消息将通知发送系统。</p>
<p>当然，上述各种类型的消息中都包含子类型代码。类型三消息“目标不可达”本身有15个子类型代码。我们就不提供每一项的细节了。但是，ICMP协议中有一项非常重要的应用要依靠类型三的消息。</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/a-new-domain-name-laeon-com/" title="注册了一个域名laeon.com">注册了一个域名laeon.com</a><br /><small>前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~
这个比较短，五个字...</small></li><li><a href="http://woodfeed.com/detailed-description-of-linux-network-configuration/" title="Linux网络配置详解">Linux网络配置详解</a><br /><small>从linux诞生的那一天起,就注定了它的网络功能空前地强大.所以在linux系统中如何配...</small></li><li><a href="http://woodfeed.com/all-commands-about-the-vi-editor-under-linux/" title="linux下Vi编辑器命令大全">linux下Vi编辑器命令大全</a><br /><small>文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等，...</small></li><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li><li><a href="http://woodfeed.com/a-different-day/" title="不一样的一天">不一样的一天</a><br /><small>为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...</small></li><li><a href="http://woodfeed.com/create-multiple-wp-blog-by-one-wp-code/" title="一个WordPress建立多个独立WP博客">一个WordPress建立多个独立WP博客</a><br /><small>共用一个WordPress
可以共用同一个数据库...</small></li><li><a href="http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/" title="win主机404实现伪静态翻页错误">win主机404实现伪静态翻页错误</a><br /><small>bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...</small></li><li><a href="http://woodfeed.com/support-the-chinese-tags-and-links-by-wordpress/" title="让WordPress支持中文tag和链接">让WordPress支持中文tag和链接</a><br /><small>有的人用文章名做固定链接（%postname%），但是汉字标题出来后，地址栏的链接就变为...</small></li><li><a href="http://woodfeed.com/my-alexa-ranking-updated-today/" title="3天后的今天alexa又更新了">3天后的今天alexa又更新了</a><br /><small>今天排名又更新了。



...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-4/" title="Linux常用命令详解(4)">Linux常用命令详解(4)</a><br /><small>五 磁盘维护
1 mkfs(make file system)
六 系统设置
1 exp...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/internet-control-message-protocol-icmp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>地址解析协议ARP和反向地址解析协议RARP</title>
		<link>http://woodfeed.com/address-resolution-protocol-arp-and-reverse-address-resolution-protocol-rarp/</link>
		<comments>http://woodfeed.com/address-resolution-protocol-arp-and-reverse-address-resolution-protocol-rarp/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 14:58:14 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[TCP/IP]]></category>
		<category><![CDATA[ARP]]></category>
		<category><![CDATA[RARP]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=559</guid>
		<description><![CDATA[ARP，全称Address Resolution Protocol，中文名为地址解析协议，它工作在数据链路层，在本层和硬件接口联系，同时对上层提供服务。
反向地址转换协议（RARP）允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。]]></description>
			<content:encoded><![CDATA[<p><strong>什么是ARP RARP</strong></p>
<p>ARP，全称Address Resolution Protocol，中文名为地址解析协议，它工作在数据链路层，在本层和硬件接口联系，同时对上层提供服务。<br />
IP数据包常通过以太网发送，以太网设备并不识别32位IP地址，它们是以48位以太网地址传输以太网数据包。因此，必须把IP目的地址转换成以太网目的地址。在以太网中，一个主机要和另一个主机进行直接通信，必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢？它就是通过地址解析协议获得的。ARP协议用于将网络中的IP地址解析为的硬件地址（MAC地址），以保证通信的顺利进行。</p>
<p>RARP（Reverse Address Resolution Protocol）：反向地址转换协议<br />
反向地址转换协议（RARP）允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址（MAC）和与其对应的 IP 地址。当设置一台新的机器时，其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录，RARP 服务器将会返回 IP 地址给机器，此机器就会存储起来以便日后使用。</p>
<p>ARP是在仅知道主机的IP地址时确定其物理地址的一种协议。因IPv4和以太网的广泛应用，其主要用作将IP地址翻译为以太网的MAC地址，但其也能在ATM和FDDIIP网络中使用。从IP地址到物理地址的映射有两种方式：表格方式和非表格方式。<br />
ARP具体说来就是将网络层（IP层，也就是相当于OSI的第三层）地址解析为数据连接层（MAC层，也就是相当于OSI的第二层）的MAC地址。<br />
假设：<br />
计算机A的IP为192.168.1.1，MAC地址为00-11-22-33-44-01;<br />
计算机B的IP为192.168.1.2，MAC地址为00-11-22-33-44-02;</p>
<p><strong>ARP工作原理</strong>：<br />
在TCP/IP协议中，A给B发送IP包，在包头中需要填写B的IP为目标地址，但这个IP包在以太网上传输的时候，还需要进行一次以太包的封装，在这个以太包中，目标地址就是B的MAC地址。<br />
计算机A是如何得知B的MAC地址的呢？解决问题的关键就在于ARP协议。<br />
在A不知道B的MAC地址的情况下，A就广播一个ARP请求包，请求包中填有B的IP(192.168.1.2)，以太网中的所有计算机都会接收这个请求，而正常的情况下只有B会给出ARP应答包，包中就填充上了B的MAC地址，并回复给A。<br />
A得到ARP应答后，将B的MAC地址放入本机缓存，便于下次使用。<br />
本机MAC缓存是有生存期的，生存期结束后，将再次重复上面的过程。<br />
ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候，就会对本地的ARP缓存进行更新，将应答中的IP和MAC地址存储在ARP缓存中。因此，当局域网中的某台机器B向A发送一个自己伪造的ARP应答，而如果这个应答是B冒充C伪造来的，即IP地址为C的IP，而MAC地址是伪造的，则当A接收到B伪造的ARP应答后，就会更新本地的ARP缓存，这样在A看来C的IP地址没有变，而它的MAC地址已经不是原来那个了。由于局域网的网络流通不是根据IP地址进行，而是按照MAC地址进行传输。所以，那个伪造出来的MAC地址在A上被改变成一个不存在的MAC地址，这样就会造成网络不通，导致A不能Ping通C！这就是一个简单的ARP欺骗。<br />
概括的说：<br />
1.	首先，每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表，以表示IP地址和MAC地址的对应关系。<br />
2.	当源主机需要将一个数据包要发送到目的主机时，会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址，如果有﹐就直接将数据包发送到这个MAC地址；如果没有，就向本地网段发起一个ARP请求的广播包，查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。<br />
3.	网络中所有的主机收到这个ARP请求后，会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包；如果相同，该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中，如果ARP表中已经存在该IP的信息，则将其覆盖，然后给源主机发送一个 ARP响应数据包，告诉对方自己是它需要查找的MAC地址；<br />
4.	源主机收到这个ARP响应数据包后，将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中，并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包，表示ARP查询失败。<br />
<strong> RARP的工作原理</strong>：<br />
1.	发送主机发送一个本地的RARP广播，在此广播包中，声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址；<br />
2.	本地网段上的RARP服务器收到此请求后，检查其RARP列表，查找该MAC地址对应的IP地址；<br />
3.	如果存在，RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用；<br />
4.	如果不存在，RARP服务器对此不做任何的响应；<br />
5.	源主机收到从RARP服务器的响应信息，就利用得到的IP地址进行通讯；如果一直没有收到RARP服务器的响应信息，表示初始化失败。</p>
<h2>ARP和RARP报头结构</h2>
<p><strong>ARP</strong><strong>和RARP使用相同的报头结构，如图1所示。</strong></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" width="244" valign="top">
<p align="center">硬件类型</p>
</td>
<td width="244" valign="top">
<p align="center">协议类型</p>
</td>
</tr>
<tr>
<td width="122" valign="top">
<p align="center">硬件地址长度</p>
</td>
<td width="122" valign="top">
<p align="center">协议长度</p>
</td>
<td width="244" valign="top">
<p align="center">操作类型</p>
</td>
</tr>
<tr>
<td colspan="3" width="488" valign="top">
<p align="center">发送方的硬件地址（0-3字节）</p>
</td>
</tr>
<tr>
<td colspan="2" width="244" valign="top">
<p align="center">源物理地址（4-5字节）</p>
</td>
<td width="244" valign="top">
<p align="center">源IP地址（0-1字节）</p>
</td>
</tr>
<tr>
<td colspan="2" width="244" valign="top">
<p align="center">源IP地址（2-3字节）</p>
</td>
<td width="244" valign="top">
<p align="center">目标硬件地址（0-1字节）</p>
</td>
</tr>
<tr>
<td colspan="3" width="488" valign="top">
<p align="center">目标硬件地址（2-5字节）</p>
</td>
</tr>
<tr>
<td colspan="3" width="488" valign="top">
<p align="center">目标IP地址（0-3字节）</p>
</td>
</tr>
<tr height="0">
<td width="122"></td>
<td width="122"></td>
<td width="244"></td>
</tr>
</tbody>
</table>
<p align="center">（图1　ARP/RARP报头结构）</p>
<ul>
<li><span style="background-color: #ffffff;">硬件类型字段指明了发送方想知道的硬件接口类型，以太网的值为1；</span></li>
<li><span style="background-color: #ffffff;">协议类型字段指明了发送方提供的高层协议类型，IP为0800（16进制）；</span></li>
<li><span style="background-color: #ffffff;">硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度，这样ARP报文就可以在任意硬件和任意协议的网络中使用；</span></li>
<li><span style="background-color: #ffffff;">操作字段用来表示这个报文的类型，ARP请求为1，ARP响应为2，RARP请求为3，RARP响应为4；</span></li>
<li><span style="background-color: #ffffff;">发送方的硬件地址（0-3字节）：源主机硬件地址的前3个字节；</span></li>
<li><span style="background-color: #ffffff;">发送方的硬件地址（4-5字节）：源主机硬件地址的后3个字节；</span></li>
<li><span style="background-color: #ffffff;">发送方IP（0-1字节）：源主机硬件地址的前2个字节；</span></li>
<li><span style="background-color: #ffffff;">发送方IP（2-3字节）：源主机硬件地址的后2个字节；</span></li>
<li><span style="background-color: #ffffff;">目的硬件地址（0-1字节）：目的主机硬件地址的前2个字节；</span></li>
<li><span style="background-color: #ffffff;">目的硬件地址（2-5字节）：目的主机硬件地址的后4个字节；</span></li>
<li><span style="background-color: #ffffff;">目的IP（0-3字节）：目的主机的IP地址。</span></li>
</ul>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/photoshop-box/" title="PhotoShop作业&#8211;盒子">PhotoShop作业&#8211;盒子</a><br /><small>
 
去年做的一个作业，ps的处女作。...</small></li><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-2/" title="Linux常用命令详解(2)">Linux常用命令详解(2)</a><br /><small>三 文件管理
1.Diff  2. find  3. ln  4.locate  5. ...</small></li><li><a href="http://woodfeed.com/my-domain-is-woodfeed/" title="域名选择了WoodFeed——木客网">域名选择了WoodFeed——木客网</a><br /><small>        哎，终于发现了网民的力量是多么的强大啊！想N多域名，都被注册了！至到Wo...</small></li><li><a href="http://woodfeed.com/simple-smar-electric-ehicles/" title="简单智能电动车">简单智能电动车</a><br /><small>本简易智能电动车跷跷板分为电动车智能行驶和跷跷板两个主要部分，都以单片机为控制核心，根据...</small></li><li><a href="http://woodfeed.com/a-different-day/" title="不一样的一天">不一样的一天</a><br /><small>为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...</small></li><li><a href="http://woodfeed.com/a-new-domain-name-laeon-com/" title="注册了一个域名laeon.com">注册了一个域名laeon.com</a><br /><small>前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~
这个比较短，五个字...</small></li><li><a href="http://woodfeed.com/all-commands-about-the-vi-editor-under-linux/" title="linux下Vi编辑器命令大全">linux下Vi编辑器命令大全</a><br /><small>文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等，...</small></li><li><a href="http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/" title="视频采集设备的标准采集分辨率">视频采集设备的标准采集分辨率</a><br /><small>QCIF全称Quarter common intermediate format。QCI...</small></li><li><a href="http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/" title="win主机404实现伪静态翻页错误">win主机404实现伪静态翻页错误</a><br /><small>bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/address-resolution-protocol-arp-and-reverse-address-resolution-protocol-rarp/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>uIP &#8211; uipopt.h配置</title>
		<link>http://woodfeed.com/uip-uipopt-h-configuration-2/</link>
		<comments>http://woodfeed.com/uip-uipopt-h-configuration-2/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 06:27:11 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[TCP/IP]]></category>
		<category><![CDATA[uIP]]></category>
		<category><![CDATA[uipopt.h]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=553</guid>
		<description><![CDATA[使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译时选项，并且应该与特定的项目匹配。]]></description>
			<content:encoded><![CDATA[<p>使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译时选项，并且应该与特定的项目匹配。<br />
<strong> uIP类型定义</strong><br />
typedef unsigned char u8_t;<br />
typedef unsigned short u16_t;<br />
typedef unsigned short uip_stats_t;<br />
<strong> uIP静态配置选项</strong><br />
只有在UIP_FIXEDADDR设置为1时，这些配置选项才可以用来静态的设置IP地址。一个特定节点的配置选项包括IP地址，子网掩码，默认网关(router)，以及以太网地址。子网掩码，默认网关和以太网地址仅仅当uIP运行在以太网上才适用。<br />
所有这些应该被修改以适应你的项目。<br />
<strong> #define UIP_FIXEDADDR    1</strong><br />
决定uIP是否使用一个固定的IP地址。<br />
如果uIP使用一个固定的IP地址，应该置位（set）这些uipopt.h中的选项。如果不的话，则应该使用宏uip_sethostaddr(),uip_setdraddr() 和 uip_setnetmask()。<br />
<strong> #define UIP_PINGADDRCONF 0</strong><br />
Ping IP地址赋值。<br />
如果置位这个选项，那么uIP使用一个&#8221;ping&#8221; packets来设置它自己的IP地址。如果是这样的话，uIP启动时的IP地址是空的，并且第一个到来的&#8221;ping&#8221;（ICMP echo）packet的目的IP地址将被用于设置主机的IP地址。？？<br />
注意这只有在UIP_FIXEDADDR为0的时候才起作用。<br />
<strong> #define UIP_FIXEDETHADDR 0</strong><br />
指明uIP ARP模块是否在编译时使用一个固定的以太网MAC地址。<br />
如果这个选项为0，那么宏uip_setethaddr()可以用来在运行时指定以太网MAC地址。<br />
<strong> #define UIP_TTL         255</strong><br />
uIP发送的IP packets的IP TTL (time to live)。<br />
<strong> #define UIP_REASSEMBLY 0</strong><br />
uIP支持IP packets的分片和重组。这个特征需要另外的RAM用作重组缓冲区，并且重组代码的大小大约是700字节。重组缓冲区的大小与uip_buf一样（由UIP_BUFSIZE配置）。<br />
注意IP packet重组没有经过严格的测试。<br />
<strong> #define UIP_REASS_MAXAGE 40</strong><br />
一个IP fragment在被丢弃之前可以在重组缓冲区中存在的最大时间。<br />
<strong> #define UIP_UDP           0</strong><br />
是否编译UDP的开关。<br />
<strong> #define UIP_ACTIVE_OPEN 1</strong><br />
决定是否支持uIP打开一个连接。<br />
如果运行在uIP上层的应用程序不必打开一个outgoing TCP连接，那么可以关闭这个选项来减小uIP的代码大小。<br />
<strong> #define UIP_CONNS       10</strong><br />
同时可以打开的TCP连接的最大数目。<br />
由于TCP连接是静态分配的，减小这个数目将占用更少的RAM。每一个TCP连接需要大约30字节的内存。<br />
<strong> #define UIP_LISTENPORTS 10</strong><br />
同时监听的TCP端口的最大数目。<br />
每一个TCP监听端口需要2个字节的内存。<br />
<strong> #define UIP_RECEIVE_WINDOW   32768</strong><br />
建议的接收窗口的大小。<br />
如果应用程序处理到来的数据比较慢，那么应该设置的小一点（即，相对与uip_buf缓冲区的大小来说），相反如果应用程序处理数据很快，可以设置的大一点（32768字节）。<br />
<strong> #define UIP_URGDATA      1</strong><br />
决定是否支持TCP urgent data notification。<br />
Urgent data (out-of-band data)是一个用的比较少TCP特征，它很少需要。<br />
<strong> #define UIP_RTO         3</strong><br />
The initial retransmission timeout counted in timer pulses.<br />
不要改变它。<br />
<strong> #define UIP_MAXRTX      8</strong><br />
在中止连接之前，应该重发一个段的最大次数。<br />
不要改变它。<br />
<strong> #define UIP_TCP_MSS     (UIP_BUFSIZE &#8211; UIP_LLH_LEN &#8211; 40)</strong><br />
TCP段的最大长度。<br />
它不能大于UIP_BUFSIZE &#8211; UIP_LLH_LEN &#8211; 40.<br />
<strong> #define UIP_TIME_WAIT_TIMEOUT 120</strong><br />
一个连接应该在TIME_WAIT状态等待多长。<br />
不要改变它。<br />
<strong> #define UIP_ARPTAB_SIZE 8</strong><br />
ARP表的大小。<br />
如果本地网络中有许多到这个uIP节点的连接，那么这个选项应该设置为一个比较大的值。<br />
<strong> #define UIP_ARP_MAXAGE 120</strong></p>
<p><strong>#define UIP_BUFSIZE     1500</strong><br />
uIP packet缓冲区不能小于60字节，但也不必大于1500字节。<br />
<strong> #define UIP_STATISTICS  1</strong><br />
决定是否支持统计数字。<br />
统计数字对调试很有帮助，并展示给用户。<br />
<strong> #define UIP_LOGGING     0</strong><br />
Determines if logging of certain events should be compiled in.<br />
它对调试非常有用。如果打开这个选项，必须根据特定的体系结构来实现函数uip_log()。<br />
void uip_log(char *msg);<br />
输出应该uIP登陆信息。<br />
必须在使用uIP的模块中实现这个函数，并且在生成一个登陆信息时调用这个函数。<br />
<strong> #define UIP_LLH_LEN     14</strong><br />
链接层头部长度。<br />
对于SLIP，应该设置成0。<br />
#ifndef BYTE_ORDER<br />
#define BYTE_ORDER     LITTLE_ENDIAN<br />
#endif /* BYTE_ORDER */</p>
<p>使用一个应用程序函数来实现一个uIP应用，每当发生了一个TCP/IP事件时uIP就调用这个函数。这个函数的名字必须在编译时使用宏UIP_APPCALL注册到uIP。<br />
通过使用宏UIP_APPSTATE_SIZE指出结构uip_conn的大小，uIP应用可以在这个结构中保存它的状态。必须在uipopt.h中包含定义这些变量的文件（在此例中为httpd.h）。<br />
下面的例子展示它看起来的样子。<br />
void httpd_appcall(void);<br />
#define UIP_APPCALL     httpd_appcall<br />
struct httpd_state {<br />
u8_t state;<br />
u16_t count;<br />
char *dataptr;<br />
char *script;<br />
};<br />
#define UIP_APPSTATE_SIZE (sizeof(struct httpd_state))<br />
/* Include the header file for the application program that should be<br />
used. If you don&#8217;t use the example web server, you should change<br />
this. */<br />
#include &#8220;httpd.h&#8221;<br />
#endif /* __UIPOPT_H__ */</p>
<p>from: jupiter</p>
<p>http://blog.china-pub.com/more.asp?name=xijun168&amp;id=25095</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li><li><a href="http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/" title="源码公开的TCP/IP协议栈uIP的应用">源码公开的TCP/IP协议栈uIP的应用</a><br /><small>摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/uip-uipopt-h-configuration-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C8051f020外部数据存储器复用方式</title>
		<link>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/</link>
		<comments>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 09:35:48 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[8051f020]]></category>
		<category><![CDATA[EMIF]]></category>
		<category><![CDATA[复用方式]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=535</guid>
		<description><![CDATA[C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上RAM （XRAM ），还有外部数据存储器接口（EMIF），可用于访问片外存储器和存储器映射的I/O 器件。外部存储器空间可以用外部传送指令（MOVX ）和数据指针（DPTR ）访问，或者通过使用R0 或R1用间接寻址方式访问。如果 MOVX 指令使用一个 8 位地址操作数（例如  @R1 ），则 16 位地址的高字节由外部存储器接口控制寄存器（EMI0CN，如图 16.1 所示）提供。注意：MOVX指令还用于写 FLASH  存储器。缺省情况下 MOVX  指令访问XRAM。EMIF 可被配置为使用低I/O 端口（P0-P3 ）或高I/O 端口（P4-P7 ）。]]></description>
			<content:encoded><![CDATA[<p><strong>外部数据存储器接口和片内XRAM</strong></p>
<p>C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上RAM （XRAM ），还有外部数据存储器接口（EMIF），可用于访问片外存储器和存储器映射的I/O 器件。外部存储器空间可以用外部传送指令（MOVX ）和数据指针（DPTR ）访问，或者通过使用R0 或R1用间接寻址方式访问。如果 MOVX 指令使用一个 8 位地址操作数（例如  @R1 ），则 16 位地址的高字节由外部存储器接口控制寄存器（EMI0CN，如图 16.1 所示）提供。注意：MOVX指令还用于写 FLASH  存储器。缺省情况下 MOVX  指令访问<span style="background-color: #ffffff;">XRAM。EMIF 可被配置为使用低I/O 端口（P0-P3 ）或高I/O 端口（P4-P7 ）。</span></p>
<p><strong>配置外部存储器接口</strong></p>
<p>配置外部存储器接口的过程包括下面4 个步骤：</p>
<p>1. 将EMIF 选到低端口（P3、P2、P1 和P0 ）或选到高端口（P7、P6、P5 和P4 ）。<br />
2. 选择复用方式或非复用方式。<br />
3. 选择存储器模式（只用片内存储器、不带块选择的分片方式、带块选择的分片方式或只用片外存储器）。<br />
4. 设置与片外存储器或外设接口的时序。<br />
5. 选择所需要的相关端口的输出方式（寄存器PnMDOUT 和P74OUT ）。</p>
<p>下面将对上述每个步骤作出详细说明。端口选择、复用方式选择和存储器模式位都位于<span style="background-color: #ffffff;">EMI0CN 寄存器中，如下。</span></p>
<p align="center"><strong>EMI0CN:  外部存储器接口控制</strong></p>
<p>R/W       R/W      R/W      R/W     R/W      R/W      R/W     R/W   PGSEL7   PGSEL6  PGSEL5   PGSEL4  PGSEL3  PGSEL2  PGSEL1   PGSEL0        位7        位6      位5        位4      位3       位2       位1        位0</p>
<p>复位值:00000000   SFR地址: 0xAF<br />
位 7-0： PGSEL[7:0]：XRAM 页选择位</p>
<p>当使用 8 位的 MOVX 命令时，XRAM 页选择位提供 16 位外部数据存储器地址的高字节，实际上是选择一个256 字节的RAM 页。<br />
0&#215;00：0&#215;0000 – 0&#215;00FF<br />
0&#215;01：0&#215;0100 – 0&#215;01FF<br />
…<br />
0xFE：0xFE00 – 0xFEFF<br />
0xFF：0xFF00 – 0Xffff</p>
<p><strong>端口选择和配置</strong></p>
<p>外部存储器接口可以位于端口3、2、1 和0（C8051F020/1/2/3）或端口7、6、5 和4（只限于C8051F020/2），由PRTSEL 位（EMI0CF.5 ）的状态决定。如果选择低端口，则EMIFLE位（XBR2.1 ）必须被置‘1’，以使交叉开关跳过P0.7(W/R)、P0.6(R/D)和 P0.5(ALE，如果选择复用方式)。<br />
外部存储器接口只在执行片外 MOVX 指令期间使用相关的端口引脚。一旦 MOVX 指令执行完毕，端口锁存器或交叉开关又重新恢复对端口引脚的控制（端口 3、2、1 和 0）。端口锁存器应被明确地配置为使外部存储器接口引脚处于休眠状态，通常是通过将它们设置为逻辑‘1’来实现这一要求。<br />
在执行MOVX 指令期间，外部存储器接口将禁止所有作为输入的那些引脚的驱动器（例如，读操作期间的Data[7:0]）。端口引脚的输出方式（无论引脚被配置为漏极开路或是推挽方式）不受外部存储器接口操作的影响，始终受 PnMDOUT  寄存器的控制。</p>
<p align="center"><strong>EMI0CF:  外部存储器接口配置</strong></p>
<p>R/W       R/W     R/W     R/W     R/W      R/W      R/W     R/W</p>
<p>-         -     PRTSEL   EMD2    EMD1     EMD0    EALE1  EALE0</p>
<p>位7       位6    位5      位4     位3       位2      位1       位0    SFR地址： 0xA3复位值:00000011</p>
<p>位 7-6： 未用。读  = 00b，写  =      忽略。<br />
位 5：      PRTSEL ：EMIF 端口选择位<br />
0：EMIF 在P0-P3。<br />
1：EMIF 在P4-P7。<br />
位4：       EMD2 ：EMIF 复用方式选择位<br />
0：EMIF 工作在地址/数据复用方式。<br />
1：EMIF 工作在非复用方式（分离的地址和数据引脚）。<br />
位 3-2：  EMD1-0 ：EMIF 工作模式选择位<br />
这两位控制外部存储器接口的工作模式。<br />
00：只用内部存储器：MOVX 只寻址片内 XRAM 。所有有效地址都指向片内存储器空间。<br />
01：不带块选择的分片方式。寻址低于4K 边界的地址时访问片内存储器，寻址高于4K 边界的地址时访问片外存储器。8 位片外MOVX 操作使用地址高端口锁存器的当前内容作为地址的高字节。注意：为了能访问片外存储器空间，EMI0CN 必须被设置成一个不属于片内地址空间的页地址。</p>
<p>10：带块选择的分片方式。寻址低于4K 边界的地址时访问片内存储器，寻址高于 4K  边界的地址时访问片外存储器。8 位片外 MOVX  操作使用 EMI0CN           的内容作为地址的高字节。<br />
11：只用外部存储器：MOVX 只寻址片外XRAM 。片内XRAM 对 CPU 为不可见。<br />
位 1-0：  EALE1-0 ：ALE 脉冲宽度选择位（只在EMD2 =0 时有效）<br />
00：ALE 高和ALE 低脉冲宽度  = 1 个 SYSCLK 周期。<br />
01：ALE 高和ALE 低脉冲宽度  = 2 个 SYSCLK 周期。<br />
10：ALE 高和ALE 低脉冲宽度  = 3 个 SYSCLK 周期。<br />
11：ALE 高和ALE 低脉冲宽度  = 4 个 SYSCLK 周期。</p>
<p style="text-align: center;"><strong> 复用方式配置</strong><a href="http://woodfeed.com/wp-content/uploads/2009/12/163emif.jpg" rel="lightbox[535]"><img class="size-medium wp-image-538  aligncenter" title="163emif" src="http://woodfeed.com/wp-content/uploads/2009/12/163emif-300x194.jpg" alt="163emif" width="300" height="194" /></a></p>
<p style="text-align: center;"><strong>带块选择的8 位 MOVX：EMI0CF[4:2] =   ‘010’，</strong><span style="background-color: #ffffff;"><strong>带块选择的复用方式8 位 MOVX 时序</strong></span></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/8read.jpg" rel="lightbox[535]"><img class="size-medium wp-image-539  aligncenter" title="8read" src="http://woodfeed.com/wp-content/uploads/2009/12/8read-300x134.jpg" alt="8read" width="300" height="134" /></a></p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/8write.jpg" rel="lightbox[535]"><img class="size-medium wp-image-540  aligncenter" title="8write" src="http://woodfeed.com/wp-content/uploads/2009/12/8write-300x137.jpg" alt="8write" width="300" height="137" /></a></p>
<p>EMIF在P4-P7的程序配置：</p>
<p><code>XBR0    = 0x07;                     // Enable SMBus, SPI0, and UART0<br />
XBR1    = 0x00;<br />
XBR2    = 0x44;                     // Enable crossbar and weak pull-ups<br />
EMI0CF=0x2d;                                          //外部存储器接口配置<br />
EMI0TC  = 0xff;                                //外部存储器时序控制<br />
P74OUT  = 0xFF;</code></p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/robot-control-of-linear-maze/" title="浅谈机器人在线迷宫中的控制策略问题">浅谈机器人在线迷宫中的控制策略问题</a><br /><small>循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理...</small></li><li><a href="http://woodfeed.com/apache-mod_rewrite-for-301-redirect/" title="Apache mod_rewrite 实现301重定向">Apache mod_rewrite 实现301重定向</a><br /><small>它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥...</small></li><li><a href="http://woodfeed.com/address-resolution-protocol-arp-and-reverse-address-resolution-protocol-rarp/" title="地址解析协议ARP和反向地址解析协议RARP">地址解析协议ARP和反向地址解析协议RARP</a><br /><small>ARP，全称Address Resolution Protocol，中文名为地址解析协议...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li><li><a href="http://woodfeed.com/all-commands-about-the-vi-editor-under-linux/" title="linux下Vi编辑器命令大全">linux下Vi编辑器命令大全</a><br /><small>文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等，...</small></li><li><a href="http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/" title="uIP TCP/IP协议栈在51系列单片机上的应用">uIP TCP/IP协议栈在51系列单片机上的应用</a><br /><small>　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...</small></li><li><a href="http://woodfeed.com/create-multiple-wp-blog-by-one-wp-code/" title="一个WordPress建立多个独立WP博客">一个WordPress建立多个独立WP博客</a><br /><small>共用一个WordPress
可以共用同一个数据库...</small></li><li><a href="http://woodfeed.com/digital-compression-coding-techniques/" title="数字压缩编码技术">数字压缩编码技术</a><br /><small> 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-3/" title="Linux常用命令详解(3)">Linux常用命令详解(3)</a><br /><small>四 磁盘管理
1 cd 2 df 3 du 4 ls 5 mkdir 6 pwd 7 r...</small></li><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wp主题k2</title>
		<link>http://woodfeed.com/wp-k2/</link>
		<comments>http://woodfeed.com/wp-k2/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 06:26:08 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[k2]]></category>
		<category><![CDATA[wp k2]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=522</guid>
		<description><![CDATA[k2是一款功能强大且外观易于定制的主题。]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">今天 k2 更新了，有两个月没更新过了。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">K2是WordPress的一个优秀主题，它由Michael Heilemann（WordPress Default themes 的作者</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">）, Chris J Davis, Zeo, Steve Lam 和 Ben Sherratt 共同开发。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">这次有较大的更改。</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">r818</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Removed the TextMate project file.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Removed the &#8216;vader&#8217; style, which is old and rarely updated anyway.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Oh hai. First commit in ages; sorry about that. No promises though.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">r819</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Removed &#8216;widgets manager&#8217; option from the options page.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">r820</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Changed the font-family on the sidebar headlines. Always hated the Trebuchet in</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">that size.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">r821</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Updated the CSS meta info for dueling sidebars</div>
<div><a href="http://getk2.com">K2</a>是WordPress的一个优秀主题，它功能强大，且外观易于定制<span style="background-color: #ffffff;">。</span>它由<a href="http://binarybonsai.com/">Michael Heilemann</a>（WordPress Default themes 的作者<span style="background-color: #ffffff; ">）,<span style="font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, Helvetica, Arial, sans-serif; line-height: 21px; font-size: 12px; color: #444444; "> <span style="background-color: #ffffff; "> <a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2277dd; text-decoration: none; " onclick="javascript:urchinTracker('/outbound/chrisjdavis.org?ref=/');" href="http://chrisjdavis.org/">Chris J Davis</a>，<span style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; font-size: 13px; "><span style="font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, Helvetica, Arial, sans-serif; line-height: 21px; font-size: 12px; color: #444444; "> <a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2277dd; text-decoration: none; " onclick="javascript:urchinTracker('/outbound/zeo.unic.net.my/?ref=/');" href="http://zeo.unic.net.my/">Zeo</a>， <a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2277dd; text-decoration: none; " onclick="javascript:urchinTracker('/outbound/stevelam.org/?ref=/');" href="http://stevelam.org/">Steve Lam</a> 和 <a style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #2277dd; text-decoration: none; " onclick="javascript:urchinTracker('/outbound/nybblelabs.org.uk?ref=/');" href="http://nybblelabs.org.uk/">Ben Sherratt</a> </span>共同开发。</span></span></span></span></div>
<div><strong>特色：</strong></div>
<div>
<div>Ajax翻页和搜索，动态的边栏（不同页面显示不同边框），支持评论嵌套和分页，支持单栏/双栏/三栏/自适应这<span style="background-color: #ffffff;">，存档页面。</span></div>
<div><span style="background-color: #ffffff;"><br />
</span></div>
</div>
<div><span style="font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Tahoma, Arial; color: #444444; font-size: medium;"><span style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; background-color: #ffffff;">今天 k2 更新了，有两个月没更新过了。</span></span></div>
<div>这次有较大的更改。</div>
<div>r818</div>
<div>Removed the TextMate project file.</div>
<div>Removed the &#8216;vader&#8217; style, which is old and rarely updated anyway.</div>
<div>Oh hai. First commit in ages; sorry about that. No promises though.</div>
<div>r819</div>
<div>Removed &#8216;widgets manager&#8217; option from the options page.</div>
<div>r820</div>
<div>Changed the font-family on the sidebar headlines. Always hated the Trebuchet in <span style="background-color: #ffffff; ">that size.</span></div>
<div>r821</div>
<div>Updated the CSS meta info for dueling sidebars.</div>
<div style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/12/k2.jpg" rel="lightbox[522]"><img class="size-full wp-image-527 alignnone" title="k2" src="http://woodfeed.com/wp-content/uploads/2009/12/k2.jpg" alt="k2" width="300" height="225" /></a></div>
<div style="text-align: center; "><a href="http://getk2.com/nightly/" target="_blank">下载</a> | <span style="background-color: #ffffff; "><a href="http://getk2.com/" target="_blank">demo</a></span></div>
<div><span style="background-color: #ffffff; "><br />
</span></div>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/photoshop-box/" title="PhotoShop作业&#8211;盒子">PhotoShop作业&#8211;盒子</a><br /><small>
 
去年做的一个作业，ps的处女作。...</small></li><li><a href="http://woodfeed.com/simple-smar-electric-ehicles/" title="简单智能电动车">简单智能电动车</a><br /><small>本简易智能电动车跷跷板分为电动车智能行驶和跷跷板两个主要部分，都以单片机为控制核心，根据...</small></li><li><a href="http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/" title="uIP TCP/IP协议栈在51系列单片机上的应用">uIP TCP/IP协议栈在51系列单片机上的应用</a><br /><small>　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...</small></li><li><a href="http://woodfeed.com/robot-control-of-linear-maze/" title="浅谈机器人在线迷宫中的控制策略问题">浅谈机器人在线迷宫中的控制策略问题</a><br /><small>循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理...</small></li><li><a href="http://woodfeed.com/yigeshidaidejieshu/" title="迈克尔-杰克逊逝世 一个时代的结束">迈克尔-杰克逊逝世 一个时代的结束</a><br /><small>“据2006年底统计，其正版专辑全球销量已超过7.5亿，被载入“吉尼斯世界记录大全”。他...</small></li><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li><li><a href="http://woodfeed.com/dc-motor-drive-module/" title="直流电机驱动">直流电机驱动</a><br /><small>两者直流电机驱动方式：
1）L298集成驱动芯片电路
2）采用晶体管作开关控制H桥的正反...</small></li><li><a href="http://woodfeed.com/autotools-generated-makefile/" title="利用autotools生成Makefile">利用autotools生成Makefile</a><br /><small>对于一个较大的项目而言，完全手动建立Makefile是一件费力而又容易出错的工作。aut...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-2/" title="Linux常用命令详解(2)">Linux常用命令详解(2)</a><br /><small>三 文件管理
1.Diff  2. find  3. ln  4.locate  5. ...</small></li><li><a href="http://woodfeed.com/create-multiple-wp-blog-by-one-wp-code/" title="一个WordPress建立多个独立WP博客">一个WordPress建立多个独立WP博客</a><br /><small>共用一个WordPress
可以共用同一个数据库...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/wp-k2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>uIP移植</title>
		<link>http://woodfeed.com/uip-transplantation/</link>
		<comments>http://woodfeed.com/uip-transplantation/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 03:04:30 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[TCP/IP]]></category>
		<category><![CDATA[uIP]]></category>
		<category><![CDATA[uIP移植]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=469</guid>
		<description><![CDATA[uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是uip_input()。当设备驱动程序从网络层收到一个数据包时要调用这个函数，设备驱动程序必须事先将数据包存放到uip_buf[]中，包长放到uip_len，然后交由uip_input()处理。当函数返回时，如果uip_len不为0，则表明有带外数据(如SYN，ACK等)要发送。当需要ARP支持时，还需要考虑更新ARP表或发出ARP请求和回应。另一个需要驱动程序支持的函数是uip_periodic(conn)。这个函数用于uIP内核对各连接的定时轮循，因此需要一个硬件支持的定时程序周期性地用它轮循各连接，一般用于检查主机是否有数据要发送，如有，则构造IP包。uIP的应用程序接口。为了将用户的应用程序挂接到uIP中，必须将宏UIP_APPCALL()定义成实际的应用程序函数名， 这样每当某个uIP事件发生时，内核就会调用该应用程序进行处理。如果要加入应用程序状态的话，必须将宏UIP_APPSTATE_SIZE定义成应用程序状态结构体的长度。在应用程序函数中，依靠uIP事件检测函数来决定处理的方法，另外可以通过判断当前连接的端口号来区分处理不同的连接。]]></description>
			<content:encoded><![CDATA[<p>平台移植:</p>
<p><strong>uIP</strong><strong>的设备驱动程序接口</strong></p>
<p>uIP内核中有两个函数直接需要底层设备驱动程序的支持。</p>
<p>一是uip_input()。当设备驱动程序从网络层收到一个数据包时要调用这个函数，设备驱动程序必须事先将数据包存放到uip_buf[]中，包长放到uip_len，然后交由uip_input()处理。当函数返回时，如果uip_len不为0，则表明有带外<span style="text-decoration: underline;">数据</span>(如SYN，ACK等)要发送。当需要ARP支持时，还需要考虑更新ARP表或发出ARP请求和回应。</p>
<p>另一个需要驱动程序支持的函数是uip_periodic(conn)。这个函数用于uIP内核对各连接的定时轮循，因此需要一个硬件支持的定时程序周期性地用它轮循各连接，一般用于检查主机是否有数据要发送，如有，则构造IP包。</p>
<p><strong> uIP</strong><strong>的<span style="text-decoration: underline;">应用</span>程序接口</strong></p>
<p>为了将用户的应用程序挂接到uIP中，必须将宏UIP_APPCALL()定义成实际的应用程序函数名， 这样每当某个uIP事件发生时，内核就会调用该应用程序进行处理。如果要加入应用程序状态的话，必须将宏UIP_APPSTATE_SIZE定义成应用程序状态结构体的长度。在应用程序函数中，依靠uIP事件检测函数来决定处理的方法，另外可以通过判断当前连接的端口号来区分处理不同的连接。</p>
<p>详细请看<a title="源码公开的TCP/IP协议栈uIP的应用" href="http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/">源码公开的TCP/IP协议栈uIP的应用</a></p>
<p>快速向导: 移植uIP到其它的平台</p>
<p>实际的TCP/IP代码无需任何修改, 但是目标网络设备的驱动程序(以太网控制器/串<br />
口/其它)和实际的系统集成部分(比如, 主控制循环, 当数据到达或定期时钟超时需调用uI<br />
P函数)需要重写.</p>
<p>移植步骤:</p>
<p>1. 阅读提供的文档.</p>
<p>2. 在uip-1.0/目录下为你的端口创建新的目录(选择一个简短的CPU架构名称, 比如<br />
i386,用于C编译器).</p>
<p>3. 从unix/子目录拷贝uip_arch.c文件到新创建的目录. ls包含了一个普通的C校验<br />
算法实现, 是一个32位的函数).</p>
<p>4. 从unix/子目录拷贝uipopt.h文件.</p>
<p>5. 根据你的项目编辑uipopt.h文件(文件是自描述型的).</p>
<p>6. 为你的硬件写设备驱动.(这大概是最难的部分.) 查阅unix/tapdev.c和uip/sli<br />
pdev.c实例了解设备驱动如何实现.</p>
<p>7. 写好主控制循环, 然后调用uIP函数. 查阅unix/main.c实例了解主控制循环如何<br />
实现.通过unix/main.c主循环实例了解如何使用ARP协议.</p>
<p>8. 写makefile文件, 然后编译代码. 确认你的项目(在你子目录中的.c文件)包含了../uip/uip.c文件. 如果你正使用web服务器程序, 请记住包含文件../apps/httpd/httpd.c ../apps/httpd/cgi.c ../apps/httpd/fs.c. 如果需支持<br />
ARP, 请包含文件 ../uip/uip_arp.c.</p>
<p>9. 发现和纠正所有的程序错误. (这是平台移植中最需技巧的部分:)</p>
<p>Uip 源代码介绍</p>
<p>1.文件关系</p>
<p>弄清楚源代码之间的联系和各个主要函数的功能,移植就不困难了。</p>
<p>Apps  à  这是作者写的一些应用代码。包括Http、Smtp、Telnet和Webclient等等。</p>
<p>Uip   à  这是uip的核心代码。</p>
<p>Unix  à  这是作者在unix系统下的一个工程。</p>
<p>Doc   à  这是说明文档。</p>
<p>重点说说Uip和Unix这两个文件夹中比较重要的函数。</p>
<p>Ｕip:</p>
<p>Uip.c ：</p>
<p>uip_process(　)　 完成对ip，udp，tcp的数据的解析。</p>
<p>uip_udp_new（） 建立一个udp。</p>
<p>uip_listen（）    监听一个端口。</p>
<p>uip_connect（）  准备建立一个tcp连接，发送同步信号。</p>
<p>Uip_arp.c</p>
<p>uip_arp_update（）更新arp列表。</p>
<p>uip_arp_init（）   初始化arp缓冲块</p>
<p>uip_arp_out（）   发送一个arp请求</p>
<p>uip_arp_arpin（）  处理收到一个arp包</p>
<p>uip_arp_ipin（）   处理收到是arp包的ip包。</p>
<p>Slipdev.c        是关于SLIP 协议的文件</p>
<p>Unix：</p>
<p>Main.c              uip服务的主循环。</p>
<p>Tapdev.c 和 tapdev.h  是低层数据的接收与发送。</p>
<p>Uip_arch.c                   一些计算校验和的函数。</p>
<p>Uipopt.h                这是一个uip的配置文件。你可以修改IP，NETMASK，GATEWAY，MAC等等以便符合你的网络。</p>
<p>2，移植细节</p>
<p>在你的工程中，你需要包含如下文件：</p>
<p>Uip.c</p>
<p>Uip_arch.c</p>
<p>Uip_arp.c</p>
<p>Tapdev.c</p>
<p>Main.c</p>
<p>A, 网卡驱动移植</p>
<p>Tapdev.c 包含3个函数:</p>
<p>a&gt;  tapdev_init(void)                   网卡初始化.</p>
<p>b&gt;  unsigned int  tapdev_read(void)  接收网卡数据</p>
<p>c&gt; void tapdev_send(void)           发送网卡数据</p>
<p>这3个函数与低层硬件有关.大家只需按照上述函数的接口,完成低层数据的收发便可.</p>
<p>B, UDP的移植</p>
<p>a&gt;    uipopt.h 中修改</p>
<p>#define UIP_UDP                       1</p>
<p>#define UIP_UDP_CONNS    10（同时可建立udp的连接数）</p>
<p>#define UIP_UDP_APPCALL  udp_appcall （UDP的用户接口函数）</p>
<p>添加 #include</p>
<p>b&gt;    新建udp.c 和udp.h 两个文件</p>
<p>udp.c中定义两个函数</p>
<p>udpinit(void)</p>
<p>{</p>
<p>uip_ipaddr(ipaddr, RIPADDR0, RIPADDR1, RIPADDR2, RIPADDR3);</p>
<p>uip_udp_new(ipaddr, UDP_LPORT, UDP_RPORT);                                                           //建立一个udp,指定udp端口。</p>
<p>//注意：我对uip_udp_new（）函数做了修改，原来本地端口是随机的，我改为了可以配置的。</p>
<p>}</p>
<p>//当UDP数据被tapdev_read （）收到，uip_process()函数对UDP进行解析，如果正确，则调用udp_appcall（）来交给用户处理。此时，用户可以用uip_newdata()检测是否有新数据，新数据放在uip_appdata指针中，长度为uip_len。</p>
<p>//当定时轮询到达，后也会调用udp_appcall（），可以用uip_poll()检查。此时，用户可以主动发送数据。只须将数据放入指针uip_appdata后的空间中，并将数据长度传给uip_slen便可。</p>
<p>下面给出了函数的模型（仅供参考）：</p>
<p>void udp_appcall(void)</p>
<p>{</p>
<p>if(uip_udp_conn-&gt;rport == HTONS(UDP_RPORT))</p>
<p>{</p>
<p>if(uip_poll())</p>
<p>{</p>
<p>/*</p>
<p>for(u16_t i=0; i&lt;1000; i++)</p>
<p>{</p>
<p>*(uip_appdata++) = (u8_t)i;</p>
<p>}</p>
<p>*uip_appdata = &#8216;\0&#8242;;</p>
<p>uip_slen = 1000;      //strlen((char*)uip_appdata);*/</p>
<p>}</p>
<p>if(uip_newdata())</p>
<p>{</p>
<p>uip_appdata[uip_len]=&#8217;\0&#8242;;</p>
<p>uip_slen = uip_len;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p><strong> </strong><span style="background-color: #ffffff;"><strong>uIP0.9 keil移植要点</strong></span></p>
<p>1. 打开Keil新建项目uIP0.9.uv2, 设置项目属性.<br />
memory_model 设置为large 模式,这样默认的存储方式是xdata<br />
因为uIP0.9编译后占用20K rom, 所以必须选一个32K(&gt;20K)的rom的单片机,<br />
比如Device可设置为SST89&#215;58或者SST89&#215;516xx,<br />
解压缩官方下载的uIP0.9压缩包，添加文件至项目,<br />
需添加至项目的文件有：uip\uip.c, uip.c\uip.h, uip.c\uip_arch.h,<br />
uip.c\uip_arp.c,uip.c\uip_arp.h<br />
unix\main.c, unix\uip_arch.c, unix\uipopt.h,<br />
apps\httpd\所有文件</p>
<p>2. 因为data是系统关键字, 所以标识符data =&gt; dat<br />
以下文件需要改动:   fs.h, fsdata.h,httpd.c</p>
<p>3. 为RTL8019AS 编写驱动程序(具体如何操作寄存器老古的网站有详细的教程),<br />
内容在压缩包中的RTL8019AS.c, RTL8019AS.h<br />
需要更改main.h中的如下地方：<br />
include &#8220;tapdev.h&#8221; =&gt; #include &#8220;rtl8019as.h&#8221;<br />
tapdev_init() -&gt; rtl8019as_init()<br />
tapdev_send() -&gt; rtl8019as_send()<br />
tapdev_read() -&gt; rtl8019as_read()</p>
<p>4. fsdata.c 首行添加 #include &#8220;fsdata.h&#8221;<br />
关键字替换:<br />
static const char -&gt; const char code<br />
const struct fsdata_file -&gt; const struct fsdata_file code</p>
<p>fsdata.h 文件末尾添加：<br />
#define FS_ROOT file_tcp_header_html<br />
#define FS_NUMFILES 14</p>
<p>const char code data_cgi_files[];<br />
const char code data_cgi_stats[];<br />
const char code data_cgi_tcp[];<br />
const char code data_img_bg_png[];<br />
const char code data_about_html[];<br />
const char code data_control_html[];<br />
const char code data_404_html[];<br />
const char code data_files_footer_plain[];<br />
const char code data_files_header_html[];<br />
const char code data_index_html[];<br />
const char code data_stats_footer_plain[];<br />
const char code data_stats_header_html[];<br />
const char code data_tcp_footer_plain[];<br />
const char code data_tcp_header_html[];<br />
const struct fsdata_file code file_cgi_files[];<br />
const struct fsdata_file code file_cgi_stats[];<br />
const struct fsdata_file code file_cgi_tcp[];<br />
const struct fsdata_file code file_img_bg_png[];<br />
const struct fsdata_file code file_about_html[];<br />
const struct fsdata_file code file_control_html[];<br />
const struct fsdata_file code file_404_html[];<br />
const struct fsdata_file code file_files_footer_plain[];<br />
const struct fsdata_file code file_files_header_html[];<br />
const struct fsdata_file code file_index_html[];<br />
const struct fsdata_file code file_stats_footer_plain[];<br />
const struct fsdata_file code file_stats_header_html[];<br />
const struct fsdata_file code file_tcp_footer_plain[];<br />
const struct fsdata_file code file_tcp_header_html[];</p>
<p>5. fs.c 第55行删除: #include &#8220;fsdata.c&#8221;</p>
<p>6. uipopt.h<br />
181行: #define UIP_FIXEDETHADDR 0 -&gt; 1<br />
299行: #define UIP_ACTIVE_OPEN 1 -&gt;0<br />
497行: #define BYTE_ORDER     LITTLE_ENDIAN -&gt; BIG_ENDIAN<br />
280行: #define UIP_UDP_APPCALL  udp_appcall -&gt; httpd_appcall</p>
<p>文件末尾添加:<br />
#ifndef NULL<br />
#define NULL (void *)0<br />
#endif /* NULL */</p>
<p>7. httpd.c<br />
删除以下内容:<br />
extern const struct fsdata_file file_index_html;<br />
extern const struct fsdata_file file_404_html;<br />
220行更改：<br />
fs_open(file_index_html.name, &amp;fsfile);    =&gt;   file_index_html-&gt;name<br />
224行同上更改</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/uip-uipopt-h-configuration-2/" title="uIP &#8211; uipopt.h配置">uIP &#8211; uipopt.h配置</a><br /><small>使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译...</small></li><li><a href="http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/" title="源码公开的TCP/IP协议栈uIP的应用">源码公开的TCP/IP协议栈uIP的应用</a><br /><small>摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/uip-transplantation/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>源码公开的TCP/IP协议栈uIP的应用</title>
		<link>http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/</link>
		<comments>http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 07:28:41 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[TCP/IP]]></category>
		<category><![CDATA[TCP/IP协议栈]]></category>
		<category><![CDATA[uIP]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=462</guid>
		<description><![CDATA[摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监测系统中的应用。重点阐述uIP的功能特性、体系结构和相关接口，并详细介绍如何在该协议栈上实现一个嵌入式Web服务器。目前uIP已成功地移植到51单片机上。
关键词：TCP/IP协议栈 uIP 嵌入式Web服务器 远程监测]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong>源码公开的TCP/IP协议栈在远程监测中的应用</strong></p>
<p style="text-align: left;"><span style="background-color: #ffffff;">摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监测系统中的应用。重点阐述uIP的功能特性、体系结构和相关接口，并详细介绍如何在该协议栈上实现一个嵌入式Web服务器。目前uIP已成功地移植到51单片机上。</span></p>
<p align="left">关键词：TCP/IP协议栈 uIP 嵌入式Web服务器 远程监测</p>
<p align="left"><strong> 引</strong><strong> </strong><strong>言：</strong></p>
<p align="left">目前，随着互联网的发展，越来越多的工业测控设备已经将网络接入功能作为其默认配置，以实现设备的远程监控和信息分布式处理。笔者曾参与某发电机射频监测仪的开发，该设备主要用于诊断和预警发电机早期故障，并通过RS232接口定时输出电平和状态<span style="text-decoration: underline;">数据</span>，现场专门设一台PC作接收、显示及存储。每年都要有专家到各发电厂对以往数据作检查和诊断，不胜其烦。因此有必要设计一个RS232到Internet的数据传输模块，以便对发电机的运行状况作远程监测。设计该模块的关键在于如何实现一个嵌入式TCP/IP协议栈，根据以往的经验，自己设计一个协议栈的难度很可能超过应用本身控制工程网版权所有，而采用商业的协议栈似乎又无必要(功能过于复杂)，最后笔者选用一种功能简易的免费TCP/IP协议栈uIP 0. 9作为设计核心。</p>
<p align="left"><strong>1 </strong><strong>嵌入式</strong><strong>TCP/IP</strong><strong>协议栈</strong></p>
<p align="left">目前，市面上几乎所有的嵌入式TCP/IP协议栈都是根据BSD版的TCP/IP协议栈改写的。在商业嵌入式TCP/IP协议栈大都相当昂贵的情况下，很多人转而使用一些源代码公开的免费协议栈，并加以改造应用。目前较为著名的免费协议栈有：</p>
<p align="left">lwIP(Light weight TCP/IP Stack)——支持的协议比较完整，一般需要多任务环境支持，代码占用ROM&gt;40KB，不适合8位机系统，没有完整的应用文档；</p>
<p align="left">uC/IP (TCP/IP stack for uC/OS)——基于uC/OS的任务管理，接口较复杂，没有说明文档。</p>
<p align="left">笔者采用的协议栈系瑞典计算机科学研究所Adam Dunkels开发的uIP0.9 。其功能特性总结如下：<br />
◇完整的说明文档和公开的源代码(全部用C语言编写，并附有详细注释)；<br />
◇极少的代码占用量和RAM资源要求，尤其适用于8/16位单片机(见表1)；<br />
◇高度可配置性，以适应不同资源条件和应用场合；<br />
◇支持ARP、IP、ICMP、TCP、UDP(可选)等必要的功能特性；<br />
◇支持多个主动连接和被动连接并发，支持连接的动态分配和释放；<br />
◇简易的应用层接口和设备驱动层接口；<br />
◇完善的示例程序和应用协议实现范例。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/11/t001.jpg" rel="lightbox[462]"><img class="aligncenter size-full wp-image-463" title="t001" src="http://woodfeed.com/wp-content/uploads/2009/11/t001.jpg" alt="t001" width="262" height="127" /></a></p>
<p align="left">正是由于uIP所具有的显著特点，自从0.6版本以来就被移植到多种处理器上，包括MSP430、AVR和Z80等。笔者使用的uIP0.9是2003年11月发布的版本。目前，笔者已将它成功移植到MCS-51 上了。</p>
<p align="left"><strong> </strong><strong>2 uIP0.9</strong><strong>的体系结构</strong></p>
<p align="left">uIP0.9是一个适用于8/16位机上的小型嵌入式TCP/IP协议栈，简单易用，资源占用少是它的设计特点。它去掉了许多全功能协议栈中不常用的功能，而保留网络通信所必要的协议机制。 其设计重点放在IP、ICMP和TCP协议的实现上，将这三个模块合为一个有机的整体，而将UDP和ARP协议实现作为可选模块。uIP0.9的体系结构如图1所示。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/11/image001.jpg" rel="lightbox[462]"><img class="aligncenter size-full wp-image-464" title="image001" src="http://woodfeed.com/wp-content/uploads/2009/11/image001.jpg" alt="image001" width="262" height="184" /></a></p>
<p align="left">uIP0.9处于网络通信的中间层，其上层协议在这里被称之为应用程序，而下层硬件或固件被称之为网络设备驱动。显然，uIP0.9并不是仅仅针对以太网设计的，它具有媒体无关性。</p>
<p align="left">为了节省资源占用， 简化应用接口， uIP0.9在内部实现上作了特殊的处理。<br />
① 注意各模块的融合，减少处理函数的个数和调用次数，提高代码复用率，以减少ROM占用。<br />
② 基于单一全局数组的收发数据缓冲区，不支持内存动态分配， 由应用负责处理收发的数据。<br />
③ 基于事件驱动的应用程序接口，各并发连接采用轮循处理，仅当网络事件发生时，由uIP内核唤起应用程序处理。这样，uIP用户只须关注特定应用就可以了。传统的TCP/IP实现一般要基于多任务处理环境，而大多数8位机系统不具备这个条件。<br />
④ 应用程序主动参与部分协议栈功能的实现(如TCP的重发机制，数据包分段和流量控制)，由uIP内核设置重发事件，应用程序重新生成数据提交发送，免去了大量内部缓存的占用。基于事件驱动的应用接口使得这些实现较为简单。</p>
<p align="left"><strong> </strong><strong>3 uIP</strong><strong>的设备驱动程序接口</strong></p>
<p align="left">uIP内核中有两个函数直接需要底层设备驱动程序的支持。</p>
<p align="left">一是uip_input()。当设备驱动程序从网络层收到一个数据包时要调用这个函数，设备驱动程序必须事先将数据包存放到uip_buf[]中，包长放到uip_len，然后交由uip_input(<span style="background-color: #ffffff;">)处理。当函数返回时，如果uip_len不为0，则表明有带外<span style="text-decoration: underline;">数据</span>(如SYN，ACK等)要发送。当需要ARP支持时，还需要考虑更新ARP表或发出ARP请求和回应，示例如下。</span></p>
<p align="left">#define BUF ((struct uip_eth_hdr *)&amp;uip_buf[0])<br />
uip_len = ethernet_devicedriver_poll(); //接收以太网数据包<br />
//(设备驱动<span style="text-decoration: underline;">程序</span>)<br />
if(uip_len&gt;0){ //收到数据<br />
if(BUF-&gt;type = = HTONS(UIP_ETHTYPE_IP)) { //是IP包吗？<br />
uip_arp_ipin(); //去除以太网头结<br />
//构，更新ARP表<br />
uip_input(); //IP包处理<br />
if(uip_len&gt;0){ //有带外回应数据<br />
uip_arp_out(); //加以太网头结构，在主动连接时可能要<br />
//构造ARP请求<br />
ethernet_devicedriver_send(); //发送数据到以太网<br />
//(设备驱动程序)<br />
}<br />
}else if (BUF-&gt;type = = HTONS(UIP_ETHTYPE_ARP)) {<br />
//是ARP请求包<br />
uip_arp_arpin(); //如是是ARP回应，更新ARP表；如果是<br />
//请求，构造回应数据包<br />
if(uip_len&gt;0) { //是ARP请求，要发送回应<br />
ethernet_devicedriver_send(); //发ARP回应到以太网上<br />
}<br />
}<br />
另一个需要驱动程序支持的函数是uip_periodic(conn)。这个函数用于uIP内核对各连接的定时轮循，因此需要一个硬件支持的定时程序周期性地用它轮循各连接，一般用于检查主机是否有数据要发送，如有，则构造IP包。使用示例如下。<br />
for(i=0 ; i<br />
uip_periodic(i);<br />
if(uip_len &gt; 0){<br />
uip_arp_out();<br />
ethernet_devicedriver_send();<br />
}<br />
}</p>
<p align="left">从本质上来说， uip_input()和uip_periodic()在内部是一个函数，即uip_process (u8t flag)， UIP的设计者将uip_process(UIP_DATA)定义成uip_input()，而将uip_process(UIP_TIMER)定义成uip_periodic()，因此从代码实现上来说是完全复用的。</p>
<p align="left"><strong> </strong><strong>4 uIP</strong><strong>的</strong><strong><span style="text-decoration: underline;">应用</span></strong><strong>程序接口</strong></p>
<p align="left">为了将用户的应用程序挂接到uIP中，必须将宏UIP_APPCALL()定义成实际的应用程序函数名， 这样每当某个uIP事件发生时，内核就会调用该应用程序进行处理。如果要加入应用程序状态的话，必须将宏UIP_APPSTATE_SIZE定义成应用程序状态结构体的长度。在应用程序函数中，依靠uIP事件检测函数来决定处理的方法，另外可以通过判断当前连接的端口号来区分处理不同的连接。下面的示例程序是笔者实现的一个Web服务器应用的框架。</p>
<p align="left">#define UIP_APPCALL uip51_appcall<br />
#define UIP_APPSTATE_SIZE sizeof(struct uip51app_state)<br />
struct uip51app_state{<br />
unsigned char *dataptr;<br />
unsigned int dataleft;};</p>
<p align="left">void uip51_initapp{ //设置主机地址<br />
u16_t ipaddr[2];<br />
uip_ipaddr(ipaddr， 202 ，120，127，192 );<br />
uip_sethostaddr(ipaddr);<br />
uip_listen(HTTP_PORT); //HTTP WEB PORT(80);<br />
}</p>
<p align="left">
<p align="left">void uip51_appcall(void){<br />
struct uip51app_state *s;<br />
s = (struct uip51app_state *)uip_conn-&gt;appstate;<br />
//获取当前连接状态指针<br />
if(uip_connected()) {<br />
… //有一个客户机连上}<br />
if(uip_newdata()||uip_rexmit()) { //收到新数据或需要重发<br />
if(uip_datalen()&gt;0){<br />
if(uip_conn-&gt;lport = = 80) { //收到GET HTTP请求<br />
update_table_data(); //根据电平状态数据表动态<br />
//生成网页<br />
s-&gt;dataptr=newpage;<br />
s-&gt;dataleft=2653;<br />
uip_send(s-&gt;dataptr，s-&gt;dataleft);<br />
//发送长度为2653 B的网页<br />
}<br />
}<br />
}<br />
if(uip_acked()) {</p>
<p align="left">//收到客户机的ACK<br />
if(s-&gt;dataleft&gt;uip_mss()&amp;&amp;uip_conn-&gt;lport = = 80){<br />
//发送长度&gt;最大段长时<br />
s-&gt;dataptr+=uip_conn-&gt;len; //继续发送剩下的<span style="text-decoration: underline;">数据</span><br />
s-&gt;dataleft-=uip_conn-&gt;len;<br />
uip_send(s-&gt;dataptr，s-&gt;dataleft);<br />
}<br />
return;<br />
}<br />
if(uip_poll())<br />
{ … //将串口缓存的数据复制到<br />
//电平状态数据表<br />
return;<br />
}<br />
if(uip_timedout()|| //重发确认超时<br />
uip_closed()|| //客户机关闭了连接<br />
uip_aborted()){ //客户机中断连接<br />
return; }<br />
}</p>
<p align="left"><strong> </strong><strong>5 uIP0.9</strong><strong>在发电机</strong><strong><span style="text-decoration: underline;">远程监测</span></strong><strong>系统中的</strong><strong><span style="text-decoration: underline;">应用</span></strong></p>
<p align="left">笔者设计了一个嵌入式Web模块UIPWEB51，用于将发电机射频监测仪串口输出的数据上网，以实现对发电机工作状态的远程监测，目前已取得初步成功。该模块的硬件框图如图2所示。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/11/image002.jpg" rel="lightbox[462]"><img class="aligncenter size-medium wp-image-465" title="image002" src="http://woodfeed.com/wp-content/uploads/2009/11/image002-300x137.jpg" alt="image002" width="300" height="137" /></a></p>
<p align="left">单片机采用的是Atmel的AT89C55WD，它内置20KB <span style="text-decoration: underline;">程序</span>Flash，512字节RAM，3个定时器/计数器，工作在22.1184MHz时具有约2MIPS的处理速度。 网卡芯片同样采用的是低成本的RTL8019AS， 是一款NE2000兼容的网卡芯片。系统外扩了32KB的SRAM，用于串口数据和网络数据的缓冲，另外还存放了uIP的许多全局变量。</p>
<p align="left">UIPWEB51的主程序采用中断加轮循的方式，用中断触发的方式接收发电机射频监测仪发出的数据，并设置了一个接收队列暂存这些数据。在程序中轮循有无网络数据包输入，如有则调用uIP的相关处理函数(如上uip_input()使用示例)；如无则检测定时轮循中断是否发生。这里将T2设为uIP的定时轮循计数器， 在T2中断中设置轮循标志，一旦主程序检测到这一标志就调用uip_periodic()轮循各连接(如上uip_periodic()使用示例)。</p>
<p align="left">UIPWeb51的应用程序(如uIP的应用程序接口示例)，这个Web服务器首先打开80端口的监听，一旦有客户机要求连上，uIP内部会给它分配一个连接项， 接着等收到客户机IE浏览器发出的“GET HTTP…”请求后， 将发电机电平与状态数据队列中的数据填入网页模板，生成一幅新的网页发给客户机。因为这幅网页的大小已经超过uIP的最大段长(MSS)， 因此在uIP内核第一次实际只发出了MSS个字节， 在等到下一次轮循到该连接并且收到上次数据包的ACK时，发送剩下的网页数据。在连接处于空闲的时候(uip_poll())，应用程序可以从串口队列中读出原始数据，经格式处理后再存到发电机电平与状态数据队列中，而在这个队列中保存着当前1min的设备工作数据，以便下次更新网页时使用。在网页中添加了更新按钮控制工程网版权所有，一旦浏览器用户点击了按钮， 浏览器会自动发出CGI请求， UIPWEB51收到后，立即发送包含最新数据的网页。如果uIP接收ACK超时，它会自动设置重发标志，应用程序中可以用uip_rexmit()来检测这个标志，重新生成网页并发送。一旦用户关闭了浏览器，uIP也会自动检测到这一事件(应用程序中可以用uip_closed()来检测)，并且释放掉这个连接项。<br />
图3是UIPWEB51的总体程序结构图。</p>
<p align="center"><a href="http://woodfeed.com/wp-content/uploads/2009/11/image003.jpg" rel="lightbox[462]"><img class="aligncenter size-full wp-image-466" title="image003" src="http://woodfeed.com/wp-content/uploads/2009/11/image003.jpg" alt="image003" width="306" height="339" /></a></p>
<p align="left"><strong> </strong><strong>6 </strong><strong>测试结果</strong></p>
<p align="left">将uIP0.9配置成允许4个并发连接，1个监听端口， 10个ARP表项，去掉UDP支持，UIP_BUFSIZE=1500和其它优化选项。用KEIL C编译，整个uIP0.9内核模块代码量小于8KB(含Web应用程序)，内核对RAM的占用小于2KB(不含网页)。整个系统程序的代码量小于12KB，占用的RAM小于10KB。另外控制工程网版权所有，在公网上测试了该模块的传输速度，大于20Kbps，对于此项应用已达到要求。目前，该模块正准备应用于新一代的发电机射频监测系统中。</p>
<p align="left">参考文献<br />
1 RTL8019AS Realtek Full-Duplex Ethernet Controller with Plug and Play Function Specification， 2002<br />
2 ATMEL AT89C55WD datasheet， 2001<br />
3 Adam Dunkels . uIP 0.9 reference manual, 2003<br />
4 Adam Dunkels. uIP &#8211; A free Small TCP/IP Stack, 2002<br />
5 Douglas E.Comer. 用TCP/IP进行网际互联(卷1). 林瑶等译. 北京：电子工业出版社， 2001<br />
6 王罡，林立志编著. 基于Windows的TCP/IP编程. 北京: 清华大学出版社, 2000</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/uip-uipopt-h-configuration-2/" title="uIP &#8211; uipopt.h配置">uIP &#8211; uipopt.h配置</a><br /><small>使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译...</small></li><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>数字压缩编码技术</title>
		<link>http://woodfeed.com/digital-compression-coding-techniques/</link>
		<comments>http://woodfeed.com/digital-compression-coding-techniques/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:25:28 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[电子设计]]></category>
		<category><![CDATA[MPEG]]></category>
		<category><![CDATA[图像压缩]]></category>
		<category><![CDATA[数字压缩]]></category>
		<category><![CDATA[霍夫曼编码]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=455</guid>
		<description><![CDATA[ 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字化后，其数码率将高达167Mbps，对储存器容量要求很大，占有的带宽将达80MHz左右，这 样将使数字信号失去实用价值。数字压缩技术很好地解决了上述困难，压缩后信号所占用的频带大大低于原模拟信号的频带。因此说，数字压缩编码技术是使数字信号走向实用化的关键技术之一。]]></description>
			<content:encoded><![CDATA[<p align="center"><strong>1 </strong><strong>数字压缩的必要性</strong></p>
<p align="left"> 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字化后，其数码率将高达167Mbps，对储存器容量要求很大，占有的带宽将达80MHz左右，这 样将使数字信号失去实用价值。数字压缩技术很好地解决了上述困难，压缩后信号所占用的频带大大低于原模拟信号的频带。因此说，数字压缩编码技术是使数字信号走向实用化的关键技术之一，表4－1列出了各种应用的码率。<br />
　</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td colspan="8">
<p align="center">表4－1 各种应用的码率</p>
</td>
</tr>
<tr>
<td width="10%">
<p align="center">应用种类</p>
</td>
<td width="14%">
<p align="center">比特数/象素</p>
</td>
<td width="11%">
<p align="center">象素数/行</p>
</td>
<td width="9%">
<p align="center">行数/帧</p>
</td>
<td width="10%">
<p align="center">帧数/秒</p>
</td>
<td width="10%">
<p align="center">亮色比</p>
</td>
<td width="17%">
<p align="center">比特/秒(压缩前)</p>
</td>
<td width="19%">
<p align="center">比特/秒(压缩后)</p>
</td>
</tr>
<tr>
<td width="10%">
<p align="center">HDTV</p>
</td>
<td width="14%">
<p align="center">8</p>
</td>
<td width="11%">
<p align="center">1920</p>
</td>
<td width="9%">
<p align="center">1080</p>
</td>
<td width="10%">
<p align="center">30</p>
</td>
<td width="10%">
<p align="center">4:1:1</p>
</td>
<td width="17%">
<p align="center">1.18Gbps</p>
</td>
<td width="19%">
<p align="center">20~25Mbps</p>
</td>
</tr>
<tr>
<td width="10%">
<p align="center">普通电视CCIR601</p>
</td>
<td width="14%">
<p align="center">8</p>
</td>
<td width="11%">
<p align="center">720</p>
</td>
<td width="9%">
<p align="center">480</p>
</td>
<td width="10%">
<p align="center">30</p>
</td>
<td width="10%">
<p align="center">4:1:1</p>
</td>
<td width="17%">
<p align="center">167Mbps</p>
</td>
<td width="19%">
<p align="center">4~8Mbps</p>
</td>
</tr>
<tr>
<td width="10%">
<p align="center">会议电视CIF</p>
</td>
<td width="14%">
<p align="center">8</p>
</td>
<td width="11%">
<p align="center">352</p>
</td>
<td width="9%">
<p align="center">288</p>
</td>
<td width="10%">
<p align="center">30</p>
</td>
<td width="10%">
<p align="center">4:1:1</p>
</td>
<td width="17%">
<p align="center">36.5Mbps</p>
</td>
<td width="19%">
<p align="center">1.5~2Mbps</p>
</td>
</tr>
<tr>
<td width="10%">
<p align="center">桌上电视QCF</p>
</td>
<td width="14%">
<p align="center">8</p>
</td>
<td width="11%">
<p align="center">176</p>
</td>
<td width="9%">
<p align="center">144</p>
</td>
<td width="10%">
<p align="center">30</p>
</td>
<td width="10%">
<p align="center">4:1:1</p>
</td>
<td width="17%">
<p align="center">9.1Mbps</p>
</td>
<td width="19%">
<p align="center">128kbps</p>
</td>
</tr>
<tr>
<td width="10%">
<p align="center">电视电话</p>
</td>
<td width="14%">
<p align="center">8</p>
</td>
<td width="11%">
<p align="center">128</p>
</td>
<td width="9%">
<p align="center">112</p>
</td>
<td width="10%">
<p align="center">30</p>
</td>
<td width="10%">
<p align="center">4:1:1</p>
</td>
<td width="17%">
<p align="center">5.2Mbps</p>
</td>
<td width="19%">
<p align="center">56kbps</p>
</td>
</tr>
</tbody>
</table>
<p align="left">有线电视网中数字压缩技术主要包括用于会议电视系统的H.261压缩编码，用于计算机静止图像压缩的JPEG和用于活动图像压缩的MPEG数字压缩技术。</p>
<p align="center"><strong>2 </strong><strong>图像压缩编码的可能性</strong></p>
<p align="left"> 从信息论观点来看，图像作为一个信源，描述信源的数据 是信息量(信源熵)和信息冗余量之和。信息冗余量有许多种，如空间冗余，时间冗余，结构冗余，知识冗余，视觉冗余等，数据压缩实质上是减少这些冗余量。可见冗余量减少可以减少数据量而不减少信源的信息量。从数学上讲，图像可以看作一个多维函数，压缩描述这个函数的数据量实质是减少其相关性。另外在一些情况下，允许图像有一定的失真，而并不妨碍图像的实际应用，那么数据量压缩的可能性就更大了。</p>
<p align="center"><strong>3 </strong><strong>图像压缩编码方法的分类</strong></p>
<p align="left"> 编码压缩方法有许多种，从不同的角度出发有不同的分类方法，比如从信息论角度出发可分 为两大类：<br />
 (1)冗余度压缩方法，也称无损压缩，信息保持编码或熵编码。具体讲就是解码图像和压缩 编码前的图像严格相同，没有失真，从数学上讲是一种可逆运算。<br />
 (2)信息量压缩方法，也称有损压缩，失真度编码或熵压缩编码。也就是讲解码图像和原始图像是有差别的，允许有一定的失真。<br />
 应用在多媒体中的图像压缩编码方法，从压缩编码算法原理上可以分类为：<br />
 (1)无损压缩编码种类<br />
·哈夫曼编码<br />
 ·算术编码<br />
 ·行程编码<br />
 ·Lempel zev编码<br />
 (2)有损压缩编码种类<br />
 ·预测编码：DPCM，运动补偿<br />
 ·频率域方法：正文变换编码(如DCT)，子带编码<br />
 ·空间域方法：统计分块编码<br />
 ·模型方法：分形编码，模型基编码<br />
 ·基于重要性：滤波，子采样，比特分配，矢量量化<br />
 (3)混合编码<br />
 ·JBIG，H261，JPEG，MPEG等技术标准<br />
 衡量一个压缩编码方法优劣的重要指标是：<br />
 (1)压缩比要高，有几倍、几十倍，也有几百乃至几千倍；<br />
 (2)压缩与解压缩要快，算法要简单，硬件实现容易；<br />
 (3)解压缩的图像质量要好。<br />
 最后要说明的是选用编码方法时一定要考虑图像信源本身的统计特征；多媒体系统(硬件和 软件产品)的适应能力；应用环境以及技术标准。</p>
<p align="center"> <strong>4 压缩编码方法简介</strong></p>
<p align="left">   压缩编码的方法有几十种之多，并在编码过程中涉及较深的的数学里理论基础问题，在此仅介绍 几种常用的压缩编码方法，主要是从物理意义上作一定的解释，读者如对数据压缩专题感兴趣的话，请参看讲座结束后所附的参考资料。<br />
<strong>4.1 </strong><strong>莫尔斯码与信源编码</strong><br />
 莫尔斯码即电报码，其精华之处在于用短码来表示常出现的英文字母，用长码来表示不常出 现的字母，以减小码率。这种方法非常有效，故延用至今。电视信号经过变换后，例如经差值脉冲编码后，发现前后像素幅度差值小的概率大，而差值大的概率小，因此可用短码表示概率大的信号，而用长码来代表概率小的信号，从而达到压缩码率的目的。<br />
<strong>4.2 </strong><strong>差值脉冲编码</strong><br />
 电视图像基本上是由面积较大的像块(如蓝天、大地、服装等)组成。虽然每个像块的幅值各不相同，但像块内各样值的幅度是相近的或相同的，幅值跃变部分相应于像块的轮廓，只占整幅图像的很小一部分。帧间相同的概率就更大了，静止图像相邻帧间的相应位置的像素完全一样，这意味着前后像素之差或前后帧间相应位置像素之差为零或差值小的概率大，差值 大的概率小。这就是差值编码的基本想法，其原理框图见图4－1(a)。发端将当前样值和前一 样值相减所得差值经量化后进行传输，收端将收到的差值与前一个样值相加得到当前样值。在这个原理图中，输出的当前样值是输出的前一样值加上收到的差值，由于在当前差值中包 括当前的量化误差，而输出的前一样值又包括前一样值的量化误差，这就造成了量化误差的积累。因此实用电路为图4－1(b)。这时输入当前样值不是与输入的前一样值相减，而是与输 出的前一样值相减，因此在差值中已经包含了前一样值的量化误差的负值，在与输出的前一 个样值相加时，这部分量化误差被抵消，只剩下当前的量化误差，这就避免了量化误差的积累。<br />
　</p>
<p align="left"> </p>
<p align="left">
<strong>4.3 </strong><strong>预测编码</strong><br />
 预测编码利用像素的相关性，可进一步减小差值。<br />
 从前面的分析可以看出，如果差值编码中小幅度出现的机会增加，由于其对应的码长较短， 总数码率会进一步减小。如果能猜出下一个样值，那么差值就会是零，当然这种情况是没有意义的，因为若预先知道下一样值，就不需要进行通信了。但可以肯定，如果我们不仅利用 前后样值的相关性，同时也利用其它行、其它帧的像素的相关性，用更接近当前样值的预测值与当前样值相减，小幅度差值就会增加，总数码率就会减小，这就是预测编码的方法。预 测编码的电路与差值编码类似，或者说差值编码就是以前一样值为预测值的预测编码，又称为一维预测。如果用到以前行的像素或以前帧的像素，则称为二维或三维预测。在美国国际电话电报公司(ITT)生产的数字电视机芯片中有一个视频存储控制器芯片VMC2260就用了二维预测编码，预测器用了三个像素作为下一个像素的预测值，即预测值等于1/2前一像素加1/4 上一行相应像素再加上1/4上一行相应的前一像素。这样不仅利用了前一像素的相关性，也利用了上一行相应像素的相关性，这样做要比差值编码有更大的码率压缩。如果再用上前一 帧的像素会进一步降低数码率。但为了得到前一帧的像素必须要使用帧存储器，造价比较高。只用到帧内像素的处理称为帧编码(Intraframe Coding)，用到前后帧像素的处理称为帧 间编码(Interframe Coding)。要得到较大的码率压缩就必须使用帧间编码。JPEG是典型的帧内编码方案，而MPEG是帧间编码方法。前者大多用于静止图像处理，而后者主要用于对运 动图像的处理。  <br />
<strong>4.4 </strong><strong>哈达玛特变换</strong><br />
 这是一种有效地去除噪波的方法，噪波的存在往往容易和小幅度变化的信号相混淆，利用多帧平均的方法，对于静止图像，各帧相同，平均的结果其值不变，对于噪波，多帧平均趋于零。<br />
 但如果图像中有运动，多帧平均就会造成运动模糊，故不能简单地进行平均，需要根据运动的大小来调节反馈量，即调节平均的程度，做到运动自适应降噪。<br />
 大多数情况下是利用帧差信号来判断图像中是否有运动，如果帧差小于一定值，就可视为是因噪波引起的，可取较大的反馈量；如果帧差大于一定值，就可视为图像中有运动。<br />
 但在许多情况下，仅从幅度的大小来判断是杂波还是图像是很困难的，如移动的云，近摄的 绿草地等图像信号所得到帧差信号也很小，所以BKU-904采用二维哈达玛特变换(Hadamard Transform)来区分是噪波还是图像信号。先将输入值按4×2分成小块，分别进行实时快速哈 达玛特变换(FHT)。<br />
 图像经变换后，转换成相应成分的系数，这些系数分别代表直流分量；水平方向细节和色度 分量等；垂直方向细节；斜方向细节及色度分量等，而噪波变换后均匀散在各系数中。这样就更有效地区分出信号和噪波，从而达到更有效地进行自适应降噪的目的。  <br />
<strong>4.5 </strong><strong>离散余弦变换</strong><br />
   离散余弦变换(Discrete cosine Transform)简称DCT。任何连续的实对称函数的傅里叶变换 中只含余弦项，因此余弦变换与傅里叶变换一样有明确 的物理量意义。DCT是先将整体图像分成N×N像素块，然后对N×N像素块逐一进行DCT变换。 由于 大多数图像的高频分量较小，相应于图像高频成分的系数经常为零，加上人眼对高频成分的失真不太敏感，所以可用更粗的量化，因此传送变换系数所用的数码率要大大小于传送图像 像素所用的数码率。到达接收端后再通过反离散余弦变换回到样值，虽然会有一定的失真，但人眼是可以接受的。<br />
 N代表像素数，一般N=8，8×8的二维数据块经DCT后变成8×8个变换系数，这些系数都 有 明确的物理意义：U代表水平像素号，V代表垂直像素号。如当U=0，V=0时，F(0，0)是原 64个 样值的平均，相当于直流分量，随着U、V值增加，相应系数分别代表逐步增加的水平空间频 率分量和垂直空间频率分量的大小。<br />
<strong>4.6 </strong><strong>量化(Q)</strong><br />
 严格说DCT本身并不能进行码率压缩，因为64个样值仍然得到64个系数，如图4－2所示。这里 给出了一个8×8像块的具体例子，经DCT变换后，比特数增加了。在这个例子中样值是8比特 ，从0~225得到的即直流分量的最大值是原来256的64/8倍，即0~2047，交流分 量的范围是-1024~1023。只是在经过量化后，特别是按人眼的生理特征对低频分量和高频分 量设置不同的量化，会使大多数高频分量的系数变为零。一般说来，人眼对低频分量比较敏感，而对高频分量不太敏感。因此对低频分量采用较细的量化，而对高频分量采用较粗的量 化。<br />
　</p>
<p align="left"> </p>
<p align="left">
 所谓量化，即根据不同的要求，设置不同的量化等级，从而降低数码率。 <br />
<strong>4.7 </strong><strong>游程长度编码<br />
    </strong>读出数据和表示数据的方式也是减少码率的一个重要因素。读出的方式可以有多种选择 ，如 水平逐行读出、垂直逐列读出、之字型读出和交替读出等，其中之字型读出(Zig－Zag) 是最常用的一种。由于经DCT变换以后，系数大多数集中在左上角，即低频分量区，因此之 字型读出实际上是按二维频率的高低顺序读出系数的，这样一来就为游程长度编码(Runleng th Encoding)创造了条件。所谓游程长度编码是指一个码可同时表示码的值和前面几个零， 这样就可以把之字型读出的优点显示出来了。因为之字型读出在大多数情况下出现连零的机会比较多，尤其在最后，如果都是零，在读到最后一个数后只要给出“块结束”(EOB)码，就可以结束输出，因此节省了很多码率。<br />
 游程长度指的是由字构成的数据流中各个字符连续重复出现而形成字符串的长度。 基本的游程编码就是在数据流中直接用三个字符来给出上述三种信息，其数据结构如图4－3 所示。<br />
　</p>
<p align="left"> </p>
<p align="left">
 SC表示有一个字符串在此位置，X代表构成串的字符，CC代表串的长度。<br />
 游程编码和哈夫曼编码等属于统计编码。  <br />
<strong>4.8 </strong><strong>霍夫曼编码</strong><br />
    霍夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法，该方法完全依据字符出现概率来构造异字头的平均长度最短的码字，有时称之为最佳编码，一般就叫作Huffman编码。下面引证一个定理，该定 理保证了按字符出现概率分配码长，可使平均码长最短。<br />
 定理：在变字长编码中，如果码字长度严格按照对应符号出现的概率大小逆序排列，则其平 均码字长度为最小。<br />
 现在通过一个实例来说明上述定理的实现过程。设将信源符号按出现的概率大小顺序排列为 ： </p>
<table border="0" cellpadding="0" width="44%">
<tbody>
<tr>
<td rowspan="2" width="5%">
<p align="left">U：</p>
</td>
<td rowspan="2" width="2%">
<p align="left">(</p>
</td>
<td width="7%">
<p align="left">a1</p>
</td>
<td width="7%">
<p align="left">a2</p>
</td>
<td width="7%">
<p align="left">a3</p>
</td>
<td width="7%">
<p align="left">a4</p>
</td>
<td width="7%">
<p align="left">a5</p>
</td>
<td width="7%">
<p align="left">a6</p>
</td>
<td width="7%">
<p align="left">a7</p>
</td>
<td rowspan="2" width="44%">
<p align="left">)</p>
</td>
</tr>
<tr>
<td width="7%">
<p align="left">0.20</p>
</td>
<td width="7%">
<p align="left">0.19</p>
</td>
<td width="7%">
<p align="left">0.18</p>
</td>
<td width="7%">
<p align="left">0.17</p>
</td>
<td width="7%">
<p align="left">0.15</p>
</td>
<td width="7%">
<p align="left">0.10</p>
</td>
<td width="7%">
<p align="left">0.01</p>
</td>
</tr>
</tbody>
</table>
<p align="left"> 给概率最小的两个符号a6与a7分别指定为“1”与“0”，然后将它们的概率相加再与原来的 a1~a5组合并重新排序成新的原为：<br />
　</p>
<table border="0" cellpadding="0" width="64%">
<tbody>
<tr>
<td rowspan="2" width="9%">
<p align="left">U′：</p>
</td>
<td rowspan="2" width="4%">
<p align="left">(</p>
</td>
<td width="7%">
<p align="left">a1</p>
</td>
<td width="8%">
<p align="left">a2</p>
</td>
<td width="7%">
<p align="left">a3</p>
</td>
<td width="7%">
<p align="left">a4</p>
</td>
<td width="7%">
<p align="left">a5</p>
</td>
<td width="7%">
<p align="left">a6′</p>
</td>
<td rowspan="2" width="44%">
<p align="left">)</p>
</td>
</tr>
<tr>
<td width="7%">
<p align="left">0.20</p>
</td>
<td width="8%">
<p align="left">0.19</p>
</td>
<td width="7%">
<p align="left">0.18</p>
</td>
<td width="7%">
<p align="left">0.17</p>
</td>
<td width="7%">
<p align="left">0.15</p>
</td>
<td width="7%">
<p align="left">0.11</p>
</td>
</tr>
</tbody>
</table>
<p align="left">
 对a5与a′6分别指定“1”与“0”后，再作概率相加并重新按概率排序得<br />
U″：（0.26 0.20 0.19 0.18 0.17）…<br />
 直到最后得 U″″：（0.61 0.39）<br />
 分别给以“0”，“1”为止，如图4－4所示。}<br />
 霍夫曼编码的具体方法：先按出现的概率大小排队，把两个最小的概率相加，作为新的概率 和剩余的概率重新排队，再把最小的两个概率相加，再重新排队，直到最后变成1。每次相 加时都将“0”和“1”赋与相加的两个概率，读出时由该符号开始一直走到最后的“1”， 将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好，就是该符号的霍夫曼编码。 <br />
　</p>
<p align="left"> </p>
<p align="left">
 例如a7从左至右，由U至U″″，其码字为0000；<br />
 a6按践线将所遇到的“0”和“1”按最低位到最高位的顺序排好，其码字为0001…<br />
 用霍夫曼编码所得的平均比特率为：Σ码长×出现概率<br />
 上例为： 0.2×2+0.19×2+0.18×3+0.17×3+0.15×3+0.1×4+0.01×4=2.72 bit<br />
 可以算出本例的信源熵为2.61bit，二者已经是很接近了。 <br />
<strong>4.9 </strong><strong>运动估计的运动补偿编码<br />
    </strong>这是一种帧间编码的方法，其原理是利用帧间的空间相关性，减小空间冗余度。 帧间编码为什么可以减小冗余度，这是因为两帧之间有很大的相似性。如果将前后两帧相减 (移动物体作相应位移)得到的误差作编码所需比特要比帧内编码所需的比特少，帧间差集中在零附近，可以用短的码字传送。<br />
 实现帧间编码的方法是运动估计和运动补偿。用图4－5来说明这个过程。<br />
　</p>
<p align="left"> </p>
<p align="left">
 当前帧在过去帧的窗口中寻找匹配部分，从中找到运动矢量；<br />
 根据运动矢量，将过去帧位移，求得对当前帧的估计；<br />
 将这个估计和当前帧相减，求得估计的误差值；<br />
 将运动矢量和估计的误差值送到接收端去。<br />
 接收端根据收到的运动矢量将过去帧作位移(也就是对当前帧的估计)，再加上接收到的误差 值，就是当前帧了。<br />
　</p>
<p align="left">    </p>
<p align="left">
图4－7 运动估计的全局搜索块匹配实际上，在做运动估计和运动补偿时，是以16×16的块(称宏块)逐个进行的，如图4－6所示，这是将当前帧划分为N×N(16×16)的块。对每一块在过去帧中范围为 的范围内进行搜索，以求得最优匹配，从而得到运动矢量的估值(dx,dy)。衡量匹配好坏 的准则可以是均方误差最小准则。搜索方法可以是全局搜索法，即对搜索范围内的每一点都 计算均方误差，选最小值即对应最优匹配，如图4－7所示。</p>
<p align="center"><strong> 5 JPEG标准</strong></p>
<p align="left">    JPEG是Joint Photographic Experts Group的缩写，主要用于计算机静止图像的压缩，在用于活动图像时，其算法仅限于帧内，便于编辑。</p>
<p align="left">  采用JPEG标准可以得到不同压缩比的图像，在使图像质量得到保证的情况下，可以从每个像 素24bit减到每个像素1bit甚至更小。</p>
<p align="left">  JPEG标准所根据的算法是基于DCT(离散余弦变换)和可变长编码。系统框图如图4－8所示， 从图中可见，JPEG的关键技术有变换编码、量化、差分编码、运动补偿、霍夫曼编码和游程编码等。</p>
<p align="left">  图4－8 JPEG系统框图 6 H.261标准 JPEG算法的原理是利用单帧内的空间相关性，减小空间冗余度，这种方式称为帧内编码。我 们知道电视图像(包括各种活动图像)各个连续帧之间也有很大的相关性，称为时间相关性。</p>
<p align="left">  为了进一步提高图像压缩比，要设法减小时间冗余度，这种编码方式称为帧间编码。H.261 是用于会议电视的国际标准，既采用了帧内编码，又采用了帧间编码，因此它的压缩比大致 是JPEG的三倍。 H.261标准用于音象业务的码率是p×64kbps(p=1，2…，30)。用于电视电话时p=1或2，用 于电视会议时p≥6。这种标准具有最小延迟实时对话的能力。</p>
<p align="left">  图4－9是H.261编码器的原理框图。从编码器中看到，它有一个和解码器一样的过程，解出的图像放在运动补偿 预测器(存储器)中形成过去帧，它的输出和当前帧一起加到“运动估计”，求得的运动矢 量一方面经VLC送到复用器中去，另一方面加到运动补偿预测器中，使之产生估计帧(对当前 帧)，它和当前帧相减即求得差值，这个差值经DCT和Q、VLC也送到复用器中去。</p>
<p align="left"> 图4－9 H.261编码器的原理框图 在进行帧间编码时，编码器和解码器必须使用相同的预测器，否则两者会脱轨。为了获得重 建图像，被量化以后的系数要用一个反量化器和反余弦变换(IDCT)来处理，为防止编码器和 解码器慢慢漂移分离，必须对误差的平均值加以严格规定，即使如此，仍然要周期地使用帧 内编码，使解码器处于一个已知状态。</p>
<p align="left">  运动补偿单元使帧间差最小，从而减少所需传输码率。搜索窗的大小在水平和垂直方向上都是±15个采样值。通常只对亮度信号作运动估计，但运动补偿不仅作用于亮度，也作用于色 度(亮度象素位移的一半)。</p>
<p align="left">  图4－10画出了解码器的框图。被压缩的数据送入缓冲器，然后作可变长度解码，解码器余下的 部分相似于编码器的后端，仅有的区别是不再需要运动估计。运动矢量和其它附带的信息是 直接从可变长解码器的输出得到的。</p>
<p align="left">  在编码器的输出端有缓冲器(Buffer)，这是因为编码过程产生的比特率不是 恒定的，它取决于运动序列中各点的图像统计特征。在图像的“简单”部分允许节省一些比 特，而在“复杂”的部分要多花一些比特。对于每一个编码图像，比特的数目也允许变更。 但是在传输网络中的数据的比特率又必须是恒定的，所以在视频编码器的输出端必须有数据缓冲器来提供平滑的作用。相反的，在解码器要以非恒定的速率来利用接收到的信息，所以 也要包含一个解码器的缓冲器。 图4－10 H.261的解码器框图 在传输中，帧频的长期平均值是CIF的标准值，但是在短的时间间隔内帧频会有一定变化。</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td colspan="5">
<p align="center">表4－2 CIF和QCIF格式</p>
</td>
</tr>
<tr>
<td>
<p align="left">格 式</p>
</td>
<td colspan="2">
<p align="left">CIF</p>
</td>
<td colspan="2">
<p align="left">QCIF</p>
</td>
</tr>
<tr>
<td>
<p align="left">信号分量</p>
</td>
<td>
<p align="left">行数/帧</p>
</td>
<td>
<p align="left">象素数/行</p>
</td>
<td>
<p align="left">行数/帧</p>
</td>
<td>
<p align="left">象素数/行</p>
</td>
</tr>
<tr>
<td>
<p align="left">亮度(Y)</p>
</td>
<td>
<p align="left">288</p>
</td>
<td>
<p align="left">360(352)</p>
</td>
<td>
<p align="left">144</p>
</td>
<td>
<p align="left">180(176)</p>
</td>
</tr>
<tr>
<td>
<p align="left">色度(Cb)</p>
</td>
<td>
<p align="left">144</p>
</td>
<td>
<p align="left">180(176)</p>
</td>
<td>
<p align="left">72</p>
</td>
<td>
<p align="left">90(88)</p>
</td>
</tr>
<tr>
<td>
<p align="left">色度(Cr)</p>
</td>
<td>
<p align="left">144</p>
</td>
<td>
<p align="left">180(176)</p>
</td>
<td>
<p align="left">72</p>
</td>
<td>
<p align="left">90(88)</p>
</td>
</tr>
</tbody>
</table>
<p align="left">注：CIF和QCIF帧频是每秒30帧。<br />
   <br />
　</p>
<p align="left"> </p>
<p align="left">H.261的一幅图像是由块(Block)组成宏块(Macroblock)，宏块组成图像组(GO B)，图像组组 成图像，如图4－11所示。 两种格式的码率为：CIF：15~2Mbps QCIF：128kbps 7 MPEG- 1和MPEG-2标准 MPEG(Moving Picture Expert Group)意思是“运动图像专家组”。这个专家组的任务 是为了对数字存储媒质、电视广播、通信等方面的运动图像和伴音给出一种通用的编码 方法 。符合这种编码方法的运 MPEG用句法规定了一个层次性的结构，共分六层。这六层是图像序列(Video Sequence)-图像组(Group of Picture)-图像(Picture)-宏块条(Silce)- 宏块(Macroblock )-块(Block)。 一个图像包含亮度阵列和色度阵列。在MPEG- 1中亮度和色度的格式是4∶2∶0，而在MPEG-2 中，除这一格式外，还允许有4∶2∶2及4∶4∶4。<br />
 六个层次有其不同的功能，如表4－3所示。</p>
<p>　</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td colspan="4">
<p align="center">表4－3 MPEG－1/－2规定的层次功能</p>
</td>
</tr>
<tr>
<td>
<p align="left">语法规定的层次</p>
</td>
<td>
<p align="left">功 能</p>
</td>
<td>
<p align="left">语法规定的层次</p>
</td>
<td>
<p align="left">功 能</p>
</td>
</tr>
<tr>
<td>
<p align="left">序列层(Sequence layer)</p>
</td>
<td>
<p align="left">随机存取段落</p>
</td>
<td>
<p align="left">宏块条层(Slice layer)</p>
</td>
<td>
<p align="left">重新同步单元</p>
</td>
</tr>
<tr>
<td>
<p align="left">图像组层(Group of picture layer)</p>
</td>
<td>
<p align="left">随机存取视频单元</p>
</td>
<td>
<p align="left">宏块层(Macroblock layer)</p>
</td>
<td>
<p align="left">运动补偿单元</p>
</td>
</tr>
<tr>
<td>
<p align="left">图像层(Picture layer)</p>
</td>
<td>
<p align="left">基本编码单元</p>
</td>
<td>
<p align="left">块层(Block layer)</p>
</td>
<td>
<p align="left">DCT单元</p>
</td>
</tr>
</tbody>
</table>
<p align="left">所谓4∶2∶0是指在垂直方向每隔一行去除一行色度信号。</p>
<p align="left"><strong>7.2 MPEG-1</strong><strong>和MPEG-2中三种类型图像</strong><br />
MPEG在利用块匹配运动补偿来减小时间冗余度时，不仅用上一帧的图像预测当前图像， 而且也使用下一帧图像预测当前图像，即双向预测，这是和H.261标准有重要区别的地方。 因此 ，MPEG-1和2中有三种类型图像，即I、B、P三种，如图4－12所示。<br />
　</p>
<p align="left"> </p>
<p align="left">
   I帧是帧内编码，P帧是正向预测，如图4－13所示，通过正向预测得到的图。B帧是双向预测图 ，如图4－14所示。由于B帧不能作其他图像的基准，所以对B帧编码校粗(步长较大)，需要比特数比预测图P少。<br />
　</p>
<p align="left"> </p>
<p align="left">
<strong>7.3 MPEG- 1</strong><strong>的视频压缩编码</strong><br />
MPEG-1中视频编码的关键压缩技术和H.261一样，仍是DCT、运动补偿和Huffman编码。编码 器和解码器的原理框图也和H.261没有区别。<br />
 MPEG-1的信源输入格式是SIF(Source Input Format)。CCIR601格式的信源要转换成SIF后进入MPEG- 1编码器，解码器输出也是SIF格式，显示时要经内插，扩充为CCIR601格式。PAL/NT SC都作如此处理。SIF格式如表4－4所示。</p>
<p>　</p>
<table border="1" cellpadding="0">
<tbody>
<tr>
<td colspan="3">
<p align="center">表4－4 SIF(525/625)格式</p>
</td>
</tr>
<tr>
<td>
<p align="left">信号分量</p>
</td>
<td>
<p align="left">行数/帧</p>
</td>
<td>
<p align="left">象素数/行</p>
</td>
</tr>
<tr>
<td>
<p align="left">亮度(Y)</p>
</td>
<td>
<p align="left">240/288</p>
</td>
<td>
<p align="left">352</p>
</td>
</tr>
<tr>
<td>
<p align="left">色度(Cb)</p>
</td>
<td>
<p align="left">120/144</p>
</td>
<td>
<p align="left">176</p>
</td>
</tr>
<tr>
<td>
<p align="left">色度(Cr)</p>
</td>
<td>
<p align="left">120/144</p>
</td>
<td>
<p align="left">176</p>
</td>
</tr>
</tbody>
</table>
<p align="left">
图4－15所示为MPEG-1视频编码器。图中和H.261不同的部分是有二组运动补偿和存储器，并有相应的转换开关。这是因为MPEG- 1有B图像要处理。开关有4种状态，‘0’是针对帧内 编码，“2”或“3”是用上一帧图像(经S2的虚线a/c)或用下一帧图像(经S2的实线 d/b) ，“4”是用了上一帧和下一帧两幅图像(经S2的实线b和实线c)，这时候要相应产生2 个运 动矢量。<br />
　</p>
<p align="left"> </p>
<p align="left">
<strong>7.4 MPEG- 2</strong><strong>视频压缩编码</strong><br />
 研究制定MPEG标准是为了使应用于数字存储媒体、电视广播、通信等方面的运动图像和伴音 有一种通用的编码方法。使用这个标准意味着运动图像可以作为一种计算机数据来处理 ，并且能够存储在各种各样的存储器中，也可以在现有的或未来的网络中传送和接收，还可以在现在的或将来的广播信道中广播。<br />
 这个标准的应用很广泛，覆盖了从电视电话到高清晰度电视。<br />
 (1)划分为不同的“Profile”和“Level”(“类”和“级”)。由于想使这个标准适用于各种不同的应用，而各种应用在码率、分辨力、图像质量和服务方面要求又各不相同，所以希望这个标准要有通用性。在这个标准产生的过程中，考虑了各种应用的不同要求，开发了必要的算法，并且把它们集中成为一种单一的句法。正因为如此，这个标准使得各种不同应用的码 流之间可以灵活地相互改变。<br />
 既要使句法有通用性，又不能要求具体的解码器全面满足整个句法的需要，那样具体的解码器就太复杂了。为了解决通用性和特殊性的矛盾，设想将整个ISO/IEC的句法分成子集，这样分的子集就称为Profile，我们称之为“类”。这个“类”规定的子集还觉得太大，有必要再分得细一些。例如图像的尽寸有小的，有大的，大的可大到 ，实际上不会有一个解码器能够处理这么大的动态范围的图像，因此，在Profile中又规定了“level”，称为级。<br />
 ISO/IEC13818-2(即MPEG-2视频)规定了5个类和4个级如表4－5所示。<br />
　</p>
<table border="1" cellpadding="0" width="541">
<tbody>
<tr>
<td colspan="6">
<p align="center">表4－5 MPEG- 2的Profile和Level</p>
</td>
</tr>
<tr>
<td width="35">
<p align="left">类级</p>
</td>
<td width="49">
<p align="left">Simple Profile</p>
</td>
<td width="64">
<p align="left">Main</p>
<p align="left">Profile</p>
</td>
<td width="99">
<p align="left">SNR</p>
<p align="left">Scalable</p>
<p align="left">Profile</p>
</td>
<td width="140">
<p align="left">Spstially</p>
<p align="left">Scalable</p>
<p align="left">Profile</p>
</td>
<td width="134">
<p align="left">High</p>
<p align="left">Profile</p>
</td>
</tr>
<tr>
<td width="35">
<p align="left">High Level</p>
</td>
<td width="49">
<p align="left">　</p>
</td>
<td width="64">
<p align="left">√</p>
</td>
<td width="99">
<p align="left">　</p>
</td>
<td width="140">
<p align="left">　</p>
</td>
<td width="134">
<p align="left">√</p>
</td>
</tr>
<tr>
<td width="35">
<p align="left">High-1440 Level</p>
</td>
<td width="49">
<p align="left">　</p>
</td>
<td width="64">
<p align="left">√</p>
</td>
<td width="99">
<p align="left">　</p>
</td>
<td width="140">
<p align="left">√</p>
</td>
<td width="134">
<p align="left">√</p>
</td>
</tr>
<tr>
<td width="35">
<p align="left">Main Level</p>
</td>
<td width="49">
<p align="left">√</p>
</td>
<td width="64">
<p align="left">√</p>
</td>
<td width="99">
<p align="left">√</p>
</td>
<td width="140">
<p align="left">　</p>
</td>
<td width="134">
<p align="left">√</p>
</td>
</tr>
<tr>
<td width="35">
<p align="left">Low Level</p>
</td>
<td width="49">
<p align="left">　</p>
</td>
<td width="64">
<p align="left">√</p>
</td>
<td width="99">
<p align="left">√</p>
</td>
<td>
<p align="left"> </p>
</td>
<td>
<p align="left"> </p>
</td>
</tr>
</tbody>
</table>
<p align="left">注：Main Profile(主类)：图像质量合乎一定要求，允许有一定损伤，不具有可分级性；<br />
 Simple Profile (简化类)：如Main Profile相同，只是不用B帧，这是为了节约RAM；<br />
 SNR Scalable Profile(信噪比可选类）：比Main Profile改进之处是信噪比可分级；<br />
 Spatially Scalable Profile（空间尺寸可选类）：空间分辨率方面也可分级；<br />
 HIgh Profile(高质量类)：支持4∶2∶2并全面可分级(宏块的组成是：4个Y块+2个Cb块 +2个Cr块)；<br />
 Low Level(低级)：类似H.261中的CIF格式；<br />
 Wain Level(主级)：相应于普通电视；<br />
 High 1440 Level(高1440级)：大致相当于具有每行1440个采样的HDTV；<br />
 High Level(高级)：大致相当于每行1920个采样的HDTV。<br />
 MPEG-2格式经常用级和类的缩写表示，如：MP＠ML是指主类和主级，目前用于普通数字电视 、卫星、电缆、广播的DVB标准就是用这一格式。<br />
 (2)MPEG-2的编解码器和MPEG-1的异同。<br />
 ①MPEG-1只处理逐行扫描的电视图像而MPEG-2既处理逐行扫描也处理隔行扫描，因此编码器中要有场/帧决策的功能；<br />
 ②DCT有二种： 帧DCT或场DCT；<br />
 ③运动估计有四种：场预测、帧预测、双场预测和16×8的运动补偿；<br />
 ④压缩编码方式均采用运动检测补偿、DCT、量化、霍夫曼编码、游程编码和VLC等。 <br />
<strong>7.5 MPEG-2</strong><strong>系统</strong> </p>
<p> MPEG-2系统的作用如图4－16所示。它有以下几个任务：<br />
 (1)对音频、视频、数据、控制等基本比特流起系统复用的作用。<br />
 (2)提供用于恢复时间基准的时间标志，缓冲器初始化和管理，音频和视频的解码时间，显示时间。<br />
 (3)给解码器提供一种信息(PSI)，使之更容易和更迅速地找到所需节目。<br />
 (4)给误差恢复，有条件接入，随机接入，数字存储控制提供支持。<br />
 视频或音频编码器的输出被打成PES(Packetised Elementary Streanis)，然后在PS复用器中被组合成PS(Program Stream)或在TS复用器中被组成成TS(Transport Strea m)，前者用于相对无误差的环境，后者用于有噪声媒质。</p>
<p align="left"> FROM: http://blog.ednchina.com/XIE2099/138774/message.aspx</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/my-alexa-ranking-out/" title="alexa排名出来了">alexa排名出来了</a><br /><small>alexa上有排名了。...</small></li><li><a href="http://woodfeed.com/hall-sensor/" title="霍尔传感器">霍尔传感器</a><br /><small>霍尔传感器是一种磁传感器。用它可以检测磁场及其变化，可在各种与磁场有关的场合中使用。霍尔...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-2/" title="Linux常用命令详解(2)">Linux常用命令详解(2)</a><br /><small>三 文件管理
1.Diff  2. find  3. ln  4.locate  5. ...</small></li><li><a href="http://woodfeed.com/my-alexa-ranking-updated-today/" title="3天后的今天alexa又更新了">3天后的今天alexa又更新了</a><br /><small>今天排名又更新了。



...</small></li><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li><li><a href="http://woodfeed.com/a-new-domain-name-laeon-com/" title="注册了一个域名laeon.com">注册了一个域名laeon.com</a><br /><small>前几天又去注册了一个域名，在雅虎注册的，2刀。准备过2个月转出去~
这个比较短，五个字...</small></li><li><a href="http://woodfeed.com/yigeshidaidejieshu/" title="迈克尔-杰克逊逝世 一个时代的结束">迈克尔-杰克逊逝世 一个时代的结束</a><br /><small>“据2006年底统计，其正版专辑全球销量已超过7.5亿，被载入“吉尼斯世界记录大全”。他...</small></li><li><a href="http://woodfeed.com/location-type-pid-control-algorithm/" title="位置式PID控制算法">位置式PID控制算法</a><br /><small>输出值与阀门开度一一对应，所以称为位置式PID控制算法。...</small></li><li><a href="http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/" title="win主机404实现伪静态翻页错误">win主机404实现伪静态翻页错误</a><br /><small>bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的...</small></li><li><a href="http://woodfeed.com/tracking-detection-circuit/" title="循迹检测电路">循迹检测电路</a><br /><small>用TCRT5000型光电对管。TCRT5000是一种一体化反射型光电探测器，其发射器是一...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/digital-compression-coding-techniques/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>视频采集设备的标准采集分辨率</title>
		<link>http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/</link>
		<comments>http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:15:12 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[电子设计]]></category>
		<category><![CDATA[2CIF]]></category>
		<category><![CDATA[4CIF]]></category>
		<category><![CDATA[CIF]]></category>
		<category><![CDATA[DCIF]]></category>
		<category><![CDATA[QCIF]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=452</guid>
		<description><![CDATA[QCIF全称Quarter common intermediate format。QCIF是常用的标准化图像格式。在H.323协议簇中，规定了视频采集设备的标准采集分辨率。QCIF = 176×144像素。
CIF是常用的标准化图像格式（Common Intermediate Format）。在H.323协议簇中，规定了视频采集设备的标准采集分辨率。CIF = 352×288像素]]></description>
			<content:encoded><![CDATA[<p>QCIF全称Quarter common intermediate format。QCIF是常用的标准化图像格式。在H.323协议簇中，规定了视频采集设备的标准采集分辨率。QCIF = 176×144像素。<br />
CIF是常用的标准化图像格式（Common Intermediate Format）。在H.323协议簇中，规定了视频采集设备的标准采集分辨率。CIF = 352×288像素<br />
CIF格式具有如下特性：<br />
(1) 电视图像的空间分辨率为家用录像系统(Video Home System，VHS)的分辨率，即352×288。<br />
(2) 使用非隔行扫描(non-interlaced scan)。<br />
(3) 使用NTSC帧速率，电视图像的最大帧速率为30 000/1001≈29.97幅/秒。<br />
(4) 使用1/2的PAL水平分辨率，即288线。<br />
(5) 对亮度和两个色差信号(Y、Cb和Cr)分量分别进行编码，它们的取值范围同ITU-R BT.601。即黑色=16，白色=235，色差的最大值等于240，最小值等于16。<br />
下面为5种CIF 图像格式的参数说明。参数次序为“图象格式 亮度取样的象素个数(dx) 亮度取样的行数 (dy) 色度取样的象素个数(dx/2) 色度取样的行数(dy/2)”。<br />
sub-QCIF 128×96 64 48<br />
QCIF        176×144 88 72<br />
CIF           352×288 176 144<br />
4CIF         704×576 352 288（即我们经常说的D1）<br />
16CIF       1408×1152 704 576<br />
目前监控行业中主要使用QCIF（176×144）、CIF（352×288）、HALF D1（704×288）、D1<br />
（704×576）等几种分辨率，CIF录像分辨率是主流分辨率，绝大部分产品都采用CIF分辨率。目前市场接受CIF分辨率，主要理由有四点：1、目前数码监控要求视频码流不能太高；2、视频传输带宽也有限制；3、使用HALF D1、D1分辨率可以提高清晰度，满足高质量的要求，但是以高码流为代价的。在现阶段，出现了众多D1的产品，但市场份额非常小；4、采用CIF分辨率，信噪比在32db以上，一般用户是可以接受的，但不是理想的视频图像质量。目前业内人士正在尝试用HALF D1来寻求CIF、D1之间的平衡。但随着单块硬盘的容量达到750GB甚至1000GB，而国内的大部分DVR已经可以做到连接8块1000GB的硬盘，故D1逐渐会变成时常的主流。<br />
DCIF分辨率是什么？<br />
经过研究发现一种更为有效的监控视频编码分辨率（DCIF），其像素为528×384。DCIF分辨率的是视频图像来历是将奇、偶两个HALF D1，经反隔行变换，组成一个D1（720*576），D1作边界处理，变成4CIF（704×576），4CIF经水平3/4缩小、垂直2/3缩小，转换成528×384.528×384的像素数正好是CIF像素数的两倍，为了与常说的2CIF（704*288）区分，我们称之为DOUBLE CIF，简称DCIF。显然，DCIF在水平和垂直两个方向上，比Half D1更加均衡。<br />
为什么选用DCIF分辨率？<br />
数字化监控行业对数字监控产品提出两项要求：首先要求数据量低，保证系统能够长时间录像和稳定实时的网络传输；其次要求回放图像清晰度高，满足对细节的要求。而DCIF分辨率在目前的软硬件平台上，能很好的满足以上两项要求。<br />
Half D1分辨率已被部分产品采用，用来解决CIF清晰度不够高和D1存储量高、价格高昂的缺点。但由于他相对于CIF只是水平分辨率的提升，图像质量提高不是特别明显，但码流增加很大。<br />
经过对大量视频信号进行测试，基于目前的视频压缩算法，DCIF分辨率比Half D1能更好解决CIF清晰度不够高和D1存储量高、价格高昂的缺点，用来解决CIF和4CIF，特别是在512Kbps码率之间，能获得稳定的高质量图像，满足用户对较高图像质量的要求，为视频编码提供更好的选择。<br />
CIF清晰度不够高和D1存储量高、价格高昂的缺点分辨率，静态回放分辨率理论上最高可达360TVline的图像质量，超过模拟监控中标准VHS磁带录像机280TVline的图像水平，达到公安部安防行业视频标准二级和三级项目的清晰度要求，满足绝大部分视频监控的要求。<br />
什么是D1？<br />
做闭路电视监控系统这一行久了，大家都以为D1是硬盘录像机显示、录像、回放的分辨率，实际上不是的，D1是数字电视系统显示格式的标准，共分为以下5种规格：<br />
D1：480i格式（525i）：720×480（水平480线，隔行扫描），和NTSC模拟电视清晰度相同，行频为15.25kHz，相当于我们所说的4CIF（720×576）<br />
D2：480P格式（525p）：720×480（水平480线，逐行扫描），较D1隔行扫描要清晰不少，和逐行扫描DVD规格相同，行频为31.5kHz<br />
D3：1080i格式（1125i）：1920×1080（水平1080线，隔行扫描），高清放松采用最多的一种分辨率，分辨率为1920×1080i/60Hz，行频为33.75kHz<br />
D4：720p格式（750p）：1280×720（水平720线，逐行扫描），虽然分辨率较D3要低，但是因为逐行扫描，市面上更多人感觉相对于1080I（实际逐次540线）视觉效果更加清晰。不过个人感觉来说，在最大分辨率达到1920×1080的情况下，D3要比D4感觉更加清晰，尤其是文字表现力上，分辨率为1280×720p/60Hz，行频为45kHz<br />
D5：1080p格式（1125p）：1920×1080（水平1080线，逐行扫描），目前民用高清视频的最高标准，分辨率为1920×1080P/60Hz,行频为67.5KHZ。<br />
其中D1 和D2标准是我们一般模拟电视的最高标准，并不能称的上高清晰，D3的1080i标准是高清晰电视的基本标准，它可以兼容720p格式，而D5的1080P只是专业上的标准，并不是民用级别的，上面所给出的60HZ只是理想状态下的场频，而它的行频为67.5KHZ，目前还没有如此高行频的电视问世，实际在专业领域里1080P的场频只有24HZ，25HZ和30HZ。<br />
需要指出的一点是，D端子是日本独有的特殊接口，国内电视几乎没有带这种接口的，最多的是色差接口，而色差接口最多支持到D4，理论上肯定没有HDMI（纯数字信号，支持到1080P)的最高清晰度高，但在1920：1080以下分辨率的电视机上，一般也没有很大差别。<br />
国内主流的硬盘录像机（DVR，Digital Video Recording）采用什么分辨率？怎样计算硬盘容量？<br />
国内主流的硬盘录像机采用两种分辨率：CIF和4CIF（D1），分为两种型号。<br />
硬盘录像机常见的路数有1路、2路、4路、8路、9路、12路和16路。最大可以连接8块2000GB的硬盘，总容量可高达1.6TV（可续目前市面上最大的硬盘只有1000GB），如果采用CIF分辨率，通常计算硬盘录像机的录像的硬盘容量为180MB~250MB/小时，通常情况下取值200MB/小时；如果是D1的分辨率每小时录像需要的硬盘容量为720MB~1000MB/小时，通常情况下为了减少硬盘的容量可以按照500MB/小时计算，帧率智能设置比25fps少一些，码流也要少一些！相信大家可以计算出一台装满8块500GB的16路<a style="FONT-SIZE: 12px; COLOR: #666666; TEXT-DECORATION: none" href="http://www.jsa-cctv.com/" target="_blank">硬盘录像机</a>可以录像多长时间了吧？</p>
<p>FROM: http://www.jsa-cctv.com/suport/2008/0511/article_48_1.html</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-2/" title="Linux常用命令详解(2)">Linux常用命令详解(2)</a><br /><small>三 文件管理
1.Diff  2. find  3. ln  4.locate  5. ...</small></li><li><a href="http://woodfeed.com/a-different-day/" title="不一样的一天">不一样的一天</a><br /><small>为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...</small></li><li><a href="http://woodfeed.com/digital-compression-coding-techniques/" title="数字压缩编码技术">数字压缩编码技术</a><br /><small> 数字信号有很多优点，但当模拟信号数字化后其频带大大加宽，一路6MHz的普通电视信号数字...</small></li><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li><li><a href="http://woodfeed.com/obstacle-avoidance-module/" title="避障模块">避障模块</a><br /><small>采用红外避障传感器实现简单避障。...</small></li><li><a href="http://woodfeed.com/wp-replacement-of-domain-names/" title="WP更换域名">WP更换域名</a><br /><small>首先进入MySQL后台phpMyAdmin：
点结构体旁边的SQL按钮，在下面命令框内分...</small></li><li><a href="http://woodfeed.com/location-type-pid-control-algorithm/" title="位置式PID控制算法">位置式PID控制算法</a><br /><small>输出值与阀门开度一一对应，所以称为位置式PID控制算法。...</small></li><li><a href="http://woodfeed.com/apache-mod_rewrite-for-301-redirect/" title="Apache mod_rewrite 实现301重定向">Apache mod_rewrite 实现301重定向</a><br /><small>它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PhotoShop作业&#8211;盒子</title>
		<link>http://woodfeed.com/photoshop-box/</link>
		<comments>http://woodfeed.com/photoshop-box/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 03:24:48 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[生活随记]]></category>
		<category><![CDATA[ps]]></category>
		<category><![CDATA[盒子]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=434</guid>
		<description><![CDATA[
 
去年做的一个作业，ps的处女作。
精彩文章Linux网络配置详解从linux诞生的那一天起,就注定了它的网络功能空前地强大.所以在linux系统中如何配...不一样的一天为什么不一样呢？因为天明了，又黑了，然后又亮了！——日全食。

传说中五百年一次的日全食...Linux下NFS详解NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...WP更换域名首先进入MySQL后台phpMyAdmin：
点结构体旁边的SQL按钮，在下面命令框内分...uIP TCP/IP协议栈在51系列单片机上的应用　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...源码公开的TCP/IP协议栈uIP的应用摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监...Linux常用命令详解(5)七 系统管理
1 adduser 2 passwd 3 date 4 exit 5 f...迈克尔-杰克逊逝世 一个时代的结束“据2006年底统计，其正版专辑全球销量已超过7.5亿，被载入“吉尼斯世界记录大全”。他...uIP &#8211; uipopt.h配置使用每个项目一个的配置文件uipopt.h来配置uIP。这个文件包含了uIP的所有的编译...光电编码器的特性及应用光电编码器，是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是...]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://woodfeed.com/wp-content/uploads/2009/11/hezi.jpg" rel="lightbox[434]"><img class="aligncenter size-medium wp-image-435" title="hezi" src="http://woodfeed.com/wp-content/uploads/2009/11/hezi-300x200.jpg" alt="hezi" width="300" height="200" /></a>去年做的一个作业，ps的处女作。</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/application-of-open-source-tcp-ip-protocol-stack-uip/" title="源码公开的TCP/IP协议栈uIP的应用">源码公开的TCP/IP协议栈uIP的应用</a><br /><small>摘 要：介绍一个适用于8/16位单片机的嵌入式TCP/IP协议栈（uIP）在发电机远程监...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-6/" title="Linux常用命令详解(6)">Linux常用命令详解(6)</a><br /><small>八 网络通迅
1 ifconfig 2 netconfig 3 netstat 4 pi...</small></li><li><a href="http://woodfeed.com/create-multiple-wp-blog-by-one-wp-code/" title="一个WordPress建立多个独立WP博客">一个WordPress建立多个独立WP博客</a><br /><small>共用一个WordPress
可以共用同一个数据库...</small></li><li><a href="http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/" title="C8051f020外部数据存储器复用方式">C8051f020外部数据存储器复用方式</a><br /><small>C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上...</small></li><li><a href="http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/" title="视频采集设备的标准采集分辨率">视频采集设备的标准采集分辨率</a><br /><small>QCIF全称Quarter common intermediate format。QCI...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-1/" title="Linux常用命令详解(1)">Linux常用命令详解(1)</a><br /><small>一 文件传输
1. bye 2．ftp 3. ftpcount
二 备份压缩
1.tar...</small></li><li><a href="http://woodfeed.com/optical-encoder-features-and-applications/" title="光电编码器的特性及应用">光电编码器的特性及应用</a><br /><small>光电编码器，是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是...</small></li><li><a href="http://woodfeed.com/hall-sensor/" title="霍尔传感器">霍尔传感器</a><br /><small>霍尔传感器是一种磁传感器。用它可以检测磁场及其变化，可在各种与磁场有关的场合中使用。霍尔...</small></li><li><a href="http://woodfeed.com/autotools-generated-makefile/" title="利用autotools生成Makefile">利用autotools生成Makefile</a><br /><small>对于一个较大的项目而言，完全手动建立Makefile是一件费力而又容易出错的工作。aut...</small></li><li><a href="http://woodfeed.com/location-type-pid-control-algorithm/" title="位置式PID控制算法">位置式PID控制算法</a><br /><small>输出值与阀门开度一一对应，所以称为位置式PID控制算法。...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/photoshop-box/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>uIP TCP/IP协议栈在51系列单片机上的应用</title>
		<link>http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/</link>
		<comments>http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 02:45:46 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[TCP/IP]]></category>
		<category><![CDATA[uIP 协议栈]]></category>
		<category><![CDATA[单片机]]></category>
		<category><![CDATA[嵌入式系统]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=428</guid>
		<description><![CDATA[　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微处理器构建的嵌入式系统。本文分析了uIP协议栈的结构和应用接口，并讨论了如何将其应用到51系列单片机上。
关键字：TCP/IP 单片机   嵌入式系统]]></description>
			<content:encoded><![CDATA[<p>uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微处理器构建的嵌入式系统。本文分析了uIP协议栈的结构和应用接口，并讨论了如何将其应用到51系列单片机上。<br />
关键字：TCP/IP 单片机   嵌入式系统</p>
<p>一 引言</p>
<p>近几年来，人们对连接各种装置到一个现有的IP网络例如因特网上产生了浓厚的兴趣。为了可以通过因特网通讯，一个可实现的TCP/IP协议栈是必须的。对于由32位嵌入式处理器构建的中、高端网络接入嵌入式系统中，通常会运行一个集成有TCP/IP协议栈的操作系统。但是对于由8位和16位低端处理器构建的系统，由于其所具有的处理能力和资源十分有限，通常不运行操作系统，这就要求系统开发者根据应用的要求以及所选用的处理器的实际情况构建自己的TCP/IP协议栈。而TCP/IP协议的透明性掩盖了其实现的复杂性，从无到有构建一个协议栈是一件艰巨的任务，并且缺少有效的调试工具。uIPTCP/IP协议栈是使用于低端8位或16位微处理器构建的嵌入式系统的一个可实现的极小的TCP/IP协议栈。它可以自由分发和使用于商业和非商业目的。uIP使用C语言编写，使其方便于移植。并且uIP协议栈的代码大小和RAM的需求比其它一般的TCP/IP栈要小，这就使得它可以方便的应用到各种低端系统上。本文将简要描述uIP的实现方法，分析uIP协议栈的应用接口，并讨论如何将其应用到51系列单片机上。</p>
<p>二 uIP协议栈的实现方法简述</p>
<p>uIP实现了TCP/IP协议集的四个基本协议：ARP地址解析协议，IP网际互联协议，ICMP网络控制报文协议和TCP传输控制协议。为了在8位16位处理器上应用，uIP协议栈在各层协议实现时采用有针对性的方法，保持代码大小和存储器使用量最小。</p>
<p>1 实现ARP地址解析协议时为了节省存储器，ARP应答包直接覆盖ARP请求包。</p>
<p>2 实现IP网络协议时对原协议进行了极大的简化，它没有实现分片和重组。</p>
<p>3 实现ICMP网络控制报文协议时，只实现echo（回响）服务。uIP在生成回响报文时并不重新分配存储器空间，而是直接修改echo请求报文来生成回响报文。将ICMP类型字段从“echo”类型改变成“echoreply”类型，重新计算校验和修改校验和字段。</p>
<p>4 uIP里的TCP没有实现发送和接收数据的滑动窗口。每个TCP连接的状态由uip_conn结构保存，uip_conn结构包括当地和远端的TCP端口编号，远程主机的IP地址，重发时间值，上一段重发的编号，和连接的段的最大尺寸等信息。一个uip_conn结构数组用于保存所有的连接，数组的大小为支持的同时连接的最大数量。为了减少储存器的使用量，在处理重发时uIP并不缓存发送的数据包，而是由应用程序在需要重发时重新生成发送的数据。</p>
<p>三 uIP协议栈的接口</p>
<p>uIP协议栈为了具有最大的通用性，在实现时将底层硬件驱动和顶层应用层之外的所有协议集“打包“在一个“库“里。协议栈通过接口与底层硬件和顶层应用“通信“。通过这种方式，uIP具有极高的通用性和独立性，移植到不同系统和实现不同的应用都很方便，很好的体现了TCP/IP协议平台无关性的特点。uIP协议栈与系统底层和应用程序之间的接口关系如图（一）所示：</p>
<p><img class="aligncenter size-full wp-image-429" title="1" src="http://woodfeed.com/wp-content/uploads/2009/11/1.jpg" alt="1" width="288" height="250" /></p>
<p>1uIP协议栈与系统底层的接口</p>
<p>uIP与系统底层的接口包括与设备驱动的接口和与系统定时器的接口两类。</p>
<p>1.1 uIP与设备驱动接口</p>
<p>uIP通过函数uip_input（）和全局变量uip_buf、uip_len来实现与设备驱动的接口。uip_buf用于存放接收到的和要发送的数据包，为了减少存储器的使用，接收数据包和发送数据包使用相同的缓冲区。uip_len表明接收发送缓冲区里的数据长度，通过判断uip_len的值是否为0来判断是否接收到新的数据，是否有数据要发送。当设备驱动接收到一个IP包并放到输入包缓存里（uip_buf）后，应该调用uip_input（）函数。uip_input（）函数是uIP协议栈的底层入口，由它处理收到的IP包。当uip_input（）返回，若有数据要发送，则发送数据包放在包缓冲区里。包的大小由全局变量uip_len指明。如果uip_len是0，没有包要发送;如果uip_len大于0则调用网络设备驱动发送数据包。</p>
<p>1.2 uIP与系统计时接口</p>
<p>TCP/IP协议要处理许多定时事件，例如包重发、ARP表项更新。系统计时用于为所有uIP内部时钟事件计时。当周期计时激发，每一个TCP连接应该调用uIP函数uip_periodic（）。TCP连接编号作为参数传递给uip_periodic（）函数。uip_periodic（）函数检查参数指定的连接的状态，如果需要重发则将重发数据放到包缓冲区（uip_buf）中并修改uip_len的值。当uip_periodic（）函数返回后，应该检查uip_len的值，若不为0则将uip_buf缓冲区中的数据包发送到到网络上。</p>
<p>ARP协议对于构建在以太网上的TCP/IP协议是必须的，但对于构建与其他网络接口（例如：串行链路）上的TCP/IP则不是必需的。为了结构化的目的，uIP将ARP协议作为一个可添加的模块单独实现。因此，ARP表项的定时更新要单独处理。系统定时器对ARP表的更新进行定时，定时时间到则调用uip_arp_timer（）函数对过期表项进行清除。</p>
<p>2 uIP协议栈与应用程序的接口</p>
<p>应用程序作为单独的模块由用户实现，uIP协议栈提供一系列接口函数供用户程序调用。用户需将应用层入口程序作为接口提供给uIP协议栈，定义为宏UIP_APPCALL（）。uIP在接收到底层传来的数据包后，若需要送上层应用程序处理，它就调用UIP_APPCALL（）。uIP提供给应用程序的接口函数按功能描述如下：</p>
<p>2.1 接收数据接口：应用程序利用uip_newdata（）函数检测是否有新数据到达。全局变量uip_appdata指针指向实际数据。数据的大小通过uip_datalen（）函数获得。</p>
<p>2.2 发送数据接口：应用程序通过使用uIP函数uip_send（）发送数据。uip_send（）函数采用两个参数;一个指针指向发送数据起始地址，另一个指明数据的长度。</p>
<p>2.3 重发数据接口：应用程序通过测试函数uip_rexmit（）来判断是否需要重发数据，如果需要重发则调用uip_send（）函数重发数据包。</p>
<p>2.4 关闭连接接口：应用程序通过调用uip_close（）函数关闭当前连接。</p>
<p>2.5 报告错误接口：uIP提供错误报告函数检测连接中出现的错误。应用程序可以使用两个测试函数uip_aborted（）和uip_timedout（）去测试那些错误情况。</p>
<p>2.6 轮询接口：当连接空闲时，uIP会周期性地轮询应用程序，判断是否有数据要发送。应用程序使用测试函数uip_poll（）去检查它是否被轮询过。</p>
<p>2.7 监听端口接口：uIP维持一个监听知名TCP端口的列表。通过uip_listen（）函数，一个新的监听端口打开并添加到监听列表中。当在一个监听端口上接收到一个新的连接请求时，uIP产生一个新的连接和调用该端口对应的应用程序。</p>
<p>2.8 打开连接接口：在uIP里面通过使用uip_connect（）函数打开一个新连接。这个函数打开一个新连接到指定的IP地址和端口，返回一个新连接的指针到uip_conn结构。如果没有空余的连接槽，函数返回空值。</p>
<p>2.9 数据流控制接口：uIP提供函数uip_stop（）和uip_restart（）用于TCP连接的数据流控制。应用程序可以通过函数uip_stop（）停止远程主机发送数据。当应用程序准备好接收更多数据，调用函数uip_restart（）通知远程终端再次发送数据。函数uip_stopped（）可以用于检查当前连接是否停止。</p>
<p>四 uIP在51系列单片机上的应用</p>
<p>51系列单片机具有悠久的历史和广泛的应用，许多公司推出了具有更高的处理速度的51内核的8位单片机，被应用在各个领域内。因此使用uIP这种免费的TCP/IP协议栈解决由51内核的单片机构建的低端嵌入式设备的网络接入问题具有一定的代表性。下面将讨论利用uIP协议栈在51单片机上实现简单的WEBSERVER，远端用户可以通过浏览器访问存储在单片机系统上的WEB页面。</p>
<p><img class="aligncenter size-full wp-image-430" title="2" src="http://woodfeed.com/wp-content/uploads/2009/11/2.jpg" alt="2" width="415" height="138" /></p>
<p>硬件平台结构如图（二）所示：其中单片机选用PHILIPS公司的P89C51RD2，64K字节的串行EEPROM可以用于存储WEB页面。采用ISA接口的以太网接口芯片RTL8019AS连接到以太网上。通过MAX232实现与PC机的串行连接，可以显示调试信息。</p>
<p>uIP协议栈是以函数库的形式提供的，本身不提供底层网络驱动和上层应用程序。因此为了完成指定的功能，开发者必须添加以下几个模块：底层RTL8019AS网卡芯片的驱动、应用层基于HTTP协议的WEBSERVER的实现、系统定时器。</p>
<p>RTL8019AS的驱动主要包括三部分：init_8019as（）函数完成网卡芯片的上电初始化，包括设定网卡物理地址，设定收发缓冲区位置和大小等;eth_send（）函数完成数据的发送;eth_rcve（）函数完成以太网数据的接收。底层网络设备驱动程序与uIP协议栈通过两个全局变量进行接口：变量uip_buf为收发缓冲区的首地址;uip_len为收发的数据长度。eth_send（）函数将uip_buf里的uip_len长度的数据发送到以太网上。eth_rcve（）函数将接收到的数据存储到uip_buf指定的缓冲区中，同时修改uip_len的值。</p>
<p>uIP提供的源代码中包括一个基于HTTP协议的WEBSERVER示例，该WEBSERVER通过简单的文件系统在数据存储器中存储静态页面，同时具有CGI功能。用户可以参照该示例以及uIP提供给应用程序的接口函数说明实现自己的应用层功能。用户的应用程序中必须将UIP_APPCALL宏定义为该层的服务程序。例如：在示例程序中WEBSERVER的处理程序为httpd（）函数，则要进行如下的宏定义#defineUIP_APPCALLhttpd。</p>
<p>51系列单片机上都有2到3个定时计数器，可以选择其中的一个来为TCP/IP协议中与时间有关的事件定时。需要由用户处理的定时事件包括：为uip_periodic（）函数的执行提供基准，还要为ARP表项的更新定时。uip_periodic（）函数每0.5秒执行一次，ARP表项每10秒更新一次。</p>
<p>uIP的设置单独包含在一个叫uipopt.h的头文件里，都是以宏的形式定义方便于修改。用户应根据自己的应用在uipopt.h文件里设置本地的物理地址、IP地址、网关地址、收发缓冲区的大小、支持的最大连接数、ARP表大小等等选项。</p>
<p>添加了必须的模块，对uIP进行了正确地配置后，需要编写主程序函数。针对基于以太网的WEBSERVER应用，主程序在完成初始化后将不停的进行查询，如果有新数据包到达则送uip_input（）函数处理;如果没有新数据包到达则处理定时事件。框架代码如下所示：</p>
<p>void main（void） //主程序开始</p>
<p>｛ …… //省略部分代码</p>
<p>timer0_init（）; //定时器初始化函数由开发者完成</p>
<p>serial_init（）; //串口初始化函数由开发者完成</p>
<p>init_8019（）; //网卡芯片初始化函数由开发者完成</p>
<p>uip_init（）; //uIP协议栈初始化函数由uIP协议栈提供</p>
<p>httpd_init（）; //HTTP应用程序初始化函数由WEB SERVER示例程序提供</p>
<p>uip_arp_init（）;//ARP协议初始化函数由ARP模块提供</p>
<p>while（1）</p>
<p>｛ uip_len = eth_rcve（）; //查询网卡是否有数据到来</p>
<p>if（uip_len == 0） //如果没有数据到来则处理定时事件</p>
<p>｛ if（0.5秒定时时间到）</p>
<p>｛ for（i = 0; i &lt; UIP_CONNS; i++） // UIP_CONNS为TCP连接数</p>
<p>｛ uip_periodic（i）; //处理每一个TCP连接</p>
<p>if（uip_len &gt; 0） //说明本连接有数据要发送或重发</p>
<p>｛ uip_arp_out（）; //由ARP处理部分添加以太网帧头</p>
<p>eth_send（）; //由网卡驱动程序发送</p>
<p>｝</p>
<p>｝//对应于：for（）</p>
<p>｝// 对应于：if（0.5秒定时时间到）</p>
<p>if（ARP表项更新时间到）</p>
<p>uip_arp_timer（）; //进行ARP表项更新</p>
<p>｝else if（uip_len &gt; 0） //说明接收到新的数据包</p>
<p>｛ if（BUF-&gt;type == htons（UIP_ETHTYPE_IP））//如果收到IP数据包</p>
<p>｛ uip_arp_ipin（）; //送ARP模块进行表项更新</p>
<p>uip_len -= sizeof（struct uip_eth_hdr）; //去除以太网帧头</p>
<p>uip_input（）; //送uip_input（）进行处理</p>
<p>if（uip_len &gt; 0） //若uip_input（）返回后uip_len不为零说明有数据要回送</p>
<p>｛ uip_arp_out（）; //由ARP部分添加以太网帧头</p>
<p>eth_send（）; //送交网卡驱动发送</p>
<p>｝//对应于：if（）收到IP数据包</p>
<p>｝else if（BUF-&gt;type == htons（UIP_ETHTYPE_ARP））//如果收到ARP包</p>
<p>｛ uip_arp_arpin（）; //由uip_arp_arpin（）处理，如果为应答包则进行表项</p>
<p>//更新</p>
<p>//如果为请求包，则构造应答数据包</p>
<p>if（uip_len &gt; 0） //说明收到的是ARP请求包，需要回送ARP应答包</p>
<p>eth_send（）; //送网卡驱动发送</p>
<p>｝//对应于：else if（）收到ARP数据包</p>
<p>｝//对应于：else if（） 说明接收到新的数据包</p>
<p>｝｝</p>
<p>以上实例在keilC51编译器下设置大模式，优化等级6（速度优先）进行编译，对uIP代码部分可以不做任何修改，对HTTP示例代码仅需针对类型表达进行极少量的修改即可编译通过。在硬件平台上运行良好。</p>
<p>五 总结</p>
<p>uIP协议栈采用有效的方法和结构化的代码，使其存储器占用量很小并且可以很方便的应用到不同的工程项目中。同时它又是免费的可以自由使用于商业和非商业目的。uIP为低端嵌入式设备的网络接入提供了很好的解决方案，具有很高的应用价值。</p>
<p>参考文献</p>
<p>[1]DOUGLASE.COMER著，用TCP/IP进行网际互连（卷一、卷二）电子工业出版社，2000</p>
<p>[2]JEREMYBENTHAM著，嵌入式系统Web服务器——TCP/IPLean机械工业出版社，2003</p>
<p>[3]uIP协议栈网络站点<a href="http://dunkels.com/adam/uip/">http://dunkels.com/adam/uip/</a></p>
<p>[4]REALTEK公司.RTL8019ASDatasheet，2000</p>
<p>邓治国 张维新　供稿 来源：网络</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/wp-k2/" title="wp主题k2">wp主题k2</a><br /><small>k2是一款功能强大且外观易于定制的主题。...</small></li><li><a href="http://woodfeed.com/standard-acquisition-resolution-of-video-capture-device/" title="视频采集设备的标准采集分辨率">视频采集设备的标准采集分辨率</a><br /><small>QCIF全称Quarter common intermediate format。QCI...</small></li><li><a href="http://woodfeed.com/detail-to-explain-the-nfs-under-linux/" title="Linux下NFS详解">Linux下NFS详解</a><br /><small>NFS(Network File System)是一种分布式文件系统，允许网络中的安装不...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-3/" title="Linux常用命令详解(3)">Linux常用命令详解(3)</a><br /><small>四 磁盘管理
1 cd 2 df 3 du 4 ls 5 mkdir 6 pwd 7 r...</small></li><li><a href="http://woodfeed.com/robot-control-of-linear-maze/" title="浅谈机器人在线迷宫中的控制策略问题">浅谈机器人在线迷宫中的控制策略问题</a><br /><small>循迹存在一些直道、弯道、丁字路口、十字路口、死胡同等多种情况。在“左手法则”下，如何合理...</small></li><li><a href="http://woodfeed.com/c8051f020-external-data-memory-reuse-approach/" title="C8051f020外部数据存储器复用方式">C8051f020外部数据存储器复用方式</a><br /><small>C8051F020/1/1/3 MCU 内部有位于外部数据存储器空间的4096 字节片上...</small></li><li><a href="http://woodfeed.com/address-resolution-protocol-arp-and-reverse-address-resolution-protocol-rarp/" title="地址解析协议ARP和反向地址解析协议RARP">地址解析协议ARP和反向地址解析协议RARP</a><br /><small>ARP，全称Address Resolution Protocol，中文名为地址解析协议...</small></li><li><a href="http://woodfeed.com/apache-mod_rewrite-for-301-redirect/" title="Apache mod_rewrite 实现301重定向">Apache mod_rewrite 实现301重定向</a><br /><small>它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥...</small></li><li><a href="http://woodfeed.com/detailed-description-of-commonly-used-linux-commands-1/" title="Linux常用命令详解(1)">Linux常用命令详解(1)</a><br /><small>一 文件传输
1. bye 2．ftp 3. ftpcount
二 备份压缩
1.tar...</small></li><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>win主机404实现伪静态翻页错误</title>
		<link>http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/</link>
		<comments>http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 06:52:07 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[404]]></category>
		<category><![CDATA[伪静态]]></category>
		<category><![CDATA[翻页错误]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=384</guid>
		<description><![CDATA[bug：翻过一次页面时，第二次翻页链接地址提取出错。
例如：page/2，点击3，出来的地址是一个转向404页面之后的地址。
修正：打开根目录下的wp-settings.php。查找下面一行代码]]></description>
			<content:encoded><![CDATA[<p>bug：翻过一次页面时，第二次翻页链接地址提取出错。<br />
例如：page/2，点击3，出来的地址是一个转向404页面之后的地址。<br />
修正：打开根目录下的wp-settings.php。查找下面一行代码</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">php_sapi_name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'cgi-fcgi'</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'/^Microsoft-IIS\//'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SERVER_SOFTWARE'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>替换为：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>这样就OK了。</p>
<h2  class="related_post_title">精彩文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/implementing-16-bit-pwm-using-the-pca-with-c8051f020/" title="C8051f020产生16位PWM">C8051f020产生16位PWM</a><br /><small>脉冲宽度调制（PWM）波形常用于闭环反馈和控制应用，例如：控制加热单元的开关状态以调节D...</small></li><li><a href="http://woodfeed.com/incremental-pid-algorithm/" title="增量式PID算法">增量式PID算法</a><br /><small>所谓增量式PID是指数字控制器的输出只是控制量的增量kuΔ。当执行机构需要的控制量是增量...</small></li><li><a href="http://woodfeed.com/simple-smar-electric-ehicles/" title="简单智能电动车">简单智能电动车</a><br /><small>本简易智能电动车跷跷板分为电动车智能行驶和跷跷板两个主要部分，都以单片机为控制核心，根据...</small></li><li><a href="http://woodfeed.com/create-multiple-wp-blog-by-one-wp-code/" title="一个WordPress建立多个独立WP博客">一个WordPress建立多个独立WP博客</a><br /><small>共用一个WordPress
可以共用同一个数据库...</small></li><li><a href="http://woodfeed.com/c8051f02x-external-memory-interface-and-i-o-port-configuration/" title="C8051F02X外部存储器接口和I/O端口配置">C8051F02X外部存储器接口和I/O端口配置</a><br /><small>介绍美国Cygnal公司生产的C8051F02X系列单片机的外部存储器接口、I/O端口配...</small></li><li><a href="http://woodfeed.com/2007-national-electronic-design-competition-f/" title="2007全国电子设计大赛F题(电动车跷跷板)">2007全国电子设计大赛F题(电动车跷跷板)</a><br /><small>2007全国电子设计大赛F题 

电动车跷跷板（F题）

一、任务



设计并制作一个...</small></li><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li><li><a href="http://woodfeed.com/application-of-the-uip-tcpip-protocol-stack-in-the-51-mcu/" title="uIP TCP/IP协议栈在51系列单片机上的应用">uIP TCP/IP协议栈在51系列单片机上的应用</a><br /><small>　uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈，可以使用于由8位或16位微...</small></li><li><a href="http://woodfeed.com/uip-transplantation/" title="uIP移植">uIP移植</a><br /><small>uIP的设备驱动程序接口。uIP内核中有两个函数直接需要底层设备驱动程序的支持。一是ui...</small></li><li><a href="http://woodfeed.com/metal-detector-circuit/" title="金属探测电路">金属探测电路</a><br /><small>利用金属接近开关传感器E3-D4NK可以检测到铁皮向单片机发送出信号，使单片机可以记录铁...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/next-page-bug-of-404-for-pseudo-static/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Apache mod_rewrite 实现301重定向</title>
		<link>http://woodfeed.com/apache-mod_rewrite-for-301-redirect/</link>
		<comments>http://woodfeed.com/apache-mod_rewrite-for-301-redirect/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 06:45:06 +0000</pubDate>
		<dc:creator>vayu</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[301]]></category>
		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://woodfeed.com/?p=380</guid>
		<description><![CDATA[它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试，比如服务器变量、环境变量、HTTP头、时间标记，甚至各种格式的用于匹配URL组成部分的查找数据库。

此模块可以操作URL的所有部分(包括路径信息部分)，在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效，还可以生成最终请求字符串。此重写操作的结果可以是内部子处理，也可以是外部请求的转向，甚至还可以是内部代理处理。]]></description>
			<content:encoded><![CDATA[<p><strong>Apache mod_rewrite</strong><br />
它提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试，比如服务器变量、环境变量、HTTP头、时间标记，甚至各种格式的用于匹配URL组成部分的查找数据库。</p>
<p>此模块可以操作URL的所有部分(包括路径信息部分)，在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效，还可以生成最终请求字符串。此重写操作的结果可以是内部子处理，也可以是外部请求的转向，甚至还可以是内部代理处理。</p>
<p><strong>mod_rewrite 实现301重定向<br />
</strong>1.只更换域名，后面的目录链接不变：</p>
<p><code># BEGIN WP<br />
Options +FollowSymLinks<br />
RewriteEngine On<br />
RewriteCond %{http_host} ^blog.woodfeed.com [NC]<br />
RewriteRule ^(.*)$ http://woodfeed.com/$1 [L,R=301]<br />
# END WP</code></p>
<p><code># BEGIN WP<br />
Options +FollowSymLinks<br />
RewriteEngine On<br />
RewriteCond %{http_host} ^blog\.woodfeed\.com$ [NC]<br />
RewriteRule ^(.*)$ http://woodfeed.com%{REQUEST_URI} [L,R=301]<br />
# END WP</code><br />
2.更换域名的同时，将伪静态页面的.html去掉<br />
本站blog.woodfeed.com就是用的下面代码实现的301定向。</p>
<p><code># BEGIN WP<br />
Options +FollowSymLinks<br />
RewriteEngine On<br />
RewriteBase /<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteRule ^([-a-zA-Z0-9_+]+).html$ http://woodfeed.com/$1 [L,R=301]<br />
RewriteRule ^(.*)$ http://woodfeed.com%{REQUEST_URI} [L,R=301]<br />
# END WP</code></p>
<p><strong>mod_rewrite 正则表达式<br />
</strong>现在我们可以重写URLs了！设想我们有一个显示城市信息的网站。根据URI选择城市：http://www.example.com/display.php?country=USA &amp;state=California&amp;city=San_Diego这个URL太长并且对用户也不友好，我们更希望写成这样：</p>
<p>http://www.example.com/USA/California/San_Diego</p>
<p>我们需要告诉Apache新的URL会根据一定的格式转化成这样，为了让display.php明白查询的字符，所以我们将用到正则表达式告诉 mod_rewrite匹配我们的URLs。如果你对正则表达式不太熟悉，许多网站提供了优秀的教程供你学习。在本文的末尾，我也会列举出比较好的参考网 址。如果你还是不能明白我所讲述的，那么我建议你看看后面链接中的前两篇。<br />
一个最常用的正则就是（.*）。它含有两个元素：一是“点”，表示任意字符；二是“星”，表示以前的全部字符。所以（.*）会匹配 {REQUEST_URI}的所有字符。{REQUEST_URI}是URL中出去域名以及“？”符号的所有查询字符，也是Apache 重写技术尝试匹配的字符。<br />
包裹在正则表达式中的元素存放在“原子”内，它是在规则范围内允许被匹配的变量，所以以上正则存储了USA/California/San_Diego在“原子”中，为了解决我们的问题，我们需要三个“原子”，他们可以用左斜杠“/”进行分隔，所以正则表达式成了：<br />
(.*)/(.*)/(.*)<br />
以上正则，在{REQUEST_URI}中通过两个“/”的分割存储了三个值，为了解决我们具体问题，我们得加一点限制――毕竟，第一个和最后一个原子可以匹配任何字符。<br />
开始，我们可以添加一些特殊的字符，比如表示正则“开始”或者“结束”，“^”字符表示正则的开始而“$”表示正则的结束。<br />
^(.*)/(.*)/(.*)$<br />
这个正则表示整个字符串将全部匹配，除去之前后者之后，没有任何例外。<br />
但是，这个方法仍然匹配的范围太广，我们将匹配的字符按照原子形式存放，然后通过他们形成查询字符串，所以我们必须信任我们所匹配的字符。用(.*)匹配字符串，由于允许了太多字符，所以会存在潜在的安全隐患，引用不当会使mod_rewrite运行出故障。<br />
为了避免一些不必要的麻烦，让我们更改一下我们的原子正则，让其更加准确的匹配我们允许的字符。因为这些原子代表了地区地名，所以我们完全可以用A到Z的 大小写来表示他们，另外因为地名之间有空格，所以下划线“_”也是被允许的。我们用中括弧明确我们匹配的正则，然后用短横线“-”表示连接的范围，所以被 我们允许的正则修改成了[a-zA-Z_],因为我们还要避免匹配到空名字，所以用“+”来匹配在该字符之前的一个或者多个字符，所以我们的正则成了：<br />
^([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$<br />
{REQUEST_URI}是以“/”开头。Apache 在更改版本的时候会更改正则引擎，一代Apache要求有斜杠而二代Apache却不允许！但是我们可以用^/?（？表示匹配字符本身或者前一个字符）来兼容两个版本的Apache，所以我们的正则又成了:<br />
^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$正则在手，我们就可以将原子标识到URL上了：display.php?country=$1 &amp;state=$2&amp;city=$3<br />
$1表示国家原子；$2表示省州原子；$3表示城市原子，这里可以加上9个原子，分别用$1到$9表示。<br />
现在我们要做的就是在该目录下创建一个新的.htaccess文件，录入一下代码：<br />
RewriteRule ^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)$ display.php?country=$1 &amp;state=$2&amp;city=$3 [L]<br />
然后保存，重写规则必须写在一行并且用一个空格分开每一个参数，我们用[L]或者’last’表示匹配结束。（一会有更多flags介绍）我们的重写规则已经创建完成， URL请求字符上各原子的值将经过我们匹配的正则，加上查询变量到我们的重写URL上。display.php将从查询字符中解析这些值，然后将他们送入数据库查询或者进行其他数据库操作。<br />
如果你的正则只允许有限的几个国家，为了避免数据库错误，你可以在正则中加入一下被允许条件，例子如下：<br />
^/?(USA|Canada|Mexico)/([a-zA-Z_]+)/([a-zA-Z_]+)$<br />
如果你关心查询字符串的大小写问题，由于你数据库对大写有严格的限制，那么你可以在正则表达式后面加一个[NC]FLAG位来忽略大小写，但是不要忘记在你通过$_GET 获取传递值的时候，把他们转换成小写。<br />
如果你想用数字（0，1…..9）来表示具体的地区，那么需要更改正则中的([a-zA-Z_]+)成([0-9])来匹配单个数字，([0-9]{1,2})匹配两位数字（0到99）,([0-9]+)匹配多位数字，这个对匹配数据库ID之类的非常有用。</p>
<p><strong>RewriteCond 指令</strong><br />
当RewirteCond指令明确声明以后，mod_rewrite将根据它们做出相应的处理。<br />
RewirteCond 指令的形式和RewriteRule有点类似，形式为：RewirteCond 被匹配的字符正则 FLAG标识。逻辑FLAG标识 [OR],是非常有用的，记住所有RewirteCond 以及RewriteRule指令在[LAST]指令之前，所有的逻辑与关系都会被包含。<br />
你可以用RewirteCond指令测试服务器变量，在this is the best list of server variables一文可以找到相关说明。举一个列子，假设我们想将“www”放入你的域名中，首先你得测试你的服务器{HTTP_HOST}变量，看www.是否已经存在，如果没有那么定向到期望的主机名：<br />
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]<br />
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]<br />
这里{HTTP_HOST}是一个Apache服务器变量，我们必须加一个“%”字符再之前。正则表达式以“!”开始表示如果正则不匹配那么条件成立。我 们当然也要转义“.”字符，将其作为一个普通字面字符而不是表示所有字符。再最后我们还加了一个忽略大小写的[NC]FLAG。<br />
RewriteRule匹配了零或者任意一个字符，并且定向到http://www.example.com加上原来{REQUEST_URI}值。R=301向服务器提出301请求，表明这是一个永久转向，最后一个[L]表示已经完成这段正则匹配。<br />
RewriteCond也可以创建原子，在RewriteRule中原子是以$1…..$9表示，但是在RewriteCond中是以%1….%9表示。</p>
<p><strong>mod_rewrite注释<br />
</strong>任何mod_rewrite代码之前都要加上RewriteEngine on这个状态，另外RewriteEngine on还可以用到其他地方。作为一个好的程序员，你知道注释对于程序来说是多么的重要。</p>
<p>mod_rewrite允许在RewriteEngine off 与RewriteEngine on之间加上你的注释：<br />
RewriteEngine off<br />
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]<br />
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]<br />
RewriteEngine on<br />
以上所有的程序代码都不会被执行，RewriteEngine状态值的改变对新的mod_rewrite 代码开发非常有用。像你在PHP里面用/* &#8230; */注释一样，好好的运用他们。</p>
<p><strong>例子：用新的格式展示当前URI<br />
</strong>如果这就是我们当前正在运行的URLs：/index.php?id=nnnn。我们非常希望将其更改成/nnnn并且让搜索引擎以新格式展现。首先，我 们为了让搜索引擎更新成新的，得将旧的URLs重定向到新的格式，但是，我们还得保证以前的index.php照样能够运行。是不是被我搞迷糊了？<br />
实现以上功能，诀窍就在于在查询变量中加了一个访问者看不到的标记符“marker”。我们只将查询变量中没有出现“marker”标记的链接进行重定 向，然后将原有的链接替换成新的格式，并且通过[QSA]FLAG在已有的参数加一个“marker”标记。以下为实现的方式：<br />
RewriteCond %{QUERY_STRING} !marker<br />
RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_+]+)<br />
RewriteRule ^/?index\.php$ %1? [R=301,L]<br />
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?marker &amp;id=$1 [L]<br />
这里，原先的URL：http://www.example.com/index.php?id=nnnn,不包含marker，所以被第一个规则永久重 定向到http://www.example.com/nnnn，第二个规则将http://www.example.com/nnnn反定向到 http://www.example.com/index.php?marker &amp;id=nnnn，并且加了marker以及id=nnnn两个变量，最后mod_rewrite就开始进行处理过程。<br />
第二次匹配，marker被匹配，所以忽略第一条规则，这里有一个“.”字符会出现在http://www.example.com/index.php?marker &amp;id=nnnn中，所以第二条规则也会被忽略，这样我们就完成了。<br />
注意，这个解决方案要求Apache的一些扩展功能，所以如果你的网站放于在共享主机中会遇到很多障碍。<br />
了解更多：http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html</p>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li><a href="http://woodfeed.com/php-code-for-301-redirect/" title="简单PHP代码实现301地址重定向">简单PHP代码实现301地址重定向</a><br /><small>重定向就是将网页自动转向重定向，即：301永久性重定向和302临时性重定向。实施301后...</small></li></ul>]]></content:encoded>
			<wfw:commentRss>http://woodfeed.com/apache-mod_rewrite-for-301-redirect/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
