uart如何进行通信,模块发给uart数据信息后经历了什么
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种用于串行通信的协议,它使用一对传输线(TX和RX)进行双向通信。UART通信通过串行传输数据,数据以字节为单位进行传输。每个字节由起始位、数据位、校验位和停止位组成。
当模块向UART发送数据信息时,这些数据会经历以下过程:
- 1、数据准备:发送模块将要发送的数据准备好,通常这些数据存储在发送缓冲区中。
- 2、数据格式化:UART模块根据配置参数(如波特率、数据位、停止位、奇偶校验等)将待发送的数据格式化成符合UART协议的数据帧。数据帧以一个起始位开始,后面跟着数据位(通常为7或8位),然后是可选的奇偶校验位,最后以一个或多个停止位结束。
- 3、数据发送:UART模块的发送器将格式化后的数据帧通过TX线发送出去。发送器会控制波特率发生器以设定的波特率将数据串行输出。
在接收端,UART的接收器执行以下操作:
- 1、信号检测:接收器通过RX线实时检测输入信号,一旦检测到起始位,就知道数据准备发送,并尝试与发送器时钟频率同步。
- 2、数据接收:接收器按照设定的波特率接收数据,并将数据存储在接收缓冲区中。
- 3、数据校验:接收器根据数据帧中的奇偶校验位对数据进行校验,以检测数据传输中的错误。
- 4、数据处理:如果数据校验正确,接收器将接收到的数据从串行转换成并行,并交给上层应用处理。
在整个通信过程中,UART模块还负责处理其他信号,如产生额外的信号来指示发送和接收的状态。例如,如果产生一个奇偶错误,UART会置位奇偶标志。
总的来说,UART通信过程涉及数据准备、格式化、发送、接收、校验和处理等多个步骤,确保数据的正确性和可靠性。同时,UART模块还负责处理各种信号和状态,以维持通信的顺畅进行。
pc如何连接入linux系统的,底层原理是什么
PC连接到Linux系统的底层原理主要涉及到**网络通信协议、远程访问技术和服务端配置等多个方面。**以下是具体的解释:
网络通信协议:
PC和Linux系统之间的连接是通过网络通信协议实现的。常见的协议包括TCP/IP协议族,它负责在不同设备之间传输数据。
在这个过程中,数据被拆分成数据包,通过网络中的路由器和交换机进行转发,最终到达目标Linux系统。
远程访问技术:
常见的远程访问技术有SSH(Secure Shell)和Telnet等。SSH是最常用的方式,因为它提供了加密的数据传输,保证了通信的安全性。
当PC使用SSH连接到Linux系统时,会建立一个加密的通道,通过这个通道,PC可以发送命令到Linux系统,并接收Linux系统的响应。
服务端配置:
Linux系统需要配置相应的服务来接受PC的连接请求。对于SSH连接,Linux系统需要运行SSH服务器(如OpenSSH),并监听特定的端口(默认是22端口)。
服务端还需要配置相应的认证机制,比如密码认证或密钥认证,以确保只有经过授权的用户才能访问系统。
会话管理:
一旦连接建立成功,PC和Linux系统之间会建立一个会话。这个会话会维护双方的通信状态,确保数据的正确传输。
在会话期间,PC可以发送命令给Linux系统执行,Linux系统会将执行结果发送回PC。
数据传输:
数据在PC和Linux系统之间的传输是基于底层的网络协议进行的。数据包会按照网络协议的规定进行封装和解封装,确保数据在传输过程中的完整性和安全性。
总结来说,PC连接到Linux系统的底层原理是通过网络通信协议建立连接,利用远程访问技术实现数据的加密传输和命令的执行,同时需要服务端进行相应的配置和会话管理来确保通信的顺畅进行。这些原理共同构成了PC与Linux系统之间的远程连接和交互的基础。
手撕哈希表的建立
手撕哈希表的建立主要包括以下几个步骤:
-
确定哈希表的大小:首先,你需要确定哈希表的大小,这通常取决于你预计要存储的元素数量以及你希望的哈希表性能。哈希表的大小应该是一个质数,这样可以减少哈希冲突的可能性。
-
设计哈希函数:哈希函数是将键(key)映射到哈希表中索引的函数。设计哈希函数时,你需要确保它能够将不同的键映射到不同的索引(理想情况),或者至少将冲突的数量最小化。常见的哈希函数包括除法取余法、平方取中法、折叠法等。
-
初始化哈希表:创建一个数组作为哈希表的底层数据结构,数组的每个元素可以是一个链表或者其他数据结构,用于处理哈希冲突。
-
插入元素:对于每个要插入的元素,首先使用哈希函数计算其哈希值,然后将该哈希值作为索引在哈希表中查找。如果索引处为空,则直接在该位置插入元素;如果索引处已有元素(即哈希冲突),则使用链表或其他数据结构存储这些元素。
-
处理哈希冲突**:哈希冲突是哈希表中常见的问题,即两个不同的键通过哈希函数计算得到了相同的哈希值**。处理哈希冲突的方法有多种,如链地址法(将冲突的元素存储在同一索引处的链表中)、开放地址法(当冲突发生时,尝试在哈希表中的其他位置插入元素)等。
下面是一个简单的哈希表插入操作的伪代码示例:
python
class HashTable:
def __init__(self, size):
self.size = size
self.table = [[] for _ in range(size)] # 初始化哈希表为大小为size的空链表数组
def hash_function(self, key):
# 这里使用简单的除法取余法作为哈希函数
return key % self.size
def insert(self, key, value):
index = self.hash_function(key)
for pair in self.table[index]: # 遍历链表查找是否存在相同键
if pair[0] == key:
pair[1] = value # 如果键已存在,更新值
return
self.table[index].append([key, value]) # 如果键不存在,添加到链表末尾
这个示例中,我们使用了除法取余法作为哈希函数,并使用链表来处理哈希冲突。
在插入元素时,我们首先计算键的哈希值,然后在对应的索引处查找是否存在相同的键。
如果存在,则更新其值;如果不存在,则将新的键值对添加到链表的末尾。
请注意,这只是一个简单的示例,实际的哈希表实现可能会更加复杂,并需要考虑更多的因素,如动态调整哈希表的大小、优化哈希函数以减少冲突等。
质数,又称素数,是指在大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
C语言实现
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define HASH_TABLE_SIZE 10
#define EMPTY -1
typedef struct {
int key;
int value;
} HashTableItem;
HashTableItem hashTable[HASH_TABLE_SIZE];
// 哈希函数
unsigned int hash(int key) {
return key % HASH_TABLE_SIZE;
}
// 插入元素到哈希表
bool insert(int key, int value) {
unsigned int index = hash(key);
while (hashTable[index].key != EMPTY) {
// 如果键已经存在,则更新其值并返回
if (hashTable[index].key == key) {
hashTable[index].value = value;
return true;
}
// 使用线性探测找到下一个空槽
index = (index + 1) % HASH_TABLE_SIZE;
if (index == hash(key)) { // 如果回到原点,说明表已满
return false;
}
}
// 找到空槽,插入新元素
hashTable[index].key = key;
hashTable[index].value = value;
return true;
}
// 根据键查找值
int lookup(int key) {
unsigned int index = hash(key);
while (hashTable[index].key != EMPTY) {
if (hashTable[index].key == key) {
return hashTable[index].value;
}
index = (index + 1) % HASH_TABLE_SIZE;
if (index == hash(key)) { // 如果回到原点,说明键不存在
return EMPTY;
}
}
return EMPTY; // 键不存在
}
// 初始化哈希表
void initHashTable() {
for (int i = 0; i < HASH_TABLE_SIZE; i++) {
hashTable[i].key = EMPTY;
hashTable[i].value = 0;
}
}
int main() {
initHashTable();
// 插入一些元素
insert(10, 100);
insert(20, 200);
insert(30, 300);
insert(40, 400);
// 查找元素
printf("Value for key 20: %d\n", lookup(20));
printf("Value for key 50: %d\n", lookup(50)); // 应该返回 EMPTY
return 0;
}
为什么哈希表的大小应该是一个质数,这样可以减少哈希冲突的可能性?
哈希表的大小选择质数作为底层数组的大小有助于减少哈希冲突,原因如下:
-
均匀分布:质数在除法运算中更有可能产生均匀分布的结果。当使用除法取余法作为哈希函数时,如果哈希表的大小是质数,那么对于大多数键,其哈希值将更均匀地分布在哈希表的各个槽位中。这有助于减少由于某些键具有相同的哈希值而导致的冲突。
-
周期性避免:非质数,特别是那些包含小因子的数(如偶数或能被小素数整除的数),在哈希过程中可能引入周期性。这意味着某些键的哈希值可能会以某种模式重复出现,导致冲突增加。质数由于只能被1和它本身整除,所以能更好地避免这种周期性。
-
数学原理:在数学上,质数具有一些独特的性质,这些性质使得它们在哈希表设计中特别有用。尽管不是所有哈希函数都严格依赖于这些数学性质,但使用质数作为哈希表的大小通常是基于这些性质的合理推测。
-
实践验证:通过大量的实践验证,人们发现使用质数作为哈希表的大小确实有助于减少冲突,提高哈希表的性能。
然而,需要注意的是,虽然质数通常是一个好的选择,但哈希表的性能并不仅仅取决于其大小是否是质数。哈希函数的设计、哈希表的扩容策略、处理冲突的方法等因素同样重要。 因此,在选择哈希表大小时,除了考虑使用质数,还需要综合考虑其他因素。
细扣项目
写到简历上的项目你一定要非常非常清楚。
学过的计算机相关的课程
-
计算机科学导论:这门课程通常作为计算机专业学生的入门课程,介绍计算机科学的基本概念、发展历程和应用领域。
-
计算机组成原理:讲解计算机的基本组成部件,如CPU、内存、硬盘等,以及它们之间的交互方式。
-
操作系统:深入剖析操作系统的原理、功能和设计,包括进程管理、内存管理、文件系统等。
-
数据结构与算法:学习各种常见的数据结构(如链表、栈、队列、树、图等)和算法(如排序、查找、递归等),以及它们在实际问题中的应用。
-
计算机网络:介绍计算机网络的基本原理、协议和技术,包括TCP/IP协议族、路由、交换、网络安全等。
-
数据库系统原理:讲解数据库的基本概念、SQL语言、数据库管理系统(DBMS)的设计和实现,以及数据库安全和性能优化等问题。
-
编程语言与程序设计:学习一种或多种编程语言(如C、C++、Java、Python等),并通过编写程序来解决实际问题。
-
软件工程:介绍软件开发的流程、方法和技术,包括需求分析、设计、编码、测试、维护等各个阶段。
-
计算机图形学:研究计算机生成和处理图形图像的原理和技术,包括三维建模、渲染、动画等。
-
人工智能:介绍人工智能的基本原理和应用,包括机器学习、深度学习、自然语言处理等热门领域。
此外,还有一些与计算机相关的课程,如计算机安全、密码学、分布式系统、云计算、大数据技术等,这些课程根据学校的设置和学生的兴趣可能会有所不同。
用定义性语言描述进程和线程
这个在之前的文章说了:【ARM/Linux嵌入式面经(一):海康威视】
计算机组成原理相关
1.1、冯诺伊曼计算机特点
-
1、硬件系统由五大部件组成:运算器、存储器、控制器、输入设备、输出设备。
-
2、指令和数据以二进制存放在存储器中,按地址访问。
-
3、指令在存储器中按顺序存放。
-
4、指令由操作码和地址码组成。
-
5、以运算器为中心。(现代计算机以存储器为中心)
1.2、存储程序的概念。
将指令以代码的形式事先输入到计算机主存储器中,然后按其在存储器中的首地址执行程序的第一条指令,以后就按照该程序的规定顺序执行其他指令,直至程序执行结束。
存储程序的概念主要包含以下几个要点:
-
代码存储:程序(即指令序列)被事先以代码的形式输入到计算机的主存储器(如RAM)中。这意味着程序不是以外部实体(如纸带或卡片)的形式存在,而是作为二进制数据存储在计算机的内存中。
-
自动执行:计算机从程序在存储器中的首地址开始执行第一条指令。这意味着计算机有一个机制(通常是程序计数器)来跟踪当前正在执行的指令的位置。
-
顺序执行:一旦第一条指令执行完毕,计算机会自动按照程序中规定的顺序执行下一条指令。这个过程是自动且连续的,无需用户手动干预。
-
控制流:程序中的指令可能包含控制流指令,如条件跳转或循环,这些指令会改变指令执行的顺序。但即使如此,执行的控制流仍然是由程序自身定义的,并由计算机自动执行。
-
执行结束:程序会按照其定义的逻辑一直执行,直到程序中的所有指令都执行完毕,或者遇到某种终止条件(如遇到错误或程序主动退出)。
存储程序的概念实现了计算机硬件和软件之间的分离,使得软件(即程序)可以被视为数据,并且可以像数据一样被存储和修改。这种分离极大地提高了计算机的灵活性和可编程性,使得计算机可以执行各种不同的任务,只需通过改变其存储的程序即可。
存储程序的概念还促进了计算机的模块化设计,使得不同的硬件部件(如CPU、内存、输入/输出设备等)可以独立设计、制造和升级,而不必改变整个系统的架构。这种模块化设计使得计算机的设计、制造和维护都变得更加容易和高效。
1.3、冯诺依曼机中数据为什么用二进制编码表示
-
1、二进制运算规则简单。(通过0,1转换成加法运算)
-
2、制造两个稳态的物理器件容易。(只需要高、低电平)
-
3、便于用逻辑门电路实现算术运算。(0,1对应真假)
1.4、指令和数据都以二进制存储,CPU如何区分
CPU根据指令周期的不同阶段来区分,取指阶段取出指令,执行阶段取出数据。
1.5、机器语言、汇编语言、高级语言的区别与联系
-
机器语言:由二进制编码组成,是计算机唯一可以直接识别和执行的语言。
-
汇编语言:用助记符代替二进制的指令代码,容易记忆;必须经过汇编操作转换为机器语言,才能在硬件上执行。
-
高级语言:需要经过编译程序编译成汇编语言程序,然后经过汇编得到机器语言程序。(C,C++,Java)也可以直接由高级语言程序翻译成机器语言程序。(Python)
1.6、翻译程序是什么,有哪些
翻译程序:把高级语言程序转换成机器语言程序(目标代码)的软件。
翻译程序有三种
-
1、编译程序:将高级语言源程序一次全部翻译成目标程序,每次执行程序时,只要执行目标程序就行。源程序不变就无需重新编译。
-
2、解释程序:将一条语句翻译成机器目标代码并立即执行,然后接着翻译下一条,不生成目标程序。
-
3、汇编程序:将汇编语言程序翻译成机器语言程序。
1.7、字长、字、指令字长、存储字长
-
字长(机器字长):一次整数运算所能处理的二进制数据位数。(如16位机器,16位即为字长)
字长=CPU内部整数运算器位数=通用寄存器位数
-
字:被处理信息的单位。
-
指令字长:一个指令字中二进制代码的位数。
-
存储字长:一个存储单元中二进制代码长度。
指令字长=存储字长 * k(需要k个访存周期来取出一条指令)。
2.1、已知X和Y,如何用补码求X-Y
2.2、大端存储、小端存储
大端:先存高位字节(左边部分),再存低位字节(右边部分)。(正常思维方式)
小端:先存低位,后存高位。
2.3、计算机什么时候会发生溢出
加减法时超出了所能表示的范围,只有两正数或两负数相加才会发生。
2.4、怎么有什么方法判断溢出
1、符号位,如正+正=负 或 负+负=正 则溢出。
2、符号位进位和数值最高位进位,如果只有一个发生了进位则溢出。
3、双符号位,不一致就溢出。
2.5、浮点数的表示中为什么要用移码表示阶码
1、为了方便对阶操作,比较大小能直接看出来。阶码=移码=偏移常数+真值。
2、简化了对于“0”的判断,当移码的各位都为0的话,那么该移码对应的数据是能够表示的数据中的最小值。
3、可以提高表示数据的精度。因为没有负数。
3.1、半导体存储器有哪些
半导体存储器分为RAM和ROM,其中RAM又分SRAM和DRAM。他们都采用随机存取方式。
SRAM:非破坏性读出,无需刷新。易失性存储器,存取速度快,集成度低,功耗大,常用于Cache。
DRAM:破坏性读出,需要刷新。易失性存储器,集成度高、价位低,容量大、功耗低,速度比SRAM慢,常用于主存。
ROM:只能读出,不能写入。非易失性存储器,可作为主存的一部分。
3.2、什么是刷新周期,DRAM为什么要刷新,有几种刷新方式,SRAM要刷新吗
刷新周期:从上一次刷新结束到下一次对整个DRAM全部刷新一遍为止,这段时间间隔称为刷新周期。
为什么要刷新:DRAM利用存储元电路中的栅极电容上的电荷来存储信息,电荷一般只能维持1~2ms,所以信息会自动消失。
刷新分为集中式、异步式、分散式。
集中式:用一段固定时间依次对存储器所有行刷新。
分散式:把对每一行的刷新分散到各个工作周期中。
异步式:把对每行的刷新分散到一整个刷新周期中。
SRAM使用双稳态触发器记忆信息,不需要刷新。
3.3、Flash存储器有什么特点
支持随机存取,非易失性存储器,集成度高,价格便宜,能快速擦写,写入前需要先擦,所以写比读慢。
3.4、Cache有哪些映射方式
直接映射:主存数据块只能装入Cache中唯一位置。
全相联映射:可以装入Cache中任何位置。
组相联映射:将Cache分为若干组,一个主存块可以装入一组内任何位置。
3.5、Cache替换策略
1、随机法(RAND):随机确定块。
2、先进先出(FIFO):选择最早调入的换。
3、最近最少使用(LRU):近期最久没用过的。
4、最不经常使用(LFU):一段时间内最久没用过的。
3.6、Cache写策略有哪些
对于写命中
1、全写法(写直通法):必须同时写入Cache和主存。换出块时,用新块直接覆盖,不必将换出块写入内存。实现简单,保持数据正确性,但增加了访存次数,降低了效率。
2、回写法:只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回内存。减少了访存次数,但存在不一致的隐患。
对于写不命中
1、写分配:写到Cache和主存中。
2、非写分配:只写入主存。
搭配:非写-全写,写-回写。
3.7、Cache总容量包括哪些
存储容量、标记阵列容量。
标记阵列容量:有效位(1位)+标记位+一致性维护位(脏位,采用写回法时)+替换算法控制位(若无替换算法则无此位)。
3.8、虚拟存储器
(1)虚拟存储器概念
具有调入和扩充功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
(2)虚拟存储器管理方式
分为页式、段式、段页式。
1、页式:虚拟空间和内存空间分成固定大小的页,虚拟页可以装入主存中不同的实际页面位置。页式管理由操作系统完成,对应用程序员透明。
逻辑地址:虚页号+页内地址。 物理地址:页号+页内地址。 页表:页号+每页始址+装入位 等。
2、段式:把主存按段划分管理,每个用户程序分到一个段,只能访问段所对应的主存空间。段长可以任意设定,并且可以放大和缩小。
段表:段名+段起点+装入位+段长 等。段表本身也是一个段。
3、段页式:先按逻辑分成段,再将每段分成若干个页,访存依靠一个段表和若干页表完成。段长必须是页长整数倍,段起点必须是某页起点。
(3)分页分段系统比较,优缺点:
1、分页:内存分为固定的块,按物理结构划分,有内部碎片。
2、分段:内存块大小不固定,按逻辑结构划分,有外部碎片。
3、段页式:先分段后分页,有内部碎片。
3.9、页表和快表
页表(Page):存放在主存中的虚页号和实页号的对照表,将虚页号变换成主存中实页号的内部地址。
快表(TLB):为了减少访存次数,将页表中最活跃的几个页表项复制到Cache中,这种Cache中的页表项组成起来就是快表。主存中的页表叫慢表。
TLB是Page的一个很小的副本,所以TLB命中则Page一定命中。
4.1、指令的基本格式,各字段作用
操作码+地址码
操作码:指出指令应该执行什么操作,有什么功能。
地址码:给出被操作信息的地址或操作数本身,可以有多个地址码。
4.2、相对寻址、基址寻址、变址寻址
1、相对寻址:程序计数器(PC)+形式地址(假设为A,相对于PC所指地址的偏移量),所以有效地址为(PC)+ A。
优点:便于一段代码在程序内部浮动,用于转移指令。
2、基址寻址:将CPU中基址寄存器(BR,BR位数大于A的位数)+ A,即(BR)+ A。基址寄存器面向操作系统,内容由操作系统确定,用户决定用哪个寄存器作为BR。
优点:可以扩大寻址范围,用户不必考虑自己程序位于主存何处,有利于多道程序设计,可用于编制浮动程序。
3、变址寻址:变址寄存器(IX)+ A。IX可以是专用的变址寄存器,也可以是通用寄存器。变址寄存器面向用户,IX的内容可由用户改变(作为偏移量),A不变(作为基地址)。
优点:可以设定A为数组首地址,不断改变IX,很容易遍历数组,适合编制循环程序。
4.3、CISC与RISC
5.1、CPU的基本结构
5.2、指令执行过程
5.3、CPU的功能
指令控制、操作控制、时间控制、数据加工、中断处理。
5.4、指令周期、机器周期、时钟周期
指令周期:CPU从主存中取出并执行一条指令的时间。
机器周期(CPU周期):用从内存读取一条指令字的最短时间来表示。
时钟周期:节拍,T周期,最基本单位。
若干时钟周期表示一个机器周期,若干机器周期表示一个指令周期。
5.5、控制器分为哪几种
1、硬布线控制器:微操作控制信号由组合逻辑电路即时产生,即由硬件给出控制信号。
特点:速度快;难以扩充和修改、结构复杂。
2、微程序控制器:采用存储程序的原理,将微操作控制信号以微程序的形式存放在控制存储器中,一条机器指令对应一个微程序,执行指令时只需读出微程序执行,即由软件给出控制信号。
特点:每条指令都要从控制存储器读取,速度慢;可以通过改变控制存储器内容进行扩充和修改,结构规整。
5.6、微指令有哪些编码方式
1、直接编码:微指令的控制字段中每一位代表一个微命令。选用或不选用只需将对应位设为1或0。
特点:简单;指令字长太长,n个微命令就要n位操作字段。
2、字段直接编码:将微命令字段分为几个小段,把互斥微命令放在同一段编码,把相容的放不同字段中,每种编码代表一个微命令。
特点:每个小段中包含的信息位不能太多,否则将增加译码复杂性。每个小段需要留出一个状态,表示本字段不发出任何命令。
3、字段间接编码:某些微命令需要另一段的微命令来表示。
5.7、微指令和机器指令的关系
一个程序由多条机器指令组成。一条机器指令对应一个微程序。一个微程序由若干条微指令构成。一条机器指令所完成的操作划分成若干条微指令来完成,由微指令进行解释和执行。
一个微指令称为一个微周期,比如取指周期。只有在微程序控制器中,才有微命令的概念。硬布线控制器最小单位是微操作。
5.8、影响(阻塞)指令流水线的因素
1、结构相关:多条指令在同一时刻竞争同一资源形成冲突。
解决方法:(1)后面的指令暂停一个时钟周期。(2)单独设置数据存储器和指令存储器。
2、数据相关:必须等前一条指令执行完才能执行后一条指令,称这两条指令数据相关。
解决方法:(1)把数据相关的指令和其后指令都暂停几个时钟周期,直到数据相关问题解决。(2)设置专用通路,直接把前一条指令的计算结果作为自己的输入开始计算。这被称为数据旁路技术。
3、控制相关:流水线遇到转移指令和其他改变PC值的指令而造成断流。
解决方法:(1)尽早生成转移目标地址。(2)预取转移成功和不成功两个控制流方向上的目标指令。(3)加快和提前形成条件码。(4)提高转移方向的猜准率。
5.9、流水段越多,指令执行是否越快
并不是,因为流水段缓冲之间的开销会增大,并且控制逻辑变多,更加复杂。
6.1、总线的两种基本定时方式
1、同步通信方式:系统采用一个统一的时钟信号来协调发送和接受双方的传送定时关系。
2、异步通信方式:没有统一的时钟,依靠双方相互制约的握手信号来定时控制。分为不互锁、半互锁、全互锁。
7.1、I/O端口的编址方式有哪些
1、统一编址:把I/O端口当成存储器单元进行地址分配,采用统一的访存指令访问I/O端口。
优点:不需要专门的I/O指令,可以使端口有较大的编址空间。
缺点:占用了存储器地址,使内存变小,速度慢。
2、独立编址:I/O端口地址与存储器无关,CPU设置专门的I/O指令访存端口。
优点:编程简单清晰。
缺点:I/O指令少,一般只能对端口操作。控制更复杂了。
7.2、I/O方式有哪些
1、程序查询方式:利用I/O测试指令测试设备的闲忙。若设备不忙,则执行输入输出指令;若设备忙,则I/O测试指令不断对该设备进行测试,直到设备空闲为止。实现简单,但CPU和IO设备只能串行工作,长期处于忙等状态,CPU利用率低。
2、程序中断方式:引入中断之后,每当设备完成I/O操作,便以中断请求方式通知CPU,然后进行相应处理。但由于CPU直接控制输入输出操作,每传达一个单位信息(字),都要发生一次中断,因而消耗大量CPU时间。
3、DMA方式:用于高速外部设备与内存之间批量数据的传输。CPU只需在传输开始时设置好所需的控制信息,由DMA控制器控制一个数据块的传输。当本次DMA传送的数据全部完成时才产生中断,请求CPU进行结束处理。
7.3、程序中断的过程
中断请求、中断判优、响应中断、中断隐指令、中断向量、中断处理
中断隐指令:完成关中断、保存断点、引出中断服务程序。硬件完成。
中断向量:中断服务程序的入口地址。
7.4、中断处理过程
7.5、DMA和主存访存的方式有哪些
1、停止CPU访存。要求CPU放弃对相关总线的使用权。
2、DMA和CPU交替访存。将一个CPU周期分为两个周期,分别给DMA和CPU,分时控制。
3、周期挪用。DMA挪用一个或几个存取周期。
DMA优先级会高于CPU,因为如果得不到及时响应,传输的数据可能会丢失。
7.6、DMA方式和中断方式的区别
1、中断方式是程序的切换,需要保护和恢复现场;而DMA除了预处理和后处理,其他时候不占用CPU资源。
2、对中断请求的响应只能发生在每条指令执行完时;而对DMA请求的响应可以发生在每个机器周期结束时。
3、中断传送过程需要CPU干预;而DMA传送过程不需要CPU干预。
4、DMA优先级高于中断请求。
5、中断方式能处理异常事件;而DMA只能I/O操作。
6、中断方式靠程序传送数据;DMA靠硬件传送数据。
7.6、设备管理应具备哪些功能
1、状态跟踪:跟踪外设状态信息。
2、设备存取:对设备的存取操作。
3、设备分配:设备分配与回收。
4、设备控制:设备驱动,故障处理。
https://zhuanlan.zhihu.com/p/616972168