当前课程知识点:计算机控制导论 > 第九章 硬件约束 > 9.3 选择I/O设备接口 > 9.3 选择I/O设备接口
阅读材料:
计算机控制系统——分析、设计与实现技术
ISBN: 978 703 055 8091
相关阅读:
教材8.3节
在控制运算当中
控制器所操作的数据是通过I/O接口完成读写的
所以选择I/O接口是计算机控制器实例化另一个重要的内容
在选择I/O接口的时候
我们主要考虑的因素有两个
一个是接口的响应速度
另外是接口的数值精度
I/O接口的响应速度除了与接口自身的响应速度有关系之外
还与组件的响应速度有关
后一个因素是更主要的
它通常是由A/D或者D/A的转换速度和接口组件的惯性所决定的
I/O接口的数值精度取决于它所连接的组件设备的精度和分辨率
通常可以通过A/D或者是D/A的转换精度来实现
下面我们来看一下如何选择I/O接口
这个时候我们需要确定的内容主要有三个
一个是确定I/O接口在存储区当中的映射
另外一个是需要确定I/O接口的数据传输方式和读写策略
我们先看一下如何确定I/O接口在存储区的映射方式
比较简单的(方法)是采用一对一的映射
通常,一个组件设备在存储器当中可以映射为4个地址
分别对应命令寄存器、状态寄存器、输出数据和输入数据
其中命令寄存器保留计算机向外部组件发送的操作命令
状态寄存器保留外部组件向计算机返回的工作状态
输出数据寄存器和输入数据寄存器则保留计算机和外围组件之间进行通信的数据内容
我们假设这些数据都是单字节的数据
那么这四个寄存器就可以用四个连续的地址来表示
我们只要确定了这个存储区的首地址
那么,每一个寄存器的地址就可以确定了
通常情况下
我们会使用SET和GET函数来操作命令寄存器和状态寄存器
使用READ和WRITE函数来操作输入数据寄存器和输出数据寄存器
这种方法映射关系比较简单
编程比较容易
但是因为命令寄存器和状态寄存器不会同时有效
输出数据寄存器和输入数据寄存器也不可能同时有效
所以,这种映射方式的工作效率比较低
那么为了提高工作效率
我们可以把命令寄存器和状态寄存器放在同一个地址上
把输入数据寄存器和输出数据寄存器放在另外的一个相邻的地址上
因为计算机在操作外部设备的时候
如果计算机向外部设备发布命令
它就不会去读外部设备的工作状态
同样的,如果计算机读入外部组件的数据
它就不会向外部组件写出数据
所以命令寄存器和状态寄存器、输入数据寄存器和输出数据寄存器是不会同时有效的
采用一对多的方式之后
我们就可以用有限的地址操作更多的数据
这样就提高了计算机的工作效率
这个时候
我们在操作这些外部设备的时候
是用相应的命令函数与读写信号线组合来完成操作的
这种方法工作效率更高一些
在选定了映射方式之后
我们还要确定I/O接口的数据传输方式
比较简单的是采用同步数据传输
这个时候
外部组件始终是工作在一个有效的状态
可以随时接收CPU的命令
或者是向CPU发送数据
进行写操作的时候
CPU不用考虑外部设备具体的工作状态
而是直接把需要写入的数据,或者是向外部组件发送的命令,直接放在数据总线上
然后使地址线和写信号线同时有效
把数据总线上的通信内容发送到外部组件当中
进行读操作的时候与之类似
CPU默认外部组件已经把数据内容准备到了数据总线上
这个时候
CPU只是让I/O地址线和读信号线有效
就把数据总线上的内容读进来了
这种数据传输方式当中
外部设备的工作效率是比较低的
因为它随时处在一个待命状态
除了等待CPU发布的命令
它不会去执行其他的工作
为了提高工作效率,更多的时候是采用异步数据传输的方法
它是在同步数据传输的基础之上
增加了一个握手的过程
执行写操作的时候
CPU要先向外部组件发出一个读指令
外部组件接收到这个读命令之后
会把自身的工作状态放在数据总线上
反馈给CPU
CPU读入外部组件的状态
如果判定组件处在一个空闲状态
那么这个时候,它会执行写操作
把需要向外部组件发布的命令,或者是写入的数据,放在数据总线上
然后使写信号线有效
把这个写操作完成
进行读操作的时候与之类似
先读入外部组件的工作状态
判定外部组件处在空闲状态的时候
那么,由外部组件把数据放在数据总线上,供CPU读入
这个握手过程可以通过一个软件的协议来完成
也可以通过硬件的时序来完成
当计算机对I/O接口进行持续操作的时候
就需要确定接口的操作策略
这个操作策略实际上就是CPU在一段有限时间里对I/O接口进行读写的一个逻辑
我们可以采用轮询的方式
这种情况下
CPU会不断地去读外部设备的状态
然后根据外部设备的状态执行相应的操作
我们以AD574为例
看一下进行轮询读操作的一个工作过程
首先使片选有效
然后等待外部设备发送回来自身的状态
如果发现状态信号是有效的
那么它就进行一个【读】操作
就是让AD转换器把AD转换的数据内容【传递】进来
这里面,握手信号是由硬件电路直接产生的
反映了外部组件的工作状态
CPU根据这个信号线判断AD转换器的工作已经完成了
然后来读入准备好的数据
写操作是与之类似的
进行轮训的时候
首先把数据放在数据总线上
然后发布写命令
完成数据写操作
在下一次写操作之前
它要等待外部【组件】返回的一个状态信息
如果DA转换结束之后
那么写有效信号会再次抬高
表明DAC处在空闲状态
这个时候,我们可以再一次发布写命令
程序框图可以通过一个定时程序完成
我们在一次写操作完成之后
可以通过一个固定时间的延迟去判断下一次写操作是否可以进行
轮询的操作策略比较简单
容易编程
但是同样的,工作效率比较低
因为CPU大量时间浪费在查询外部设备工作状态上
没有充分利用CPU高速运算的特性
为了提高效率,我们可以使用中断的方式进行接口操作
这个时候
外部组件当工作准备就绪之后
会向CPU发出中断请求
CPU接受中断请求之后
会继续完成当前的指令
在当前指令完成之后
它会进入中断处理程序
期间,先要保护现场的状态
然后进行中断的操作
在中断操作完成之后
恢复现场
返回原来的中断点
执行原来的动作
中断操作不需要CPU持续查询外部组件状态
有利于提高工作效率
但是,它会给控制器引入一个不定时的延迟
这个延迟有的时候,对于实时性比较强的操作,会造成一定的影响
这个延迟主要是中断嵌套产生
我们可以回忆一下刚才讲的中断操作过程
初始化所用到的时间和恢复现场所用到的时间
这两个时间是固定的
单纯的完成中断操作(服务)
这个时间也是可以估出来的
但是因为中断嵌套的存在
那么CPU在执行中断处理程序的期间
有可能会被新的中断打断
这样会进入一个新的中断处理程序
这个嵌套过程是否发生、持续多长时间是不确定的
因此中断引入的延迟也就没有办法提前预知
所以对于一些实时性比较强的操作
我们可以在中断处理程序当中把中断屏蔽掉
-名人堂
-关于考核
-课程大纲测试
-学习合同
-学习任务
--学习任务
-1.1 什么是计算机控制
-1.2 为什么学习计算机控制
-1.3 怎样学习计算机控制
-第1周作业
-用户需求调查问卷
-学习任务
--学习任务
-2.1 概述
--2.1 概述
-2.2 典型形式
-【思政阅读】马少梅,范建文:回望历史——记录我国自动化仪表的成长与发展
-第2周作业
-学习任务
--学习任务
-3.1 信号采样
-3.2 信号重构
-第3周作业
-学习任务
--学习任务
-4.1 回顾:连续系统的数学描述
-4.2 离散对象的数学描述
-4.3 系统模型的运算
-第4周作业
-学习任务
--学习任务
-5.1 回顾:连续系统的性能分析
-5.2 离散系统的指令响应
-5.3 离散系统的性能描述
-第5周作业
-学习任务
--学习任务
-6.1 模拟化设计
-6.2 离散化方法
-第6周作业
-学习任务
--学习任务
-7.1 数字化设计
-7.2 解析法
-7.3 试探法
-第7周作业
-学习任务
--学习任务
-8.1 可控实现形式
-8.2 数值精度问题
-8.3 计算时延问题
-第8周作业
-学习任务
--学习任务
-9.1 硬件约束的抽象化
-9.2 选择运算平台
-9.3 选择I/O设备接口
-9.4 处理I/O接口数据
-第9周作业
-学习任务
--学习任务
-10.1 需求分析
-10.2 架构设计
-10.3 任务调度策略
-10.4 可靠设计模式
-第10周作业
-期末考试卷【互评】