<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[Decell.org]]></title>
  <subtitle type="html"><![CDATA[心坚石也穿]]></subtitle>
  <id>http://www.decell.org/</id> 
  <link rel="alternate" type="text/html" href="http://www.decell.org/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.decell.org/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.4.1022">PJBlog2</generator> 
  <updated>2010-07-28T18:35:15+08:00</updated> 

  <entry>
	  <title type="html"><![CDATA[家里面的龟生蛋了]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=9" label="生活日记" /> 
	  <updated>2010-07-28T18:35:15+08:00</updated>
	  <published>2010-07-28T18:35:15+08:00</published>
		  <summary type="html"><![CDATA[家里面的乌龟前几天居然生蛋了。之前一直搞不清它是男的还是女的，这下搞清楚。养了近20年了，值得庆贺一下。网上搜了一下，原来家里面养的龟生蛋这事情还算常见的，有的还居然每年产40颗，但多都是巴西龟。想起之前去南沙，在一个龟池里面看到的全都是巴西龟，就觉得很惨。巴西龟作为一种外来物种，繁殖能力超强，适应能力超强，快要把本地龟都赶绝了。所以我一直都不喜欢别人养巴西龟，这东西外表没什么，杀伤力极强。祝贺一下我家里的本地龟吧，呵呵，争气一点！]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=133" /> 
	  <id>http://www.decell.org/default.asp?id=133</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[《微软模拟飞行2004》]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=9" label="生活日记" /> 
	  <updated>2010-07-16T00:47:14+08:00</updated>
	  <published>2010-07-16T00:47:14+08:00</published>
		  <summary type="html"><![CDATA[时隔4年，再次玩起《微软模拟飞行2004》.已经完全忘了当时是怎么玩的了，只依稀记得几个热键，例如切换视角之类什么的。这两天摸了一下，感觉又回来了。当然只能飞些比较先进的大型飞机，例如777-400之类的，原因是大飞机比较好操控，而且有完善的自动飞行模式。感觉还是非常不错，微软模拟飞行这款游戏应该是飞行模拟游戏里面最真实的一款了。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=132" /> 
	  <id>http://www.decell.org/default.asp?id=132</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Verilog HDL 综合要点[2] - 循环的综合 part1]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=6" label="嵌入式技术" /> 
	  <updated>2010-06-24T17:33:49+08:00</updated>
	  <published>2010-06-24T17:33:49+08:00</published>
		  <summary type="html"><![CDATA[1.周期性行为中的循环如果迭代次数在仿真前能由编译器确定(即迭代次数是固定的并且与数据无关)，这种循环被称为是静态的或是独立的。如果循环次数石油运算中的某个变量决定的，则这种循环称做是与数据相关的。<br/><br/>2.原则上说，静态循环能够用repeat，for，while和forever来综合，但是一个特定的厂商可能会选择将静态循环的描述风格限定为对某个特定结构的描述。最实用的循环形式是for循环，那些没有内部定时控制的非静态循环会引发问题，它们不能综合。<br/><br/>3.对于不带内嵌定时控制的静态循环，那么他的计算动作是一个隐式的组合。这种循环可以通过展开，不用存储器且在瞬间完成。<br/><br/>4.如果一个静态循环有内嵌的边沿敏感事件表达式，该循环的计算行为可以被同步并且分布到一个或多个时钟周期上。该行为就是循环的每次迭代都在时钟沿之后进行的模糊状态机。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=131" /> 
	  <id>http://www.decell.org/default.asp?id=131</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Verilog HDL 综合要点[1] - mux结构及条件补全]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=6" label="嵌入式技术" /> 
	  <updated>2010-06-19T13:55:14+08:00</updated>
	  <published>2010-06-19T13:55:14+08:00</published>
		  <summary type="html"><![CDATA[1.&nbsp;如果case语句或者if&nbsp;-&nbsp;else&nbsp;-&nbsp;if语句中的条件语句不是互为唯一的，那么该语句将被综合为优先级结构；如果条件语句唯一，则被综合为mux结构。<br/>//综合为优先级结构<br/>always&nbsp;@(data)&nbsp;begin<br/>&#160;&#160;&#160;&#160;casex(data)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b1xxx_xxxx&nbsp;:&nbsp;code&nbsp;=&nbsp;7;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b01xx_xxxx&nbsp;:&nbsp;code&nbsp;=&nbsp;6;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b001x_xxxx&nbsp;:&nbsp;code&nbsp;=&nbsp;5;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0001_xxxx&nbsp;:&nbsp;code&nbsp;=&nbsp;4;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_1xxx&nbsp;:&nbsp;code&nbsp;=&nbsp;3;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_01xx&nbsp;:&nbsp;code&nbsp;=&nbsp;2;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_001x&nbsp;:&nbsp;code&nbsp;=&nbsp;1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_0001&nbsp;:&nbsp;code&nbsp;=&nbsp;0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;:&nbsp;code&nbsp;=&nbsp;3&#39;bx;<br/>&#160;&#160;&#160;&#160;endcase<br/>end<br/>//综合为mux结构<br/>always&nbsp;@(data)&nbsp;begin<br/>&#160;&#160;&#160;&#160;case(data)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_0001:&nbsp;code&nbsp;=&nbsp;0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_0010:&nbsp;code&nbsp;=&nbsp;1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_0100:&nbsp;code&nbsp;=&nbsp;2;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0000_1000:&nbsp;code&nbsp;=&nbsp;3;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0001_0000:&nbsp;code&nbsp;=&nbsp;4;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0010_0000:&nbsp;code&nbsp;=&nbsp;5;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b0100_0000:&nbsp;code&nbsp;=&nbsp;6;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8&#39;b1000_0000:&nbsp;code&nbsp;=&nbsp;7;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default:&nbsp;code&nbsp;=&nbsp;3&#39;bx;<br/>&#160;&#160;&#160;&#160;endcase<br/>end<br/><br/>2.&nbsp;如果case或if&nbsp;-&nbsp;else&nbsp;-&nbsp;if&nbsp;语句中语句是完整的，也就是各种条件可能都出现了，则不需要综合出锁存器。如果确实有条件是无关紧要的，或是根本不可能出现的，通过使用带任意值的default语句或else语句补全，可以缩减实现的器件尺寸<br/>//完全不会产生锁存的设计<br/>always&nbsp;@(data_3&nbsp;o&#114;&nbsp;data_2&nbsp;o&#114;&nbsp;data_1&nbsp;o&#114;&nbsp;data_0&nbsp;o&#114;&nbsp;sel&#101;ct)&nbsp;begin<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;case&nbsp;(sel&#101;ct)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0:&nbsp;mux_in&nbsp;=&nbsp;data_3;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;1:&nbsp;mux_in&nbsp;=&nbsp;data_2;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;2:&nbsp;mux_in&nbsp;=&nbsp;data_1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;3:&nbsp;mux_in&nbsp;=&nbsp;data_0;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default:&nbsp;mux_in&nbsp;=&nbsp;32&#39;bx;<br/>&#160;&#160;&#160;&#160;endcase<br/>end<br/>//这样也不会产生锁存，因为default语句补全了case语句<br/>always&nbsp;@(data_3&nbsp;o&#114;&nbsp;data_2&nbsp;o&#114;&nbsp;data_1&nbsp;o&#114;&nbsp;data_0&nbsp;o&#114;&nbsp;sel&#101;ct)&nbsp;begin<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;case&nbsp;(sel&#101;ct)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0:&nbsp;mux_in&nbsp;=&nbsp;data_3;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;1:&nbsp;mux_in&nbsp;=&nbsp;data_2;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;2:&nbsp;mux_in&nbsp;=&nbsp;data_1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//3:&nbsp;mux_in&nbsp;=&nbsp;data_0;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default:&nbsp;mux_in&nbsp;=&nbsp;32&#39;bx;<br/>&#160;&#160;&#160;&#160;endcase<br/>end<br/>//这样需要锁存<br/>always&nbsp;@(data_3&nbsp;o&#114;&nbsp;data_2&nbsp;o&#114;&nbsp;data_1&nbsp;o&#114;&nbsp;data_0&nbsp;o&#114;&nbsp;sel&#101;ct)&nbsp;begin<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;case&nbsp;(sel&#101;ct)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0:&nbsp;mux_in&nbsp;=&nbsp;data_3;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;1:&nbsp;mux_in&nbsp;=&nbsp;data_2;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;2:&nbsp;mux_in&nbsp;=&nbsp;data_1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//3:&nbsp;mux_in&nbsp;=&nbsp;data_0;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//default:&nbsp;mux_in&nbsp;=&nbsp;32&#39;bx;<br/>&#160;&#160;&#160;&#160;endcase<br/>end]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=130" /> 
	  <id>http://www.decell.org/default.asp?id=130</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[时差]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=9" label="生活日记" /> 
	  <updated>2010-06-10T13:17:32+08:00</updated>
	  <published>2010-06-10T13:17:32+08:00</published>
		  <summary type="html"><![CDATA[今天早上，手机的闹钟把我叫醒了。一看，哦，5点45分，刚刚好。穿衣服，洗面，准备走人。临行前看到外面有小雨，于是发一短信给文彬兄：外面有雨，不过不是很大。过了两分钟没有回应，再发一条：照走！遂摔门而出。电梯到楼下，看到宿舍楼门开着，心想：怎么今天阿姨这么早就开门了。。。步行到文彬楼下，等了5分钟不见人影。心想：那小子睡过头了？于是想杀上去宿舍。经过宿管值班室门口，不经意间看一下钟：6点50分！不会吧！怎么回事！难道这个宿舍的钟坏了？连忙杀回自己宿舍。途中看了一眼饭堂，门开着。不妙，正常情况下饭堂没有这么早开门的。到自己宿舍楼下一看，真的是6点50分。。。连忙回宿舍看一下手机：6点12分。。。我靠#@#￥！！@￥&nbsp;搞什么国际大飞机！自己给自己加了40分钟的时差？]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=129" /> 
	  <id>http://www.decell.org/default.asp?id=129</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[增程]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=9" label="生活日记" /> 
	  <updated>2010-06-07T15:06:06+08:00</updated>
	  <published>2010-06-07T15:06:06+08:00</published>
		  <summary type="html"><![CDATA[经过40分钟不停歇地游啊游，今天达到了破纪录的1.2KM。同时也开始怀疑究竟在60分钟内游3KM的真实性了。要是能游2KM，就很不错了，嗯嗯。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=128" /> 
	  <id>http://www.decell.org/default.asp?id=128</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[试水]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=9" label="生活日记" /> 
	  <updated>2010-06-01T15:02:40+08:00</updated>
	  <published>2010-06-01T15:02:40+08:00</published>
		  <summary type="html"><![CDATA[今天终于实行了游泳大计了。5点半爬起床，六点3开始游，四个来回就已经顶不住了。投降逃掉，上水的时候听到一老婆婆问旁边的老伯伯：“今天游多少了？”答曰：“没多少，就3千。”&nbsp;狂汗...不能输给老伯伯！]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=127" /> 
	  <id>http://www.decell.org/default.asp?id=127</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[【转】CPU地址空间]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=6" label="嵌入式技术" /> 
	  <updated>2010-05-30T22:35:58+08:00</updated>
	  <published>2010-05-30T22:35:58+08:00</published>
		  <summary type="html"><![CDATA[转自：<a href="http://joe.is-programmer.com/posts/17559.html" target="_blank">http://joe.is-programmer.com/posts/17559.html</a><br/>CPU地址空间<br/>（一）地址的概念<br/><br/>1）物理地址：CPU地址总线传来的地址，由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的，但也常被映射到其他存储器上&nbsp;（如显存、BIOS等）。在程序指令中的虚拟地址经过段映射和页面映射后，就生成了物理地址，这个物理地址被放到CPU的地址线上。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;物理地址空间，一部分给物理RAM（内存）用，一部分给总线用，这是由硬件设计来决定的，因此在32&nbsp;bits地址线的x86处理器中，物理地址空间是2的32次方，即4GB，但物理RAM一般不能上到4GB，因为还有一部分要给总线用（总线上还挂着别的&nbsp;许多设备）。在PC机中，一般是把低端物理地址给RAM用，高端物理地址给总线用。<br/>&nbsp;<br/>2）总线地址：总线的地址线或在地址周期上产生的信号。外设使用的是总线地址，CPU使用的是物理地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;物理地址与总线地址之间的关系由系统的设计决定的。在x86平台上，物理地址就是总线地址，这是因为它们共享相同的地址空间——这句话有点难理解，详见下&nbsp;面的“独立编址”。在其他平台上，可能需要转换/映射。比如：CPU需要访问物理地址是0xfa000的单元，那么在x86平台上，会产生一个PCI总线&nbsp;上对0xfa000地址的访问。因为物理地址和总线地址相同，所以凭眼睛看是不能确定这个地址是用在哪儿的，它或者在内存中，或者是某个卡上的存储单元，&nbsp;甚至可能这个地址上没有对应的存储器。<br/><br/>3）虚拟地址：现代操作系统普遍采用虚拟内存管理（Virtual&nbsp;Memory&nbsp;Management）机制，这需要MMU（Memory&nbsp;Management&nbsp;Unit）的支持。MMU通常是CPU的一部分，如果处理器没有MMU，或者有MMU但没有启用，CPU执行单元发出的内存地址将直接传到芯片引脚上，被&nbsp;内存芯片（物理内存）接收，这称为物理地址（Physical&nbsp;Address），如果处理器启用了MMU，CPU执行单元发出的内存地址将被MMU截获，从CPU到MMU的地址称为虚拟地址（Virtual&nbsp;Address），而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上，也就是将虚拟地址映射成物理地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Linux中，进程的4GB（虚拟）内存分为用户空间、内核空间。用户空间分布为0~3GB（即PAGE_OFFSET，在0X86中它等于&nbsp;0xC0000000）<br/>，剩下的1G为内核空间。程序员只能使用虚拟地址。系统中每个进程有各自的私有用户空间（0～3G），这个空间对系统中的其他进程是不可见的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPU发出取指令请求时的地址是当前上下文的虚拟地址，MMU再从页表中找到这个虚拟地址的物理地址，完成取指。同样读取数据的也是虚拟地址，比如mov&nbsp;ax,&nbsp;var.&nbsp;编译时var就是一个虚拟地址，也是通过MMU从也表中来找到物理地址，再产生总线时序，完成取数据的。<br/><br/><br/>（二）编址方式<br/>1）外设都是通过读写设备上的寄存器来进行的，外设寄存器也称为“I/O端口”，而IO端口有两种编址方式：独立编址和统一编制。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;统一编址：外设接口中的IO寄存器（即IO端口）与主存单元一样看待，每个端口占用一个存储单元的地址，将主存的一部分划出来用作IO地址空间，如，在&nbsp;PDP-11中，把最高的4K主存作为IO设备寄存器地址。端口占用了存储器的地址空间，使存储量容量减小。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;统一编址也称为“I/O内存”方式，外设寄存器位于“内存空间”（很多外设有自己的内存、缓冲区，外设的寄存器和内存统称“I/O空间”）。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如，Samsung的S3C2440，是32位ARM处理器，它的4GB地址空间被外设、RAM等瓜分：<br/>0x8000&nbsp;1000&nbsp;&nbsp;&nbsp;&nbsp;LED&nbsp;8*8点阵的地址<br/>0x4800&nbsp;0000&nbsp;~&nbsp;0x6000&nbsp;0000&nbsp;&nbsp;SFR（特殊暂存器）地址空间<br/>0x3800&nbsp;1002&nbsp;&nbsp;&nbsp;键盘地址<br/>0x3000&nbsp;0000&nbsp;~&nbsp;0x3400&nbsp;0000&nbsp;&nbsp;SDRAM空间&nbsp;<br/>0x2000&nbsp;0020&nbsp;~&nbsp;0x2000&nbsp;002e&nbsp;&nbsp;IDE<br/>0x1900&nbsp;0300&nbsp;&nbsp;&nbsp;CS8900<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;独立编址（单独编址）：IO地址与存储地址分开独立编址，I/0端口地址不占用存储空间的地址范围，这样，在系统中就存在了另一种与存储地址无关的IO地&nbsp;址，CPU也必须具有专用与输入输出操作的IO指令（IN、OUT等）和控制逻辑。独立编址下，地址总线上过来一个地址，设备不知道是给IO端口的、还是&nbsp;给存储器的，于是处理器通过MEMR/MEMW和IOR/IOW两组控制信号来实现对I/O端口和存储器的不同寻址。如，intel&nbsp;80x86就采用单独编址，CPU内存和I/O是一起编址的，就是说内存一部分的地址和I/O地址是重叠的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;独立编址也称为“I/O端口”方式，外设寄存器位于“I/O（地址）空间”。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于x86架构来说，通过IN/OUT指令访问。PC架构一共有65536个8bit的I/O端口，组成64K个I/O地址空间，编号从&nbsp;0~0xFFFF，有16位，80x86用低16位地址线A0-A15来寻址。连续两个8bit的端口可以组成一个16bit的端口，连续4个组成一个&nbsp;32bit的端口。I/O地址空间和CPU的物理地址空间是两个不同的概念，例如I/O地址空间为64K，一个32bit的CPU物理地址空间是4G。&nbsp;如，在Intel&nbsp;8086+Redhat9.0&nbsp;下用“more&nbsp;/proc/ioports”可看到：<br/>0000-001f&nbsp;:&nbsp;dma1<br/>0020-003f&nbsp;:&nbsp;pic1<br/>0040-005f&nbsp;:&nbsp;timer<br/>0060-006f&nbsp;:&nbsp;keyboard<br/>0070-007f&nbsp;:&nbsp;rtc<br/>0080-008f&nbsp;:&nbsp;dma&nbsp;page&nbsp;reg<br/>00a0-00bf&nbsp;:&nbsp;pic2<br/>00c0-00df&nbsp;:&nbsp;dma2<br/>00f0-00ff&nbsp;:&nbsp;fpu<br/>0170-0177&nbsp;:&nbsp;ide1<br/>……<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过Intel&nbsp;x86平台普通使用了名为内存映射（MMIO）的技术，该技术是PCI规范的一部分，IO设备端口被映射到内存空间，映射后，CPU访问IO端口就如同访&nbsp;问内存一样。看Intel&nbsp;TA&nbsp;719文档给出的x86/x64系统典型内存地址分配表：<br/>系统资源&nbsp;&nbsp;占用<br/>------------------------------------------------------------------------<br/>BIOS&nbsp;&nbsp;1M<br/>本地APIC&nbsp;&nbsp;4K<br/>芯片组保留&nbsp;2M<br/>IO&nbsp;APIC&nbsp;&nbsp;4K<br/>PCI设备&nbsp;&nbsp;256M<br/>PCI&nbsp;Express设备&nbsp;256M<br/>PCI设备（可选）&nbsp;256M<br/>显示帧缓存&nbsp;16M<br/>TSEG&nbsp;&nbsp;1M<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于某一既定的系统，它要么是独立编址、要么是统一编址，具体采用哪一种则取决于CPU的体系结构。&nbsp;如，PowerPC、m68k等采用统一编址，而X86等则采用独立编址，存在IO空间的概念。目前，大多数嵌入式微控制器如ARM、PowerPC等并&nbsp;不提供I/O空间，仅有内存空间，可直接用地址、指针访问。但对于Linux内核而言，它可能用于不同的CPU，所以它必须都要考虑这两种方式，于是它采&nbsp;用一种新的方法，将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域”（I/O&nbsp;region），不论你采用哪种方式，都要先申请IO区域：request_resource()，结束时释放&nbsp;它：release_resource()。<br/>&nbsp;<br/><br/>2）对外设的访问<br/><br/>1、访问I/O内存的流程是：request_mem_region()&nbsp;-&gt;&nbsp;ioremap()&nbsp;-&gt;&nbsp;ioread8()/iowrite8()&nbsp;-&gt;&nbsp;iounmap()&nbsp;-&gt;&nbsp;release_mem_region()&nbsp;。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前面说过，IO内存是统一编址下的概念，对于统一编址，IO地址空间是物理主存的一部分，对于编程而言，我们只能操作虚拟内存，所以，访问的第一步就是要把设备所处的物理地址映射到虚拟地址，Linux2.6下用ioremap():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*ioremap(unsigned&nbsp;long&nbsp;offset,&nbsp;unsigned&nbsp;long&nbsp;size);<br/>然后，我们可以直接通过指针来访问这些地址，但是也可以用Linux内核的一组函数来读写：<br/>ioread8(),&nbsp;iowrite16(),&nbsp;ioread8_rep(),&nbsp;iowrite8_rep()......<br/><br/>2、访问I/O端口<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;访问IO端口有2种途径：I/O映射方式（I/O－mapped）、内存映射方式（Memory－mapped）。前一种途径不映射到内存空间，直接使用&nbsp;intb()/outb()之类的函数来读写IO端口；后一种MMIO是先把IO端口映射到IO内存（“内存空间”），再使用访问IO内存的函数来访问&nbsp;IO端口。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;ioport_map(unsigned&nbsp;long&nbsp;port,&nbsp;unsigned&nbsp;int&nbsp;count);<br/>通过这个函数，可以把port开始的count个连续的IO端口映射为一段“内存空间”，然后就可以在其返回的地址是像访问IO内存一样访问这些IO端口。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=126" /> 
	  <id>http://www.decell.org/default.asp?id=126</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[mail list]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=6" label="嵌入式技术" /> 
	  <updated>2010-04-15T02:23:09+08:00</updated>
	  <published>2010-04-15T02:23:09+08:00</published>
		  <summary type="html"><![CDATA[做了这么久的Linux开发，读了这么多mail&nbsp;list，今天才第一次在mail&nbsp;list说话。说来惭愧，不过看到自己的post出现在list中，那种归属感无可比拟。纪念一下。<br/><br/>------------------------------<br/><br/>Message:&nbsp;5<br/>Date:&nbsp;Wed,&nbsp;14&nbsp;Apr&nbsp;2010&nbsp;14:34:04&nbsp;+0800<br/>From:&nbsp;Terren&nbsp;Chow&nbsp;&lt;terren.chow@gmail.com&gt;<br/>To:&nbsp;linuxppc-dev@lists.ozlabs.org<br/>Subject:&nbsp;Questions&nbsp;about&nbsp;creating&nbsp;a&nbsp;OF&nbsp;platform&nbsp;device<br/>Message-ID:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;q2t9faa26521004132334ta3e05513u2b9b569c47fbe212@mail.gmail.com&gt;<br/>Content-Type:&nbsp;text/plain;&nbsp;charset=&#34;iso-8859-1&#34;<br/><br/>Dear&nbsp;all,<br/>&nbsp;&nbsp;&nbsp;I&#39;m&nbsp;new&nbsp;to&nbsp;PPC&nbsp;Linux&nbsp;development.&nbsp;Recently&nbsp;I&#39;m&nbsp;learning&nbsp;how&nbsp;to&nbsp;write&nbsp;a<br/>Linux&nbsp;device&nbsp;driver&nbsp;on&nbsp;MPC5121&nbsp;based&nbsp;embedded&nbsp;system.&nbsp;I&#39;m&nbsp;just&nbsp;confused<br/>about&nbsp;the&nbsp;OF&nbsp;related&nbsp;code&nbsp;in&nbsp;the&nbsp;kernel.<br/>&nbsp;&nbsp;&nbsp;I&nbsp;know&nbsp;in&nbsp;the&nbsp;Linux&nbsp;device&nbsp;driver&nbsp;model,&nbsp;a&nbsp;driver&nbsp;is&nbsp;attached&nbsp;to&nbsp;a<br/>device&nbsp;through&nbsp;the&nbsp;bus_type&nbsp;methods.&nbsp;For&nbsp;example,&nbsp;the&nbsp;&nbsp;platform_driver&nbsp;is<br/>attached&nbsp;to&nbsp;a&nbsp;platform&nbsp;device&nbsp;through&nbsp;the&nbsp;register_platform_driver()&nbsp;method.<br/>This&nbsp;method&nbsp;will&nbsp;scan&nbsp;over&nbsp;the&nbsp;device&nbsp;list&nbsp;in&nbsp;the&nbsp;bus,&nbsp;and&nbsp;perform&nbsp;probe()<br/>method&nbsp;when&nbsp;the&nbsp;match()&nbsp;method&nbsp;return&nbsp;ok.<br/>&nbsp;&nbsp;My&nbsp;question&nbsp;is,&nbsp;in&nbsp;PPC&nbsp;Linux,&nbsp;there&nbsp;is&nbsp;a&nbsp;structure&nbsp;named&nbsp;*<br/>of_platform_driver*&nbsp;which&nbsp;is&nbsp;similar&nbsp;to&nbsp;*platform_driver*&nbsp;and&nbsp;there&nbsp;is&nbsp;also<br/>a&nbsp;bus_type&nbsp;named&nbsp;*of_platform_bus_type*&nbsp;which&nbsp;is&nbsp;similar&nbsp;to&nbsp;*<br/>platform_bus_type*.&nbsp;But&nbsp;I&nbsp;can&#39;t&nbsp;find&nbsp;any&nbsp;information&nbsp;about&nbsp;the&nbsp;structure<br/>of_platform_device.&nbsp;How&nbsp;do&nbsp;the&nbsp;kernel&nbsp;cr&#101;ate&nbsp;the&nbsp;of_platform_device&nbsp;and<br/>place&nbsp;them&nbsp;into&nbsp;the&nbsp;device&nbsp;list&nbsp;in&nbsp;the&nbsp;*platform_bus_type*&nbsp;?&nbsp;I&nbsp;search&nbsp;the<br/>Internet&nbsp;and&nbsp;I&nbsp;can&#39;t&nbsp;find&nbsp;any&nbsp;information&nbsp;about&nbsp;this.Could&nbsp;anyone&nbsp;give&nbsp;me<br/>some&nbsp;information&nbsp;so&nbsp;that&nbsp;I&nbsp;can&nbsp;find&nbsp;out&nbsp;the&nbsp;magic&nbsp;behind.&nbsp;Thanks!<br/><br/>--<br/>Terren.Chow<br/>College&nbsp;of&nbsp;Informatics,&nbsp;SCAU<br/>Graduate&nbsp;Student<br/>Lab&nbsp;of&nbsp;Embedded&nbsp;System&nbsp;and&nbsp;Wireless&nbsp;Sensor&nbsp;Network<br/>MSN:&nbsp;terren.chow@hotmail.com]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=124" /> 
	  <id>http://www.decell.org/default.asp?id=124</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[关于串口的CTS与RTS]]></title>
	  <author>
		 <name>admin</name>
		 <uri>http://www.decell.org/</uri>
		 <email>decell@163.com</email>
	  </author>
	  <category term="" scheme="http://www.decell.org/default.asp?cateID=6" label="嵌入式技术" /> 
	  <updated>2009-11-18T19:47:35+08:00</updated>
	  <published>2009-11-18T19:47:35+08:00</published>
		  <summary type="html"><![CDATA[本文转自<a href="http://www.edacn.net/html/89/118589-49762.html" target="_blank">http://www.edacn.net/html/89/118589-49762.html</a><br/><br/>网上看到一篇很好的说明CTS与RTS作用的讨论，转过来保存。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;很久很久以前，计算机还没有出现，那时就已经存在了(计算机)史前的串口设备(电传打字机，工控测量设备，通信调制解调器)，为了连接这些串口，EIA制定了RS232标准，采用DB25接插件，支持同步和异步串口，D型的接口可以有效防止插反。标准化给使用带来了便利。<br/>&nbsp;&nbsp;&nbsp;&nbsp;时光荏苒，个人计算机出现了，这些已有的串口设备毫无疑问地成为了最初的外设，自然而然地RS232标准被个人计算机采纳。但是设备制造商倾向于体积更小，成本更低的接口，因此，将DB25中未使用的和支持同步模式的引脚去掉，形成DB9。最初的情况相当混乱，因为DB9只定义了信号，却没有指定信号和引脚的对应关系，各个制造商只能自行定义。幸运的是，IBM的PC成了工业标准，DB9逐渐统一到IBM的定义上来。<br/>&nbsp;&nbsp;&nbsp;&nbsp;DB9只有9根线，遵循RS232标准。定义如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;DTR,DSR------DTE设备准备好/DCE设备准备好。主流控信号。<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTS,CTS------&nbsp;请求发送/清除发送。用于半双工时，收发切换。属于辅助流控信号。半双工的意思是说，发的时候不收，收的时候不发。那么怎么区分收发呢？缺省时是DCE向&nbsp;DTE发送数据，当DTE决定向DCE发数据时，先有效RTS，表示DTE希望向DCE发送，一般DCE不能马上转换收发状态，DTE就通过监测CTS是否有效来判断可否发送，这样避免了DTE在DCE未准备好时发送所导致的数据丢失。<br/>&nbsp;&nbsp;&nbsp;&nbsp;全双工时，这两个信号一直有效即可。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;随着计算机的日益普及，很多非RS232的串口也要接入PC机，如果为每一种新出现的串口都增加一个新的I/O口显然不现实，因为PC后面板位置有限，因此，将RS232串口和非RS232串口都通过RS232口接入是最佳方案。UART的U(通用)指的就是这个意思。早期ROM&nbsp;BIOS和DOS里的通信软件都是为RS232设计的，在没有检测到DCD有效前不会发送数据，因此，就连发送一个字符这样朴素的应用也要给出DCD、&nbsp;DTR、DSR等控制信号。因此，串口接头上要将一些控制线短接，或者干脆绕过系统软件自己写通信程序。<br/>&nbsp;&nbsp;&nbsp;&nbsp;到此，UART的涵义就总结为：通用的&nbsp;异步&nbsp;(串行)&nbsp;I/O口。<br/>&nbsp;&nbsp;&nbsp;&nbsp;就在UART冠以通用二字，准备一统江湖的时候，制造商们不满于它的速度、体积和灵活性(软件可配置)，推出了USB和1394串口。目前，笔记本上的&nbsp;UART串口有被取消的趋势，因而有网友发出了“没有串口，吾谁与归”的慨叹，古今多少事，都付笑谈中，USB取代UART是后话，暂且不表。<br/>&nbsp;&nbsp;&nbsp;&nbsp;话说自从贺氏(Hayes)公司推出了聪明猫(SmartModem)，他们制定的MODEM接口就成了业界标准，自此以后，所有公司制造的兼容猫都符合贺氏标准(连AT指令也兼容，大家一起抄他呗)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;细观贺氏制定的MODEM串口，与RS232标准大不相同。DTR在整个通信过程中一直保持有效，DSR在MODEM上电后/可以拨号前有效(取决于软件对&nbsp;DSR的理解)，在通信过程的任意时刻，只要DTR/DSR无效，通信过程立即终止。在某种意义上，这也可以算是流控，但肯定不是RS232所指的那种主流控。如果拘泥于RS232，你是不会理解DTR和DSR的用途的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;贺氏不但改了DTR和DSR，竟然连RTS和CTS的涵义也重新定义了。因此，RTS和CTS已经不具有最开始的意义了。从字面理解RTS和CTS，是用于半双工通信的，当DTE想从收模式改为发模式时，就有效RTS请求发送，DCE收到RTS请求后不能立即完成转换，需要一段时间，然后有效CTS通知DTE：DCE已经转到发模式，DTE可以开始发送了。在全双工时，RTS和CTS都缺省置为有效即可。然而，在贺氏的MODEM串口定义中，RTS和CTS用于硬件流控，和什么劳什子的全双工/半双工一点关系也没有。<br/>&nbsp;&nbsp;&nbsp;&nbsp;注意，硬件流控是靠软件实现的，之所以强调“硬件”二字，仅仅是因为硬件流控提供了用于流量情况指示的硬件连线，并不是说，你只要把线连上，硬件就能自己流控。如果软件不支持，光连上RTS和CTS是没有用的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTS和CTS硬件流控的软件算法如下：(RTS有效表示PC机可以收，CTS有效表示MODEM可以收，这两个信号互相独立，分别指示一个方向的流量情况。)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;dengm&nbsp;发表于&nbsp;2005-1-14&nbsp;07:52&nbsp;侃单片机<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;PC端处理：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发.&nbsp;当&nbsp;发现（不一定及时发现）&nbsp;CTS&nbsp;(-3v&nbsp;to&nbsp;-15v)无效时，停止发送,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当&nbsp;发现（不一定及时发现）&nbsp;CTS&nbsp;(3v&nbsp;to&nbsp;15v)有效时，恢复发送；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;收.&nbsp;0&lt;M&lt;N&lt;LEN_OF_RX_BUFFERS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当接收buffers中的bytes&lt;M&nbsp;时，给&nbsp;RTS&nbsp;有效信号（+3v&nbsp;to&nbsp;+15v),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当接收buffers中的bytes&gt;N&nbsp;时，给&nbsp;RTS&nbsp;无效信号（-3v&nbsp;to&nbsp;-15v);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;MODEM端处理：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同上，但RTS与CTS交换。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.decell.org/default.asp?id=123" /> 
	  <id>http://www.decell.org/default.asp?id=123</id> 
  </entry>	
		
</feed>