第一篇:IO总结
输入和输出
IO分类输入 和 输出 流节点流 和 处理流字节流(byte)和 字符流(char)
输入流
字节流
抽象基类 InputStream
读取文件的 FileInputStream
缓冲流 BufferedInputStream
读取各种java基本数据类型的 DataInputStream
读取对象 ObjectInputStream
字符流
抽象基类 Reader
读取文本文件的 FileReader
实现缓冲的 BufferedRead 读取一个行 readLine();newline()输出流
字节流
抽象基类 OutputStream
写文件的 FileOutputStream
缓冲输出流 BufferedOutputStream
写各种java基本数据类型的 DataOutputStream
写对象的 ObjectOutputStreamwriteObject(Object obj);字符流
对象的序列化
一个对象所属的类如果实现java.io.Serializable
则这个类是序列化类,此类创建的对象就是序列化对象 序列化对象可以通过文件流在文件中进行读和写。
第二篇:关于磁盘IO的总结
磁盘IO的总结:
1.IO读写:磁盘是用来存取数据的。磁盘的存数据对应IO的写操作,磁盘的取数据对应IO的读操作。
2.随机访问(Random Access)与连续访问(Sequential Access):
随机访问指的是本次IO所给出的扇区地址和上次IO给出扇区地址相差比较大,这样的话磁头在两次IO操作之间需要做比较大的移动动作才能重新开始读/写数据。
同理,连续访问就是两次给出的扇区地址相近,磁头就能很快的进行操作,这样的多个IO操作就是连续访问。
3.顺序IO模式(Queue Mode)/并发IO模式(BurstMode):
原理:磁盘控制器可能会一次对磁盘组发出一连串的IO命令,如果磁盘组一次只能执行一个IO命令时称为顺序IO;当磁盘组能同时执行多个IO命令时,称为并发IO。
并发IO只能发生在由多个磁盘组成的磁盘组上,单块磁盘只能一次处理一个IO命令。
4.IOPS,IO系统每秒所执行IO操作的次数
5.一次完整的磁盘IO操作:
当控制器对磁盘发出一个IO操作命令的时候,磁盘的驱动臂(ActuatorArm)带读写磁头(Head)离开着陆区(LandingZone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的磁道(Track)的正上方,这个过程被称为寻址(Seeking),对应消耗的时间被称为寻址时间(SeekTime);但是找到对应磁道还不能马上读取数据,这时候磁头要等到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上方的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(RotationalDelay);接下来就随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(DataTransfer),对应的时间称为传送时间(TransferTime)。完成这三个步骤之后一次IO操作也就完成了。
6.传输速度(Transfer Rate)/吞吐率(Throughput):是磁盘在实际使用的时候从磁盘系统总线上流过的数据量。
7.IO响应时间也被称为IO延时(IOLatency),IO响应时间就是从操作系统内核发出的一个读或者写的IO命令到操作系统内核接收到IO回应的时间,注意不要和单个IO时间混淆了,单个IO时间仅仅指的是IO操作在磁盘内部处理的时间,而IO响应时间还要包括IO操作在IO等待队列中所花费的等待时间。
8.dd命令 dd:硬拷贝命令(直接在硬盘上进行数据拷贝,没有经过内存,二进制之间的协调复制)
bs=BYTES:一次读取和写入的字节数(单元大小)
count=BLOCKS:单元数量
if=FILE:源文件
of=FILE:目标文件
测试磁盘的写入:
[root@localhost ~]# /usr/bin/time dd if=/dev/zero of=/tmp/hx bs=4k count=10240 10240+0 records in 10240+0 records out 41943040 bytes(42 MB)copied, 0.0577 s, 727 MB/s 0.00user 0.05system 0:00.05elapsed 96%CPU(0avgtext+0avgdata 832maxresident)k 0inputs+81920outputs(0major+241minor)pagefaults 0swaps
测试磁盘的读取:
[root@localhost ~]# /usr/bin/time dd if=/tmp/hx of=/dev/null bs=4k 10240+0 records in 10240+0 records out 41943040 bytes(42 MB)copied, 0.014955 s, 2.8 GB/s 0.00user 0.01system 0:00.01elapsed 86%CPU(0avgtext+0avgdata 828maxresident)k 0inputs+0outputs(0major+240minor)pagefaults 0swaps
读写同时测试
[root@localhost ~]# /usr/bin/time dd if=/tmp/foo of=/tmp/foo2 bs=4k 10240+0 records in 10240+0 records out 41943040 bytes(42 MB)copied, 0.0742246 s, 565 MB/s 0.00user 0.08system 0:00.08elapsed 97%CPU(0avgtext+0avgdata 828maxresident)k 0inputs+81952outputs(0major+240minor)pagefaults 0swaps 9.[root@localhost ~]# iostat-x Linux 2.6.32-573.el6.x86_64(localhost.localdomain)03/16/2016 _x86_64_(12 CPU)
avg-cpu: %user
%nice %system %iowait %steal
%idle
0.09
0.00
0.06
0.02
0.00
99.82
Device:
rrqm/s
wrqm/s
r/s
w/s
rsec/s
wsec/s avgrq-sz avgqu-sz
await svctm %util sda
8.30
68.47
7.61
2.27
363.21
565.82
94.05
0.05
5.32
0.40
0.39 各个性能指标的简单说明。rrqm/s 每秒进行merge的读操作数目。wrqm/s 每秒进行merge的写操作数目。r/s 每秒完成的读I/O设备次数。w/s 每秒完成的写I/O设备次数。rsec/s 每秒读扇区数。wsec/s 每秒写扇区数。rkB/s 每秒读K字节数。wkB/s 每秒写K字节数。avgrq-sz平均每次设备I/O操作的数据大小(扇区)。avgqu-sz平均I/O队列长度。await平均每次设备I/O操作的等待时间(毫秒)。svctm平均每次设备I/O操作的服务时间(毫秒)。%util 一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。
平均单次IO大小(IO Chunk Size)<=>avgrq-sz
平均IO响应时间(IO Response Time)<=>await
IOPS(IO per Second)<=> r/s + w/s
吞吐率(Throughtput)<=> rkB/s + wkB/s
10.fio是一个非常灵活的io测试工具,他可以通过多线程或进程模拟各种io操作。
fio分顺序读,随机读,顺序写,随机写,混合随机读写模式。参数:
filename: 指定文件(设备)的名称。可以通过冒号分割同时指定多个文件,如filename=/dev/sda:/dev/sdb。
directory: 设置filename的路径前缀。在后面的基准测试中,采用这种方式来指定设备。
name: 指定job的名字,在命令行中表示新启动一个job。
direct: bool类型,如果设置成true(1),表示不使用io buffer。
ioengine: I/O引擎,现在fio支持19种ioengine。默认值是sync同步阻塞I/O,libaio是Linux的native异步I/O。
iodepth: 如果ioengine采用异步方式,该参数表示一批提交保持的io单元数。
rw: I/O模式,随机读写,顺序读写等等。
bs: I/O block大小,默认是4k。
size: 指定job处理的文件的大小。
numjobs: 指定job的克隆数(线程)。
time_based: 如果在runtime指定的时间还没到时文件就被读写完成,将继续重复知道runtime时间结束。
runtime: 指定在多少秒后停止进程。如果未指定该参数,fio将执行至指定的文件读写完全完成。
group_reporting: 当同时指定了numjobs了时,输出结果按组显示。
例: #顺序读
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=read-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest
#顺序写
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=write-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest
#随机读
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=randread-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest #随机写
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=randwrite-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=1000-group_reporting-name=mytest
#混合随机读写
fio-filename=/dev/sda-direct=1-iodepth 1-thread-rw=randrw-rwmixread=70-ioengine=psync-bs=16k-size=200G-numjobs=30-runtime=100-group_reporting-name=mytest-ioscheduler=noop
补充:
上次测试的三块固态硬盘IO:
0.55到2K的小文件
[root@localhost 1]# fio-filename=/data/B/1/2-direct=1-iodepth 1-thread-rw=randrw-rwmixread=80-ioengine=psync-bsrange=512-2048-size=4G-numjobs=5-group_reporting-name=test-runtime=1200 test:(g=0): rw=randrw, bs=512-2K/512-2K, ioengine=psync, iodepth=1...test:(g=0): rw=randrw, bs=512-2K/512-2K, ioengine=psync, iodepth=1 fio 2.0.7 Starting 5 threads test: Laying out IO file(s)(1 file(s)/ 4096MB)Jobs: 5(f=5): [mmmmm] [100.0% done] [8319K/2060K /s] [9870 /2498 iops] [eta 00m:00s] test:(groupid=0, jobs=5): err= 0: pid=29601
read : io=11152MB, bw=9515.1KB/s, iops=9183 , runt=1200079msec
clat(usec): min=0 , max=1000.3K, avg=468.07, stdev=1981.20
lat(usec): min=0 , max=1000.3K, avg=468.42, stdev=1981.20
clat percentiles(usec):
| 1.00th=[ 189], 5.00th=[ 211], 10.00th=[ 225], 20.00th=[ 249],| 30.00th=[ 274], 40.00th=[ 294], 50.00th=[ 318], 60.00th=[ 350],| 70.00th=[ 382], 80.00th=[ 430], 90.00th=[ 516], 95.00th=[ 596],| 99.00th=[ 844], 99.50th=[ 5088], 99.90th=[32128], 99.95th=[42240],| 99.99th=[58624]
bw(KB/s): min= 159, max= 6607, per=20.03%, avg=1905.53, stdev=328.56
write: io=2789.3MB, bw=2379.2KB/s, iops=2297 , runt=1200079msec
clat(usec): min=0 , max=1000.2K, avg=283.77, stdev=1432.42
lat(usec): min=0 , max=1000.2K, avg=284.21, stdev=1432.42
clat percentiles(usec):
| 1.00th=[
89], 5.00th=[ 110], 10.00th=[ 137], 20.00th=[ 153],| 30.00th=[ 165], 40.00th=[ 175], 50.00th=[ 189], 60.00th=[ 207],| 70.00th=[ 239], 80.00th=[ 302], 90.00th=[ 386], 95.00th=[ 458],| 99.00th=[ 660], 99.50th=[ 1976], 99.90th=[20352], 99.95th=[27520],| 99.99th=[43264]
bw(KB/s): min=
60, max= 1769, per=20.03%, avg=476.50, stdev=87.73
lat(usec): 2=0.08%, 100=0.51%, 250=29.98%, 500=59.64%, 750=8.40%
lat(usec): 1000=0.63%
lat(msec): 2=0.10%, 4=0.11%, 10=0.19%, 20=0.08%, 50=0.23%
lat(msec): 100=0.03%, 250=0.01%, 500=0.01%, 1000=0.01%, 2000=0.01%
cpu
: usr=6.13%, sys=37.70%, ctx=101478124, majf=0, minf=24056
IO depths
: 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit
: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued
: total=r=11021114/w=2757348/d=0, short=r=0/w=0/d=0
Run status group 0(all jobs):
READ: io=11152MB, aggrb=9515KB/s, minb=9515KB/s, maxb=9515KB/s, mint=1200079msec, maxt=1200079msec
WRITE: io=2789.3MB, aggrb=2379KB/s, minb=2379KB/s, maxb=2379KB/s, mint=1200079msec, maxt=1200079msec
Disk stats(read/write):
sda: ios=11020977/2758079, merge=0/69, ticks=4004421/515149, in_queue=4514919, util=98.00%
10M的大文件
[root@localhost 1]# fio-filename=/data/B/1/10-direct=1-iodepth 1-thread-rw=randrw-rwmixread=80-ioengine=psync-bs=10M-size=10G-numjobs=10
-group_reporting-name=test-runtime=1800 test:(g=0): rw=randrw, bs=10M-10M/10M-10M, ioengine=psync, iodepth=1...test:(g=0): rw=randrw, bs=10M-10M/10M-10M, ioengine=psync, iodepth=1 fio 2.0.7 Starting 10 threads test: Laying out IO file(s)(1 file(s)/ 10240MB)Jobs: 4(f=4): [_m___mm_m_] [99.0% done] [220.2M/104.9M /s] [21 /10 iops] [eta 00m:03s]]
test:(groupid=0, jobs=10): err= 0: pid=29618
read : io=81910MB, bw=270613KB/s, iops=26 , runt=309948msec
clat(msec): min=15 , max=1006 , avg=334.89, stdev=102.97
lat(msec): min=15 , max=1006 , avg=334.89, stdev=102.97
clat percentiles(msec):
| 1.00th=[ 123], 5.00th=[ 157], 10.00th=[ 200], 20.00th=[ 249],| 30.00th=[ 289], 40.00th=[ 318], 50.00th=[ 343], 60.00th=[ 363],| 70.00th=[ 383], 80.00th=[ 412], 90.00th=[ 449], 95.00th=[ 482],| 99.00th=[ 578], 99.50th=[ 766], 99.90th=[ 963], 99.95th=[ 979],| 99.99th=[ 1004]
bw(KB/s): min= 7076, max=64912, per=10.25%, avg=27750.67, stdev=7359.31
write: io=20490MB, bw=67694KB/s, iops=6 , runt=309948msec
clat(msec): min=24 , max=752 , avg=161.82, stdev=105.86
lat(msec): min=25 , max=753 , avg=162.61, stdev=105.84
clat percentiles(msec):
| 1.00th=[
27], 5.00th=[
33], 10.00th=[
34], 20.00th=[
51],| 30.00th=[
54], 40.00th=[ 103], 50.00th=[ 178], 60.00th=[ 206],| 70.00th=[ 233], 80.00th=[ 260], 90.00th=[ 297], 95.00th=[ 326],| 99.00th=[ 392], 99.50th=[ 416], 99.90th=[ 644], 99.95th=[ 725],| 99.99th=[ 750]
bw(KB/s): min= 7398, max=82447, per=29.87%, avg=20218.16, stdev=9671.17
lat(msec): 20=0.01%, 50=3.69%, 100=4.55%, 250=23.75%, 500=65.39%
lat(msec): 750=2.18%, 1000=0.42%, 2000=0.01%
cpu
: usr=0.61%, sys=6.94%, ctx=600392, majf=0, minf=12529
IO depths
: 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit
: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued
: total=r=8191/w=2049/d=0, short=r=0/w=0/d=0
Run status group 0(all jobs):
READ: io=81910MB, aggrb=270612KB/s, minb=270612KB/s, maxb=270612KB/s, mint=309948msec, maxt=309948msec
WRITE: io=20490MB, aggrb=67694KB/s, minb=67694KB/s, maxb=67694KB/s, mint=309948msec, maxt=309948msec
Disk stats(read/write):
sda: ios=261982/65792, merge=0/96, ticks=40438645/1040942, in_queue=41479880, util=100.00%
第三篇:IO企业文化
IO的企业文化是什么:
【企业文化】
——企业定位
· 四个人每个人找十个标的,各自去实验,标的领域的选取根据各自偏好和擅长。公司注册成功后去寻找一个信托平台,费用为一个点的回报率。财务方面不用管信托平台会代为管理,并且将财务报表予以公示
·托管公司 代理大陆客户进行港股操盘
——使命
·为客户利益而努力进取
·提高每位员工的公司荣誉感,自豪感。
·像对待技术创新一样致力于成本创新。
·让更多的人获得更好,更稳健的服务
·充分调动员工主观能动性,主动完成好任务。
——核心价值观
· 成就客户—我们致力于每位客户的满意和成功。
· 尊重员工—我们致力于尊重每位员工的要求以及情感。
· 诚信正直—我们秉持信任、诚实和富有责任感,无论是对内部还是外部。· 追求卓越—我们倡导每天学习一点,开拓视野,每天争做最佳最好。
——愿景
IO基于对行业的深厚理解,以及对优秀的管理和文化基因的传承,顺应时代的趋势,争取成为时代的领头羊,在全球范围内打造高品质的产品,让消费者充分享受卓越的IO服务。IO致力于发展成为一个自由民主的公司,一个可以自由讨论,积极发出自己声音的的公司,一个稳健提升的企业,为客户、股东、员工和社会创造更多的价值,让世界因IO更美好。
第四篇:黑马程序员——IO(Input Output)流总结(一)
IO(Input Output)流总结
(一)IO流是处理数据之间数据传输的。
Java对数据的操作是通过流的方式。
Java中用于操作IO流的对象都放在java.io包中。
流的分类:按照操作数据分为:字符流和字节流。
按照流向分为:输入流和输出流。
输入流:输出流:
字符流:
ReaderWriter
|--BufferedReader|--BufferedWriter
|--inputStreamReader|--OutputStreamWriter
|--FileReader|--FileWriter
字节流:
InputStreamOutputStream
|--FileInputStream|--FileOutputStream
InputStreamOutputStream
|--FilterInputStream|--FilterOutputStream
|--BufferedInputStream|--BufferedOutputStream
在计算机中存储的都是1和0的序列。也就是二进制的有序序列,不论是文本、音乐或者是视频。
那么为什么要在流中定义字节流和字符流呢?
这个与我们的字符编码方式有关。我们都知道世界上有很多种的语言,比如:ASCII、GB2312、GBK、UTF-8和Unicode等。
如果一个文本文件使用GB2312编码的方式存储的,如果我们用Unicode的编码方式来读取,那么就会出现乱码。所以字符流是一种特殊的流,在java中就定义了专门处理字符的流对象。
当我们拿到一个API文档我们应该如何使用呢?
1,确定要使用的功能。
2,查阅API看有没有相关的功能类。
3,如果没有,就分析需要如何自定义一个出来,并且要使用到那些相关功能的类,这些类在API中有没有定义。
4,不论有或者没有需要自定义一个,我们都要先查阅相关功能类的根类,那么查阅一个API的时候我们要注意一些什么呢?
5,找到相关功能根类,先看一下它是一个类,还是接口,还是抽象类,如果是接口或
者是抽象类我们就不能直接使用这个类,而要使用这个类的子类。
6,但是,我们不用急于先看它有哪些子类,我们先看一下它到底暴露了什么字段、构造函数和方法。
7,在查看暴露的信息时,我们要注意几点:
a.如果是static修饰的,说明是静态的,我们不用new对象也可以直接使用。
b.我们要确定自己要使用的方法将会返回的数据的类型,是void呢、String呢、int呢、还是其他的。查找的时候就重点找返回这些类型的方法。(注意:如果我们使用的类是一个使用单例设计模式设计的,那么他就没有构造函数,我们就一般可以通过静态的getIstance()方法获取相应的对象,这时我们就要找返回值是对象类型的方法。)
8,如果在根类中找到了需要的方法,但是根类又不能创建对象,那么我们就看看,继承这个根类的子类有哪些,一般子类都继承了父类的方法,所以子类可以直接调用父类的方法,并且子类又定义了一些自身特别的方法。
9,找到需要的类创建对象,或者找到相关功能的对象自定义一个需要的类。
下面我们按照以上的方法来阐述IO流的学习:
字节流:
字节流的根类有:读取流(Reader)、写入流(Writer)
根类都是abstract(抽象)的,我们不能直接创建对象,但是我们可以看一看父类都定义了什么方法。
Reader:
int read()
读取单个字符。
int read(char[] cbuf)
将字符读入数组。
abstractint read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。
intread(CharBuffer target)
试图将字符读入指定的字符缓冲区。
abstractvoid close()
关闭该流并释放与之关联的所有资源。
FileReader:Reader的子类,可以创建对象,专门用来操作字符数据流的。
Writer:
void write(char[] cbuf)
写入字符数组。
abstractvoid write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(int c)
写入单个字符。
void write(String str)
写入字符串。
void write(String str, int off, int len)
写入字符串的某一部分。
abstractvoid close()
关闭此流,但要先刷新它。
abstractvoid flush()
刷新该流的缓冲。
写入流(Writer)在每次调用write()方法的时候都要flush()(刷新)一次,当然Writer也不能创建对象,我们可以使用他的子类FileWriter,FileWriter是专门处理字符写入流的类。
FileReader 和 FileWriter 为我们提供了操作字符数据流的一般方法,其中比较高效的就是自定义一个数组,用这个数组作为临时存储区,每次读取一块(装满数组)数据,然后再将这一块数据写入相应的目的地。这样就提高了效率,如果每次读取一个字符然后写入一个字符,就很低效,是不可取的。
自定一个数组为我们提高了效率,但是每次使用都要写很多代码,所以开发者就将这个数组封装为了一个特殊的对象。那就是缓冲区!BufferedReader(字符读取缓冲区)和BufferedWriter(字符写入缓冲区)。他是用的是装饰设计模式,是再不改变原来已定义类的基础上增强类的功能。
补充:BufferedReader的子类LineNumberReader,增加了int getLineNumber():获得当前行号的功能,我们可以在使用缓冲区的同时读取行号。
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。
字符流学习完了,那么如果要学习字节流就会简单很多,我们通过查阅API知道:很多方法都似曾相识。所以,总结一下就是下面几点:
A.字节流分为:InputStream(读取流)和OutputStream(写入流)
B.字节流和字符流的功能基本相同,只不过传入的参数由字符流中的字节char,变成了字节中的byte。
C.字节流也具有缓冲区:
BufferedInputStream(字节读取缓冲区)和BufferedOutputStream(字节写入缓冲区)。方法与字符缓冲区相似。
第五篇:C8051f020 IO配置小结
C8051f020 I/O配置小结
020的每个I/O口引脚都可以被配置为推挽或漏极开路输出。同时引入了数字交叉开关,允许将内部数字系统资源映射到P0、P1、P2和P3的端口引脚。通过设置交叉开关寄存器可将片内的计数器/定时器、串行总线、硬件中断、ADC转换启动输入、比较器输出以及微控制器内部的其他数字信号配置为出现在端口I/O引脚。必须在访问这些外设的I/O之前配置和允许交叉开关。注意的问题:
1.低端口既能按位寻址,也可以按字节寻址;高端口只能按字节寻址。2.没有被分配到的引脚作为一般的数字通用I/O口。3.P1口还可以用作ADC1的模拟输入。
4.P0MDOUT~P3MDOUT用于控制I/O端口每一位的输出状态。
5.EMIF(外部存储器接口)是用于CPU与片外XRAM之间的数据传输通道,通过寄存器EMI0CF和EMI0CN选择和管理端口实现数据的传输。
6.为了能访问片外存储器空间,必须设置EMI0CN寄存器的内容为片外存储器的空间页地址。7.如果把外部存储器接口(EMIF)设置在高端口则首先要把EMI0CF的PRTSEL位设置为1,选择高端口,同时选择地址的复用或非复用方式,在把XBR的外部寄存器的EMIFLE位设置为0。8.复用方式配置:在复用方式下,数据总线和地址总线的第8位共用相同的引脚(AD0~AD7)。在该方式下,要用一个外部锁存器(如74HC373或相同功能的锁存器)保持RAM地址的低8位。外部锁存器由ALE(地址锁存使能)信号控制,ALE信号由外部存储器接口逻辑驱动。9.在总线复用时,需要把地址数据复用端口配置为漏极开路。
10.ALE高/低脉宽占1个SYSCLK周期,地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期,EMIF工作在地址/数据复用方式,即:EMI0CF |= 0x2c;EMI0TC |= 0x2c;配置EMIF的步骤是:先将EMIF选到低端口或高端口;然后选择复用方式或非复用方式;再选择存储器的模式(只用片内存储器、不带块选择的分片方式、带块选择的分片方式或只用片外存储器);然后设置EMI0TC;最后通过寄存器PnMDOUT和P74OUT选择所期望的相关端口的输出方式。如: void PORT_Init(void){ XBR2 = 0x40;/*使能交叉开关和弱上拉*/ P74OUT |= 0xff;/*使能P4~P7推挽输出*/ EMI0CF |= 0x2c;/*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/ EMI0TC |= 0x6c;/*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/ P3MDOUT |= 0xdf;/*使能P3.5推挽输出*/ } 11.避免高端口处于“浮空”状态,以避免因输入浮空为无效逻辑电平而导致不必要的功率消耗,为此应采取如下措施的任何一种:a.将XBR2.7位设置为逻辑0选择弱上拉状态
R/W R/W R/W R/W R/W R/W R/W R/W 复位值 WEAKPUD XBARE-T4EXE T4E UART1E EMIFLE CNVSTE 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址
位7 WEAKPUD 弱上拉禁止位 0 弱上拉全局允许 1 弱上拉全局禁止
位6 XBARE 交叉开关允许位 0 交叉开关禁止端口0 1 2 和3 的所有引脚被强制为输入方式 1 交叉开关允许 位5 未用读0 写=忽略 位4 T4EXE T4EX 输入允许位 0 T4EX 不连到端口引脚 1 T4EX 连到端口引脚 位3 T4E T4 输入允许位 0 T4 不连到端口引脚 1 T4 连到端口引脚
位2 UART1E UART1 I/O 允许位 0 UART1 I/O 不连到端口引脚 1 UART1 TX 和RX 连到两个端口引脚 位1 EMIFLE 外部存储器接口低端口允许位
0 P0.7 P0.6 和P0.5 的功能由交叉开关或端口锁存器决定 1 如果EMI0CF.4 = 0 外部存储器接口为复用方式
则P0.7(/WR)P0.6(/RD)和P0.5(/ALE)被交叉开关跳过它们的输出 状态由端口锁存器和外部存储器接口决定 如果EMI0CF.4 = 1 外部存储器接口为非复用方式
则P0.7(/WR)和P0.6(/RD)被交叉开关跳过它们的输出状态由端口锁 存器和外部存储器接口决定
位0 CNVSTE 外部转换启动输入允许位 0 CNVSTR 不连到端口引脚 1 CNVSTR 连到端口引脚;
b.令P74OUT=0xFF,将高端口输出方式配置为推拉方式(P74OUT为高端口输出方式寄存器); c.向高端口数据寄存器P4、P5、P6和P7写0。12.配置端口引脚的输出方式
每个端口引脚的输出方式都可被配置为漏极开路或推挽方式。在推挽方式下向端口数据寄存器中的相应位写逻辑0 将使端口引脚被驱动到GND 写逻辑1 将使端口引脚被驱动到VDD,在漏极开路方式下向端口数据寄存器中的相应位写逻辑0 将使端口引脚被驱动到GND 写逻辑1 将使端口引脚处于高阻状态,当系统中不同器件的端口引脚有共享连接。即多个输出连接到同一个物理线时(例如SMBus 连接中的SDA 信号),使用漏极开路方式可以防止不同器件之间的冲突。(推挽方式在有些书中称为推拉方式)
转载-关于开漏、推挽方式2008-01-27 17:53漏级开路即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻或使用如LCX245等电平转换芯片。有些朋友,尤其是未学过此方面知识的朋友,在实际工作中将I/O口设置为漏开,并想输出高电平,但向口线上写1后对方并未认出高电平,但用万用表测量引脚确有电压,这种认为是不对的,对于高阻状态来说,测量电压是无意义的,正确的方法应是外加上拉电阻,上拉电阻的阻值=上拉电压/芯片引脚最大灌(拉)电流。
推挽方式可完全独立产生高低电平,推挽方式为低阻,这样,才能保证口线上不分走电压或分走极小的电压(可忽略),保证输出与电源相同的高电平,推挽适用于输出而不适用于输入,因为若对推挽(低阻)加高电平后,I=U/R,I会很大,将造成口的烧毁。对与C8051F的很多型号片子,将I/O口设置为推挽方式的做法为:PnMDOUT=0xff,Pn=0x00,这样设置I/O口为推挽,并输出低电平(可降低功耗)将I/O口设置为漏开方式的做法为:PnMDOUT=0x00,Pn=0x11,这样设置I/O口为漏开。
如果学过三极管放大电路一定知道,前置单管放大器和功放末级放大电路的区别。单片机内部的逻辑经过内部的逻辑运算后需要输出到外面,外面的器件可能需要较大的电流才能推动,因此在单片机的输出端口必须有一个驱动电路。
这种驱动电路有两种形式: 其中的一种是采用一只N型三极管(npn或n沟道),以npn三极管为例,就是e接地,b接内部的逻辑运算,c引出,b受内部驱动可以控制三极管是否导通但如果三极管的c极一直悬空,尽管b极上发生高低变化,c极上也不会有高低变化,因此在这种条件下必须在外部提供一个电阻,电阻的一端接c(引出脚)另一端接电源,这样当三极管的b有高电压是三极管导通,c电压为低,当b为低电压时三极管不通,c极在电阻的拉动下为高电压,这种驱动电路有个特点:低电压是三极管驱动的,高电压是电阻驱动的(上下不对称),三极管导通时的ec内阻很小,因此可以提供很大的电流,可以直接驱动led甚至继电器,但电阻的驱动是有限的,最大高电平输出电流=(vcc-Vh)/r;
另一种是互补推挽输出,采用2只晶体管,一只在上一只在下,上面的一只是n型,下面为p型(以三极管为例),两只管子的连接为:npn(上)的c连vcc,pnp(下)的c接地,两只管子的ee,bb相连,其中ee作为输出(引出脚),bb接内部逻辑,这个电路通常用于功率放大点路的末级(音响),当bb接高电压时npn管导通输出高电压,由于三极管的ec电阻很小,因此输出的高电压有很强的驱动能力,当bb接低电压时npn截至,pnp导通,由于三极管的ec电阻很小因此输出的低电压有很强的驱动能力,简单的例子,9013导通时ec电阻不到10欧,以Vh=2.5v,vcc=5v计算,高电平输出电流最大=250MA,短路电流500ma,这个计算同时告诉我们采用推挽输出时一定要小心千万不要出现外部电路短路的可能,否则肯定烧毁芯片,特别是外部驱动三极管时别忘了在三极管的基极加限流电阻。推挽输出电路的形式很多,有些单片机上下都采用n型管,但内部逻辑提供互补输出,以上的说明仅仅为了说明推挽的原理,为了更深的理解可以参考功率放大电路。
推挽方式可完全独立产生高低电平,推挽方式为低阻,这样,才能保证口线上不分走电压或分走极小的电压(可忽略),保证输出与电源相同的高电平,推挽适用于输出而不适用于输入,因为若对推挽(低阻)加高电平后,I=U/R,I会很大,将造成口的烧毁。
对与C8051F的很多型号片子,将I/O口设置为推挽方式的做法为:PnMDOUT=0xff,Pn=0x00,这样设置I/O口为推挽,并输出低电平(可降低功耗)将I/O口设置为漏开方式的做法为:PnMDOUT=0x00,Pn=0x11,这样设置I/O口为漏开。
推挽输出0的时候和开漏特性一样,就是1的时候可以当作直接接VCC.推挽输出的驱动能力相当强,因为输出1就等于接到了VCC.而同时推挽输出的IO也需要注意不要直接接到地,否则一旦输出1,就等于VCC通过内部的场效应管直接到地了,这时候IO端发热就很大,时间长就就拜拜了.你看到DX32实验板上,按键部分都是串了个300欧才到地的,就是为了避免IO误操作,使这些输入变成推挽输出1而做的保护.以此为设计依据,一般情况下,所有的IO都尽量避免直接到地,即使这个IO你是打算用来做输入的.