- 1、本文档共82页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 设备管理 ;5.1 I/O 系 统 ; 2) 按信息交换的单位分类
可将I/O设备分成两类。第一类是块设备(Block Device),这类设备用于存储信息。 由于信息的存取总是以数据块为单位, 故而得名。 它属于有结构设备。典型的块设备是磁盘,每个盘块的大小为512 B~4 KB。磁盘设备的基本特征是其传输速率较高,通常每秒钟为几兆位;另一特征是可寻址,即对它可随机地读/写任一块;此外,磁盘设备的I/O常采用DMA方式。 第二类是字符设备(Character Device),用于数据的输入和输出。 其基本单位是字符, 故称为字符设备。;3) 按设备的共享属性分类
这种分类方式可将I/O设备分为如下三类:
独占设备。
(2) 共享设备。
(3) 虚拟设备。 ;2. 设备与控制器之间的接口 ;5.1.2 设备控制器;2. 设备控制器的组成 ;5.1.3 I/O通道 ;2. 通道类型 ;2) 数组选择通道(Block Selector Channel) ; 3) 数组多路通道(Block Multiplexor Channel)
数组选择通道虽有很高的传输速率,但它却每次只允许一个设备传输数据。数组多路通道是将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作的优点相结合而形成的一种新通道。它含有多个非分配型子通道, 因而这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。也正因此,才使该通道能被广泛地用于连接多台高、中速的外围设备,其数据传送是按数组方式进行的。 ;3. “瓶颈”问题 ;图 5-5 多通路I/O系统 ;5.1.4 总线系统 ; 1. ISA和EISA总线
1) ISA(Industry Standard Architecture)总线
这是为了1984年推出的80286型微机而设计的总线结构。 其总线的带宽为8位,最高传输速率为2 Mb/s。之后不久又推出了16位的(EISA)总线,其最高传输速率为8 Mb/s,后又升至16 Mb/s, 能连接12台设备。
2) EISA(Extended ISA)总线
到80年代末期,ISA总线已难于满足带宽和传输速率的要求, 于是人们又开发出扩展ISA(EISA)总线,其带宽为32位,总线的传输速率高达32 Mb/s,同样可以连接12台外部设备。 ;2. 局部总线(Local Bus) ;5.2 I/O控制方式 ;图 5-7 程序I/O和中断驱动方式的流程 ;5.2.2 中断驱动I/O控制方式 ;5.2.3 直接存储器访问DMA I/O控制方式 ;2. DMA控制器的组?? ; 为了实现在主机与控制器之间成块数据的直接交换, 必须在DMA控制器中设置如下四类寄存器:
(1) 命令/状态寄存器CR。用于接收从CPU发来的I/O命令或有关控制信息, 或设备的状态。
(2) 内存地址寄存器MAR。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。
(3) 数据寄存器DR。用于暂存从设备到内存,或从内存到设备的数据。
(4) 数据计数器DC。 存放本次CPU要读或写的字(节)数。 ;3. DMA工作过程 ;5.2.4 I/O通道控制方式 ;2. 通道程序 ;操作 ;5.3 缓 冲 管 理 ;图 5-10 利用缓冲寄存器实现缓冲 ;5.3.2 单缓冲和双缓冲 ;2. 双缓冲(Double Buffer) ;图 5-13 双机通信时缓冲区的设置 ;5.3.3 循环缓冲 ;(1)??? 定义循环缓存:
#define?? MAX_BUFF_LEN???? 1024??? // 定义缓存大小
typedef struct??? // 定义数据结构
{
??? uint??? data;
}DATA_BUFF_T;
typedef struct ???// 定义缓存结构
{
??? uint??? readPos;
??? uint??? writePos;
?? ?DATA_BUFF_T??? DATA[MAX_BUFF_LEN];
}DATAS_BUFF_T;
static DATAS_BUFF_T?? Buff0; ???// 定义缓存
(2)初始化循环缓存:
Buff0.readPos = 0;
Buff0.writePos = 0;
(3)判断缓存中是否有数据:
BOOL HaveData_Buff(void)
{
????if (Buff0.readPos != Buff0.wr
文档评论(0)