微机原理与接口技术笔记

news2024/11/24 14:34:40

文章目录

  • 前言
  • 储存系统与技术
    • 材料
    • 高速储存器缓冲储存器(Cache)
      • 材料,局部性,访问方式
      • Cache全相联映射
      • Cache交换与一致性
        • 单核CPU一致性处理
        • 多核CPU的MESI协议
    • 主储存器(内存)
      • 主要技术指标
        • 容量
        • 带宽
      • 内存模组与内存颗粒
    • 辅助储存器(外存)
      • 类型、工作原理、技术指标
      • 地址计算(重点)
        • CHS编址模型
        • LBA与CHS编址互换
      • NCQ技术
  • 总线技术
  • 接口技术(重点)
    • 串行接口与应用:8250与16550编程
      • 概述
      • 异步串行协议
        • 异步串行帧
        • 例题
        • 时钟误差(TODO)
      • 同步串行协议
        • 面向字符的同步协议
        • 面向bit的同步协议
      • 可编程串行通信接口
        • 收发器内部寄存器
        • 状态检测与数据收发
        • 异步通信帧格式设置
        • 波特率设置
    • 定时和计数技术:8254编程
      • 读写逻辑与控制寄存器
      • 基本操作
        • 设置
        • 读取
      • 工作方式
      • 应用
        • 计数
        • 分频
        • 级联分频
    • 红外
    • WiFi
      • 无中心网络(Ad-hoc网络)
      • 有中心网络
  • 中断技术
    • 中断概述
    • 中断处理
      • 实模式中断处理
      • 保护模式中断处理
    • 可编程中断控制器:8259编程
    • 高级可编程中断控制器(不考)

前言

学校这学期开了一门《汇编语言与接口技术》,这篇文章是接口技术部分。前面还有一部分微机原理,在汇编语言笔记里,本文介绍更加高层次的计算机组成原理。

汇编语言笔记
接口技术笔记TODO

储存系统与技术

除了计算以外,其他都是选择填空。

在这里插入图片描述

在这里插入图片描述

储存层次已经是老生常谈了,越往上,速度越快,成本越高,容量越小。速度快的,用于频繁访问的数据,比如程序的局部变量,速度慢的,用于偶尔访问的数据,比如一个文档。

因为是逐层的,所以内存和外存的关系,可以推广到高层和底层的关系,cache和内存的关系很像内存和外存的关系,比如cache也有交换机制。这些都是后话了,这里简单提一嘴。

材料

在这里插入图片描述

RAM分类如下:

  1. 双极性。用于Cache
  2. MOS型。
    • SRAM(Static RAM)。用于cache
    • DRAM(Dynamic RAM)。需要定期刷新,用于内存

ROM分类如下:

  1. MROM(Mask ROM)。制造的时候写入数据
  2. PROM(Programmable ROM)。支持一次编程
  3. EPROM(Erasable PROM)。可擦除,支持多次重头编程
  4. Flash。闪存。

高速储存器缓冲储存器(Cache)

Cache记录了主存中需要频繁访问的一小部分数据。

材料,局部性,访问方式

从制作材料来说:

  1. cache由SRAM制成。
  2. 内存由DRAM制成

SRAM读取速度比DRAM更快,用于制作cache,SRAM成本高,所以cache都很小。
那小小的cache为什么能支撑如此频繁的访问呢?原因就在于局部性原理:

  1. 时间局部性。相邻的时间内,程序会集中访问一个数据。
  2. 空间局部性。程序更倾向于访问空间上相邻的区域。

cache的访问结构有两种,从本质上来说,贯通查找是串行,旁路读出是并行:

  1. 贯通查找式(Look Through)。CPU先访问cache,如果cache中没有,再去内存中访问。cache平均访问时间 = cache访问时间+(1-命中率)×未命中时主存访问时间
  2. 旁路读出式(Look Aside)。读取方式类似于操作系统的快表TLB,CPU同时去cache和内存中找数据,如果cache里有那就最好,即使cache里没有,查找速度也比贯通查找要快,已经节省了读Cache的时间。cache平均访问时间 = 命中率×cache访问时间+(1-命中率)×未命中时主存访问时间

Cache全相联映射

Cache映射方式有三种,我们只介绍全相联映射。本节具体谈一下Cache的访问机制。

Cache中的内容是内存的一个子集,因此Cache中数据块大小和内存中一致。而在Cache与内存之间,通过目录表记录cache块与内存块之间的映射关系(下图中的M1与C1,M2与C2的对应关系)。内存和Cache存放数据本身,而目录表存放映射关系,记录了内存中的哪些数据块被存到cache中了。

在这里插入图片描述

CPU读数据的时候,是不会区分cache与内存的,他只是提供一个内存地址,即我们要访问某个内存数据块M。那么第一步是要检查cache中是否已经有M的数据,检查就要用到目录表。全相联映射的做法是,遍历目录表,看看M是否在目录表中,有的话就是hit,直接把M的内存地址转换成cache中的地址。之后再加上偏移量就是我们要的数据。

如果M没有记录在目录表中,就是miss,此时就去内存中找数据。

Cache交换与一致性

cache的miss和缺页中断类似,发生miss后cache会从主存调块。如果cache中没有空闲的行,就会进行替换。替换方法同操作系统中缺页中断的替换方法,比如FIFO,LRU等,还有一个额外的随机算法

写cache的时候,会对内容进行修改,就会影响到后面的交换。比如修改了cache,替换这一块数据前就得先回写到内存中去。此类问题统称为数据一致性问题。

单核CPU一致性处理

  1. miss。直接把写的内容写到内存。写完后有的计算机会把数据块调入cache。
  2. hit。
    • 直写式。写cache的同时,写内存。缺点在于,写完内存之前,cache不能用,会拖慢写入速度。
    • 回写式。实际上,没必要频繁写内存,只需要在被置换出去前写一次内存就够了,为此,需要一个dirty位,1代表cache的数据被写过(修改过),则这一行被交换出去的时候需要先写一次内存,把cache的修改同步到内存。如果没修改过,那就不用同步内存。回写式比较快,但是机制比较复杂。

多核CPU的MESI协议

多核,每个CPU都有一个cache,如果两个cpu都把一个内存块数据调到cache里,进行不同的修改,再写回去就会冲突。因此要更复杂的协议,即MESI协议。

MESI协议将数据段定义为4种状态(倒着来):

  1. I(Invalid)。无效缓存段。仅在内存中,还没有cache使用这个数据段。
  2. S(share)。共享缓存段。一个内存块在多个cache里都有拷贝,多个处理器共享。
  3. E(exclusive)。独占缓存段。一个内存块仅被一个cache使用,且没有被修改。
  4. M(modify)。修改缓存短。一个内存块仅被一个cache使用,且已经被修改。退出M状态前要先进行回写。

针对这些状态,有如下规则:

  1. 独占可写。当数据处于M和E的时候,才可以写。
  2. 共享只读。数据处于S时,只读。只要不让多个CPU同时写,就不会出现不一致问题。

主储存器(内存)

内存使用DRAM材料。

主要技术指标

容量

存储单元数量=行数×列数×数据深度×L(Bank的数量)

在这里插入图片描述

上面的三个布局都是128M,以第一个为例:

  1. 行地址是0-11,所以行为 2 12 2^{12} 212
  2. 列地址是0-9与11,列为 2 11 2^{11} 211
  3. 位宽(数据深度)=4
  4. bank数=4

所以 2 12 × 2 11 × 2 2 × 2 2 = 2 27 = 2 7 × 2 20 = 128 M B 2^{12}\times 2^{11}\times 2^{2}\times 2^{2}=2^{27}=2^7\times 2^{20}=128MB 212×211×22×22=227=27×220=128MB

带宽

带宽=总线宽度×总线频率/8(B/s)

PC100 SDRAM 外频100MHz时,带宽=64×100/8=800(MB/s)
PC133 SDRAM 外频133MHz时,带宽=64×133/8=1 064(MB/s)
DDR DRAM 外频100MHz时,带宽=64×100×2/8=1.6(GB/s)

SDRAM是普通内存,就用带宽公式即可。但是DDR DRAM是双通道的,所以要翻个倍。

内存模组与内存颗粒

内存颗粒可以理解为内存的储存单元。分为SDRAM和DDR DRAM两种材料,DDR的速度要翻一倍。之所以速度翻倍,是因为SDRAM一个时钟周期只在上升沿传一次数据,而DDR在上升沿和下降沿都会传输一次数据,所以翻倍(Double Date Rate SDRAM)。

现在市面上不单纯卖内存颗粒,而是把相关的控制芯片,颗粒,各种元件焊在一个PCB上组成一个内存模组,俗称内存条,只暴露出接口。

辅助储存器(外存)

类型、工作原理、技术指标

类型:

  1. 机械硬盘HHD。使用ATA标准
    • PATA接口(Parallel ATA)。我们俗称的ATA接口就是PATA接口,速度慢,抗干扰差,逐渐被取代。
    • SATA接口(Serial ATA)。支持热插拔
    • IDE接口。这是个很大的概念,有时指代PATA,有时候指代SATA
    • SCSI接口。淘汰。
  2. 固态硬盘SSD。接口与HHD相同,但是采用FLASH介质,读写速度不受储存位置影响,很快。但是FLASH材质坏块无法修复,且有擦写次数限制,寿命有限。

工作原理(机械硬盘):

  1. 盘面(一个盘片两个盘面)
  2. 磁道
  3. 扇区。注意,扇区从1开始编址,其他从0开始。

0磁头0柱面1扇区存放了磁盘的主引导区,MBR。

技术指标:

  1. 容量。
  2. 转速。很大程度上决定了访问速度
  3. 缓存。缓存在磁盘读写的初期提供较快的速度,缓存用光以后速度会降下来。
  4. 访问时间
    • 寻道时间。磁头寻道
    • 潜伏时间。磁头在磁道上,等待目标扇区转过来的时间
    • 访问时间。磁头在目标扇区上访问数据的时间

地址计算(重点)

CHS编址模型

ATA接口采用CHS编址模型:C(柱面)H(磁头)S(扇区):

  1. 柱面从0开始,总共nC个
  2. 磁头从0开始,总共nH个
  3. 扇区从1开始,总共nS个

总共有nC×nH×nS个扇区,每个扇区512B。
下图中,柱面,磁头,扇区的数字都是二进制编址的位数,IED总共有28位,即有 2 28 2^{28} 228个扇区,则总空间为 2 28 × 2 9 B = 2 7 × 2 30 = 128 G 2^{28}\times 2^{9}B=2^{7}\times 2^{30}=128G 228×29B=27×230=128G。如果是十进制(1G=1000M),则硬盘上限是 2 37 1 0 9 = 137 G \dfrac{2^{37}}{10^{9}}=137G 109237=137G

在这里插入图片描述

LBA与CHS编址互换

LBA(Logical Block Address)是线性的逻辑地址,CHS是物理地址。

在<C,H,S>编址模式中,范围如下:

  1. 0≤C≤nC−1
  2. 0≤H≤nH−1
  3. 1≤S≤nS

如果是1柱面,则代表当前访问的内容在(0,1]柱面之间。CHS转LBA公式:
最后-1是因为S从1开始编址,导致基地址会虚高1个扇区。

L = [ ( C × n H + H ) × n S ] + S – 1 L=[(C×nH + H)×nS]+S–1 L=[(C×nH+H)×nS]+S–1

LAB转CHS公式:
S需要额外+1,因为从1开始编址的
C不需要求模,因为除完以后不可能大于nC了,求不求模都一样。注意,这里的除,是C语言中的整除。

S = L % n S + 1 H = ( L ÷ n S ) % n H C = ( L ÷ n S ÷ n H ) \begin{gather} S =L\%nS+1 \\ H =(L÷nS)\%nH \\ C =(L÷nS÷nH) \\ \end{gather} S=L%nS+1H=(L÷nS)%nHC=(L÷nS÷nH)

例题:

在这里插入图片描述

2 11 × 2 4 × 2 6 × 2 9 B = 2 30 B = 1 G B 2^{11}\times 2^{4}\times 2^6 \times 2^9B=2^{30}B=1GB 211×24×26×29B=230B=1GB如果折算成10进制,就是 ( 1024 1000 ) 3 G B (\dfrac{1024}{1000})^3GB (10001024)3GB

逻辑盘块2K,513号(从0开始)对应的逻辑地址为513×2K,对应的LBS地址为 L = 513 × 2 K 512 = 513 × 4 = 2052 L=\dfrac{513\times2K}{512}=513\times 4=2052 L=512513×2K=513×4=2052。接下来计算SHC:

  1. S = 2052 m o d    64 + 1 = 5 S=2052\mod 64+1=5 S=2052mod64+1=5
  2. H = ( 2052 / 64 ) m o d    16 = 0 H=(2052/ 64)\mod 16=0 H=(2052/64)mod16=0
  3. C = ( 2052 / 64 / 16 ) = 2 C=(2052/ 64 / 16)=2 C=(2052/64/16)=2

结果为CHS=<2,0,5>

NCQ技术

如果磁盘按照FIFO算法去寻道,可能会花费很久的时间。
NCQ技术对请求序列重新排列,使得数据传输更快速,磁头移动的路径更短:

在这里插入图片描述

总线技术

这一章全是概念,甚至没有计算。

在这里插入图片描述

总线概述

总线就是通讯通道,用于传输数据的。以前的总线指的是把很多股线并在一起,现在总线泛指一切可以提供通讯功能的线。
总线有各种标准,标准的总线可以适配绝大多数厂商的硬件板卡,这种模块化的思想在硬件与软件中广泛使用。

总线有不同类别,理解即可:

  1. 按所处的位置分类
    • 片内总线:指CPU内部的总线,即芯片内部的总线。
    • 片外总线:指CPU与内存和IO设备之间的通信接口,常指外设的接口标准,如SATA/SCSI/USB/IEEE 1394等。
  2. 按功能分类
    • 地址总线(Address Bus,AB):用来传送地址信息。
    • 数据总线(Data Bus,DB):用来传送数据信息。
    • 控制总线(Control Bus,CB):用来传送控制信号。
  3. 按信息传送方向分类
    • 单向总线:信息只能朝一个方向传送,如地址总线。一般是CPU
    • 双向总线:信息可以朝两个方向传送,如数据总线。一般是数据
  4. 按层次结构分类
    • CPU总线:用来连接CPU和控制芯片。
    • 存储总线:用来连接存储控制器和内存。
    • I/O通道总线:用来连接扩充插槽上的各扩展板卡。
  5. 按通信方式分类
    • 并行总线
    • 串行总线
  6. 按时钟信号方式分类
    • 同步总线:时钟信号独立于数据。
    • 异步总线:时钟信号是从数据中提取出来的,通常利用数据信号的边沿来作为时钟同步信号。

总线的技术指标:

  1. 频率。一秒钟传送的次数
  2. 位宽。一次传送的数据量(bit)

总线的带宽(B/s) = 总线的工作频率 × 总线的位宽 ÷ 8

PCI总线

PCI总线不依赖于某一个特殊硬件,可以为不同厂家,不同类型(显卡,声卡,网卡等)的硬件设备提供接口,是典型的模块化产物。

PCI总线特点如下:

  1. 地址与数据复用
  2. 兼容32位于64位
  3. 即插即用
  4. 独立于处理器,兼容各种处理器,多个处理器

PCI总线连接了系统中的各个功能部件,两个部件之间通过PCI总线交流,而不是直接交流。如果没有总线,不同部件之间的交流就会变得很复杂。

在这里插入图片描述

PCI-E总线

在这里插入图片描述

以前PCI总线布局中,控制设备一定要经过PCI总线,那么,很多设备就需要争夺带宽,这就不允许有很高的速度。

现在,PCI-E总线相当于开了一个通道,跳过PCI总线,让设备直接与IO控制中心通信。实际上,PCI-E总线和PCI总线地位相当,甚至PCI-E X16总线还要更高级,可以直接链接内存控制中心。

USB总线(Universal Serial Bus)

概述

PCI总线通常用于计算机内部的连接,计算机外设连接常用USB总线,特点如下:

  1. 支持热插拔。以前的PS/2总线不可热插拔,得先关机,否则烧主板。
  2. 支持嵌套。USB上可以挂接USB,现在的拓展坞就是一种挂接,当然,挂接是有上限的。
  3. 接口小,成本低,性能可靠。

USB1.0、2.0、3.0

USB1的速度慢,而且很多系统不支持。USB2是USB1的升级,支持三种传输速率,是现在应用最广泛的USB接口。

在这里插入图片描述

从下图可以看出,如果是低速,就用D-线,如果是全速和高速模式,就用D+线,加电压。

在这里插入图片描述

USB1和2的接口一样,小端分MiniUSB,MicroUSB,我们现在都用MicroUSB。大端分为USB-A和USB-B,B口常用于打印机,A口就是我们现在广泛使用的。

在这里插入图片描述

USB3是重大提升,带宽可达5GB/s,其重要特点是全双工。这里要区分一下双工:

  1. 单工。只能单向传输
  2. 半双工。允许双向,但是两个方向公用一条路,不可以同时传输
  3. 全双工。双向,两个方向各有一条路,可以同时传输。

OTG技术

经典的USB架构是主从架构,比如充电器是主,手机是从,电脑是主,各种外设是从。

那手机和U盘如何连接呢?这两个都是从设备,OTG技术就是在没有主机的情况下,实现从设备之间端到端的数据传送。

具体原理比较复杂,其实核心就是ID引脚。从下图中可以看出,两个从设备,哪一个的ID引脚接地,哪一个就能当成主设备。

在这里插入图片描述

OTG技术还有扩展功能。实际上,ID引脚是由某个特殊的电阻决定的,也就是说,不同的电阻就可以决定不同的主从关系。OTG设备就是通过不同的电阻来识别设备类型的,进而决定哪个设备的ID引脚接地,成为主设备。

在这里插入图片描述

信息传输方式

不同的信息传输方式其实就是USB通信协议:

  1. 控制传输:用来支持外设与主机之间的控制、状态、配置等信息的传输,为外设与主机之间提供控制通道。
  2. 同步传输:周期性地传输。
  3. 中断传输:支持游戏手柄、鼠标和键盘等输入设备。用于少量,即时的事件传输。
  4. 数据块传输:支持打印机、扫描仪、数码相机等外设。用于大量数据传输

I 2 I^2 I2C总线(Inter Integrated Circuit)

在这里插入图片描述

使用两根线作为串行的通道,结构比PCI简单很多。

I2C是多主机总线,挂到总线上的设备分为主设备和从设备,每一个挂到I2C总线上的设备都有一个唯一的地址用于识别。

速度很慢,设备数量受限制大。

接口技术(重点)

在这里插入图片描述

这一章涉及到硬件相关编程,是重点。

串行接口与应用:8250与16550编程

概述

前面说了各种接口,总线,本章具体的讲一下串口通信是如何实现的。

我们平时的数据都是以字节为单位的,但是串行的数据线只能送1bit,所以要拆开发送。从低字节开始,严格按照顺序发送,接收方也是严格按照顺序接受,再将串行的bit位拼接为并行的字节数据。

在这里插入图片描述

数据传送方式分为单工,半双工,双工:

  1. 单工。只能单向传输
  2. 半双工。允许双向,但是两个方向公用一条路,不可以同时传输
  3. 全双工。双向,两个方向各有一条路,可以同时传输。

在这里插入图片描述
发送端和接收端往往是通过线路链接的,现在的光纤直接传播数字信号,而以前的电话线都是模拟信号,这就涉及到调制和解调。调制过程如下,解调相反:

调幅:有与无区分0,1
调频:用频率区分0,1
调相:类似于加密

在这里插入图片描述
从硬件上来说,数字0和1有两种标准,两种标准可以通过器件相互转换:

  1. RS-232C。用正负电压区分1,0。负电压是1,正电压是0,-15到-5是1,5到15是0。比较奇怪,负电压反而是1。
  2. TTL。现在广泛使用,用高低电压区分1,0。0-0.4V为低电压,2.4到5V是高电压。这个就很正常,高就是1,低就是0。

串行通信协议有两种:

  1. 异步。没有时钟信号,一次传输一个字符,传送不连续
  2. 同步。双方同时接收一个时钟信号,比如计算机里的时钟,世界上的原子钟。面向bit,连续传输

异步串行协议

异步串行帧

异步没有时钟信号,我怎么才能知道这一串bit位组合起来是一个字符呢?一个直观的思路是在一个字符前后加上分割的比特位。

举个例子,下图中,第n个字符,有一个起始位0,之后紧跟7位数据(ascii码),之后是一位奇偶校验,一位停止位1。总共传一个字符要用10bit。当然,这只是一种编法,校验位可以用奇校验,偶校验,停止位也可以用1位,两位。

在这里插入图片描述

这里插一点东西,奇偶校验原理,奇偶校验使用1的个数进行校验:

  1. 奇校验: 连同校验位使得所有位上的1相加为奇数
  2. 偶校验:连同校验位使得所有位上的1相加为偶数

实例:

原数 奇校验 偶校验

1001 1001 1 1001 0

1101 1101 0 1101 1

例题

协议介绍完了,来进行一些计算吧,来几道例题:

例8.1 在异步串行通信中,其一帧数据格式为1位起始位,7位数据位,1位偶校验,1位停止位,则发送数据ASCII‘Q’(1010001)的帧数据是什么?(起始位在左)。思路:

  1. ASCII ‘Q’ = 51h(1010001)
  2. 偶校验时,1的个数为奇,所以校验位为1
  3. 起始位为0,且起始位在左边,按照低位先行的规则,字符编码应该反着写
  4. 最终结果为0 1000101 1 1

在这里插入图片描述

首先说一下波特率。波特率和比特率并不是一个东西,但是因为串口通信的通信单元是bit,所以在这里波特率就是比特率。9600代表一秒钟传输9600个bit。

数据传输效率=有效数据传输率。10个bit里有7个是真正的信息载体,所以效率是70%

在这里插入图片描述
1MB数据,没说有效数据,所以就直接 1 M × 8 9600 \dfrac{1M\times 8}{9600} 96001M×8即可。

有效数据传输率=数据传输效率,是百分比,与异步串行帧格式有关。这里应该还有个起始位,所以是70%

时钟误差(TODO)

在这里插入图片描述

同步串行协议

异步串行是事件驱动的,有信息才进行传送,但是效率比较低。同步串行协议用统一的时钟信号调节,数据流字符与字符同步,bit与bit同步。

面向字符的同步协议

因为有时钟,所以字符前后不需要加东西,n个字符可以构成一个数据块。
同步串行只需要在一大个数据块左右加上描述信息即可,而异步串行在每个字符左右都要加描述信息,所以同步传输的信息传输效率高了不少。

在这里插入图片描述

面向bit的同步协议

有了时钟以后,其实不需要考虑数据的格式了,数据块里可以存放任意大小的数据,依靠约定的位组合模式储存信息。而面向字符的协议,一个数据块的大小一定是字符长度的整数倍。

在这里插入图片描述

可编程串行通信接口

可编程串行通信方法很多,本节仅仅介绍异步收发传输器的使用方法,不涉及同步通信。

下图为8250/16550(两种异步通信收发传输器)的外部引脚。看起来很复杂,主要也就几个需要注意的:

  1. A0-A2。这三个接口非常重要,用于选择寄存器。
  2. D0-D7。用于传输数据,可见,传输一次数据是要传1字节,所以在汇编编程的时候,通常是用AL去存放要传输的信息,与8位的长度对应。

在这里插入图片描述

收发器内部寄存器

在汇编的编程中,其实这些引脚都不需要去管,我们通过对收发器内部的寄存器进行操作来收发信息。
收发器在接入系统后,内部的每个寄存器都有一个编号,比如LCR的编号是3(A2-A0为011),用的时候,基址+编号就是这个寄存器的端口号,基址根据硬件的不同会发生变化,但是编号是固定的,计算端口号的时候就用基址+编号即可。
通过IN指令/OUT指令 +端口号可以实现对特定寄存器的读写。

下图中有很多寄存器,对应很多端口,实际使用只需要记住几个就行:

  1. 000(0)。这个端口作用挺多的,而且还会和DLAB形成新的组合。(DLAB是LCR寄存器中的一位)
    • 如果DLAB=0。那么000就用于收发数据,分别对应RBR和THR。
    • 如果DLAB=1。那么000就用于设置波特率,对应DLL(除数寄存器的低字节)
  2. 001(1)。我们只用他来设置波特率,此时DLAB=1,对应DLM(除数寄存器的高字节)
  3. 011(3)。LCR寄存器,用于设置异步通信帧格式,比如用几位停止,奇偶校验等。里面还有一个DLAB位,用于设置波特率。
  4. 101(5)。LSR寄存器,用于获取线路的状态,比如发过去的消息是否被另一端接受,线路里是否有另一端发过来的消息需要接受。

在这里插入图片描述

接下来的三个小部分就要围绕这几个寄存器实现。

状态检测与数据收发

类似于生产者消费者,收发数据中间是有一个缓冲区的,所以发送数据需要检测缓冲区是否是空/满,即发过去的消息是否被另一端接受,线路里是否有另一端发过来的消息需要接受。
这些状态被编码到了LSR中(编号为5),LSR有8位,只需要关注两个:

  1. THRE。1代表另一端已经接收,可以发送了。处于第5位,test指令测试的时候对应的one-hot编码为0010 0000B=20H
  2. DR。1代表另一端已经发送,可以接受了。处于第1位,test指令测试的时候对应的one-hot编码为0000 0001B=01H

总之呢,1就是代表有信号,这一端就要进行收发操作了,进行了操作后,这一位变成0,等待另一端操作。

在这里插入图片描述

来道例题:

例8.5 假定8250/16550基地址为3F8H,在不考虑串口发送、接收出错的情况下,试编写程序从串行接口发送和接收一个字符AL。

解:

这道题要求写一个接受程序,再写一个发送程序。
分析一下,基地址是3F8H,所以叠加了编号以后,发送保持寄存器、接收缓冲寄存器的地址为3F8H(A2、A1、A0 = 000B),而线路状态寄存器的地址为3FDH(A2、A1、A0 = 101B)。

发送程序,指令里面有满满的细节:

  1. 首先保存数据。要发送的数据存在了AL里,但是后面还要用AL干别的,所以先push保存起来。
    • 为什么是AX呢?因为push只能是16位和32位寄存器,所以push的是AX
  2. 之后用死循环检测是否可以发送数据
    • 先把3fdh送到DX中。因为3fdh超过了16位,所以IN/OUT指令必须配合DX使用。
    • 使用IN指令,循环读取3fdh的值,送到AL里(数据已经保护,这里放心用)。使用20H的one-hot编码测试是否可写,如果是0,则不可写,JZ指令继续读取。如果是1,则跳出循环。
  3. 跳出测试循环后,把要发送的数据出栈到AL里,把寄存器端口号换成3f8h,使用OUT指令发送AL。

在这里插入图片描述

接受程序类似:

  1. 使用01H的one-hot编码循环测试是否可读。可读则跳出循环
  2. 跳出循环后,切换端口号为3f8h,使用IN指令接收数据到AL里。

在这里插入图片描述

异步通信帧格式设置

设置通信帧格式要用LCR(编号为3)

东西很多,但是不需要记,只要理解了,知道怎么看就行了,考试会给这张表:
注意,下面这个表,最上面的WLS1对应最低位,别写反了。

在这里插入图片描述
来道例题:

例8.6 8250地址范围为03F8H~03FFH,试编写程序设置发送字符长度为8位,2位停止位,偶校验(默认是有一位起始位的,不需要设置起始位)。

解:

  1. 线路控制寄存器的地址为3FBH(叠加编号3)
  2. 控制字应为0(不用除数寄存器,DLAB=0)0(不间断)0(不固定,奇偶校验位由数据本身决定) 1(指定为偶校验) 1(使用奇偶校验) 1(2位停止位) 11(8位)B。

最后的程序长这样:

MOV DX, 3FBH ;LCR地址
MOV AL, 00011111B ;LCR的内容,数据格式参数
OUT DX, AL

变一下,假设是7位,1位停止,奇校验,则数据为000 0 1 0 10b

波特率设置

如果将LCR的DLAB设置为1,则后续的操作和设置波特率有关。

计算机中有个基准时钟,有一个基准频率,通过分频器,就可以获得不同的波特率。而修改波特率就要修改除数寄存器的值,在DLAB=1后,0编号对应低字节,1编号对应高字节。具体怎么设置,数字推导比较麻烦,直接给出公式:

除数寄存器值 = 115200 ÷ 波特率 除数寄存器值=115200\div 波特率 除数寄存器值=115200÷波特率

来道例题:

例8.7 编写程序,设置波特率为2400b/s

  1. 先求除数寄存器值:115200÷2400 =48=0030H
  2. 之后先设置DLAB=1,此时相当于进入波特率设置模式
  3. 分别对3f8h和3f9h写入低字节(30H)和高字节(00H)
  4. 设置好波特率后,恢复DLAB=0,退出波特率设置模式,顺便把通信帧格式设置了。

在这里插入图片描述

定时和计数技术:8254编程

读写逻辑与控制寄存器

类似于8250,一个8254里面也有多个地址编号。
从下图来看,A1A0可以有4个排列,编号012对应3个计数器,编号3是控制寄存器。

在这里插入图片描述

重点看一下编号3的控制寄存器,控制字用来确定每一个计数器的工作参数,包括数据读写格式、工作方式、数制:

  1. D7D6,00-10分别指代计数器012,11我们不用。
  2. D5D4,00将计数器数值保持住,01,10,11是两个字节的位置编码
  3. D3D2D1指定工作模式
  4. D0指定编码

在这里插入图片描述

基本操作

设置

直接上例题:

例8.12 8254基地址为40H,编程将计数器0初始化,工作方式为3,二进制计数模式,初值为2000。

思路:

  1. 控制字为:00(对应计数器0),11(因为2000>256,所以要用16位计数),011(工作方式3),0(二进制计数)
  2. 具体编程
    • 先使用OUT指令,写入控制字到43H(40H基址+编号3)
    • 之后用OUT指令,写入初始值到40H(计数器0),先写低8位,再写高8位

如果用BCD计数,控制字最后一位就是1,写到40H的时候会更加直观。但是BCD也有个缺点,能表示的范围不如纯二进制,最多9999,而二进制可以到6w多。

在这里插入图片描述

在变一下,如果要初始胡计数器2,工作方式4,BCD码,初值30:

则控制字:10(计数器2),01(只使用低8位),100(工作方式4),1(BCD)

MOV AL,10011001B	;写控制字
OUT 43H,AL
MOV AL,30H
OUT 42H,AL	;写BCD码

读取

写入计数器值用OUT,读取就是IN。同样是先低8位,后高8位。

这里有一个问题,在两次读取之间,计数器值可能会发生变化,所以要先把计数器值用GATE信号锁住。之后再读,读完再放开继续计数。

上例题:

例8-13 假定8254端口基址为40H,编写程序锁存并读取计数器0的计数值。

解:

  1. 控制字:00(计数器0),00(锁存),011(工作模式与前面设置的保持一致),0(进制与前面设置的保持一致)
  2. 写入控制字到43H,实现锁存。
  3. 从40H读取两次
    • 第一次读取低字节到AL
    • 把AL转移到AH里,准备下一次读
    • 第二次读取高字节到AL,此时低字节在AH
    • XCHG指令交换高低字节

在这里插入图片描述

工作方式

0-5,总共6种工作方式:

  1. 0(计数结束中断方式)。从初始值减到0后就停止,不会重新开始。新的初始值立即生效。
  2. 1(可编程单稳态触发器)。新的初始值要等这次结束。
  3. 2(脉冲波发生器,分频器)。初始值会自动装填。
  4. 3(方波发生器),和2的频率相同,只是波形不一样
  5. 45(略)

应用

从工作方式来看,01和计数相关,23和分频相关,所以用途也就是这两方面。

计数

计数器从初值一直减少直到1,此时输出端会输出一个信号,向CPU申请中断。也可以在半路锁存读取出计数值,用于计算事件的发生次数。

具体做,使用工作方式0,设定初值即可。

分频

分频也很简单,分频系数是多少就给计数器赋值多少即可。比如100HZ降成1HZ,就用工作方式2,赋初值100。

例题:

供一个频率为10kHz的时钟信号,要求每隔100ms采集一次数据。

解:

  1. 先计算分频系数。对于一个10kHz时钟信号,其周期为1/10kHz=0.0001s=0.1ms。需要对它进行分频,生成一个周期为100ms的信号,频率为10Hz。所以要缩小1000倍,计数值为1000。
  2. 控制字=00(计数器0),11(16位,放1000),010(工作方式2),0(2进制)
  3. 先把控制字写入203H(编号3)端口
  4. 之后把DX切为200H(编号为0),依次对计数器0写入低八位,高八位。

在这里插入图片描述

级联分频

16位二进制是有上限的,65536。超出这个值,就需要用一个计数器的输出当做另一个计数器的时钟输入,这样最终的分频系数就是两个计数器的分频系数之积。

例题:

输入脉冲频率为10kHz,要产生周期为100s的定时信号(频率为0.01Hz)

  1. 计算分频系数。N=10k/0.01 =1000000。超出65536,采取级联方式,设N1=4000,N2=250
  2. 下面的程序仅仅是对两个计数器进行初始化操作,级联相关的操作略过,不做要求。
    • 注意端口,203是控制字,200是计数器1,201是计数器2。
    • 这里采用BCD格式,比较直观。

在这里插入图片描述

红外

用红外光通信,是无线通信。

  1. 速度快。毕竟是光速,速度很快
  2. 需要对准,且无障碍物。因为红外线波长比较短,绕行能力比无线电波差很多,所以简单的障碍物就可以阻挡红外信号。

一个红外系统需要三个部件:

  1. 发射机。比如遥控器
  2. 信道。空气(其实电磁波真空中也OK)
  3. 接收机。电视

WiFi

WiFi=Wireless Fidelity

WiFi是局域无线网,有一些术语:

  1. 工作站(STA)。其实就是要联网的设备,比如手机
  2. 无线接入点(AP)。可比如路由器,向内管理工作站,向外链接公网,起到交换机的作用
  3. 无线介质(WM)。比如空气(其实电磁波真空中也OK)
  4. 主干分布式系统。不懂()

无中心网络(Ad-hoc网络)

多个工作站地位平等,有相同的工作组名、密码和SSID,只要互相都在彼此的有效范围之内,任意两台或多台计算机都可以建立一个独立的局域网络。

但是因为没有路由器,所以只能是局域网,不能接入有线网,是最简单的WLAN结构。

如果读者小时候比较喜欢鼓捣手机,你就会想到手机之间互传东西其实就是无中心网络。小时候,手机之间互传东西常用的是蓝牙,但是纯蓝牙速度很慢,而还有一个技术叫WLAN,很多所谓的快传软件其实背后都是蓝牙和WLAN混用的。

在这里插入图片描述

有中心网络

经典的路由器架构,路由器充当AP的职责,向内管理各种STA,向外链接有线网。

同一个BSS内的两个设备可以直接通信,但是两个BBS之间的通信得走有线网。

在这里插入图片描述

中断技术

在这里插入图片描述
重点是8259,其他都是了解。

中断概述

中断,就像是人在做一件事情的时候,突然来了一个消息通知你去做别的事情。中断可以理解为做一半被打断,也可以理解为一种消息通知。引起中断的事件叫中断源。

CPU响应中断时,CPU暂停当前正在执行的程序转而执行中断服务程序。中断服务程序有如下流程,简单来说就是先记着手头的事情,去干别的,回来再恢复现场:

  1. 保护现场
  2. 处理中断
  3. 发送中断结束命令
  4. 恢复现场
  5. 中断返回

中断有广义和狭义之分,广义的中断可以分很多类,CPU最多处理256种中断或者异常:

  1. 外部中断——狭义中断(Interrupt)。有的中断可以被屏蔽。
    • 可屏蔽中断:INTR。根据某个标志位决定是否屏蔽此中断
    • 不可屏蔽中断:NMI。
  2. 内部中断——异常(Exception)。当指令执行期间检测到不正确操作,就会引起异常,异常不能被屏蔽(都错了还屏蔽个锤子)。INT n指令和INTO都是软中断,属于异常。
    • 故障(Fault)。可以排除的问题
    • 陷阱(Trap)。软中断指令INT n就属于陷阱
    • 中止(Abort)。严重问题,不可恢复,直接终止,重启才行。

最后看一下整体的架构。

  1. NMI和INTR都是外部来的,INTR由8259可编程中断控制器发出,也是后面的重点。
  2. INTO和INT n都是内部的,属于异常。断点也断异常大类里的。

在这里插入图片描述

中断处理

实模式中断处理

在这里插入图片描述
实模式下,有一个中断向量表,地址从0开始。
中断向量表的每一个描述符占4个字节,记录了中断处理程序的目标地址。注意,这个地址仍然是小端法,需要倒过来排列才能得到基址:偏移量。下面结合例子看一下:

给出一个实例中断向量表,使用INT 8H指令调用8号中断。因为4字节一个中断描述符,所以实际的地址为8H×4=20H。
从20H取4个字节,倒着排列,即02 0E:07 46,这就是我们中断处理程序的入口地址。

在这里插入图片描述

保护模式中断处理

保护模式下,中断向量表升级为IDT(中段描述符表),有两大改进:

  1. IDT位置不固定了,每个CPU都有一个IDT,其基址储存在IDTR中。
  2. 描述符更加复杂,要8个字节。
    在这里插入图片描述

具体的调用与返回过程比较复杂,不会细说,但是需要明白,中段描述符既然有那么多额外的描述信息,就一定会进行大量的检查,这也是保护模式的意义。

可编程中断控制器:8259编程

ICW1

基础设置

ICW2

初始化中断源类型码高5位,低3位保留为0

ICW3

主从设置

ICW4

其他设置

OCW都是在运行时不断变化

OCW1

中断屏蔽

OCW2

设置优先级
或者当中断结束时,清理ISR上对应位

OCW3

特殊屏蔽以及终端查询

高级可编程中断控制器(不考)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客题霸sql入门篇之条件查询(四)之高级查询

牛客题霸sql入门篇之条件查询(四)之高级查询 4 计算函数 4.1 查询GPA最高值 4.1.1 题目内容 4.1.2 示例代码 SELECT gpa FROM user_profile WHERE university复旦大学 ORDER BY gpa desc limit 1; -- LIMIT 初始位置&#xff0c;记录数 一个参数就是记录数4.1.3 运行结果 4…

Python Flask构建微信小程序订餐系统 (四)

🔥 创建微信小程序 🔥 微信开发者工具下载 并完成安装 在PyCharm 工具里面 order目录下面 创建mina 文件夹 通过微信小程序开发工具创建微信小程序工程 获取微信小程序ID

数据挖掘Java——PageRank算法的实现

一、PageRank算法的前置知识 PageRank算法&#xff1a;计算每一个网页的PageRank值&#xff0c;然后根据这个值的大小对网页的重要性进行排序。 从用户角度来看&#xff0c;一个网站就是若干页面组成的集合。然而&#xff0c;对于网站的设计者来说&#xff0c;这些页面是经过…

嵌入式系统开发笔记109:多个LED的闪烁控制

文章目录前言一、一般思路1、LED0 100ms闪烁&#xff0c;LED1 200ms闪烁2、LED0 100ms闪烁&#xff0c;LED1 300ms闪烁3、LED0 200ms闪烁&#xff0c;LED1 600ms闪烁二、通过循环变量实现1、LED0 500ms闪烁&#xff0c;LED1 700ms闪烁2、LED0 15ms闪烁&#xff0c;LED1 7ms闪烁…

Java——LRUCache

概念 简单来说&#xff0c;由于我们的空间是有限的&#xff0c;所以发明了这个数据结构&#xff0c;当我们的空间不够添加新的元素时&#xff0c;就会删除最近最少使用的元素。 其底层逻辑通过哈希表和链表共同实现。哈希表中存储链表的每一个元素&#xff0c;方便进行元素的…

Mysql分布式锁(三)悲观锁实现并发

在前面的方法中&#xff0c;一条sql语句中仍然存在着很多问题&#xff0c;于是我们可以用悲观锁来代替解决。 假设我们不用一条sql&#xff0c;仍然用先查询&#xff0c;判断&#xff0c;最后更新来实现业务。 文章目录悲观锁 select...for update1. 不加悲观锁1) 两个机器连接…

因果推断2--深度模型介绍(个人笔记)

目录 一、方法介绍 1.1TarNet 1.1.1TarNet 1.1.2网络结构 1.1.3counterfactual loss 1.1.4代码实现 1.2Dragonet 1.3DRNet 1.4VCNet VCNET AND FUNCTIONAL TARGETED REGULARIZATION FOR LEARNING CAUSAL EFFECTS OF CONTINUOUS TREATMENTS 二、待补充 一、方法介绍 …

AcWing 第82场周赛

AcWing 第82场周赛 竞赛 - AcWing B 4783. 多米诺骨牌 - AcWing题库 模拟题&#xff0c;考察代码描述问题的能力。 由题意所给的数学形式化定义中看出&#xff0c;所给的骨牌初始序列 L 和 R 的顺序一定是相互交错的&#xff0c;即 ...LRLRLRLR... 所以&#xff0c;一旦遇到…

KNN算法 搜索最优超参数:n_neighbors/weights/p

目录 一&#xff1a;遍历参数 超参调优测试 二&#xff1a;网格模型 超参调优测试 三&#xff1a;模型保存 四&#xff1a;模型使用 一&#xff1a;遍历参数 超参调优测试 1.1 超参调试&#xff0c;找到模型最优解[仅做测试&#xff0c;得出最优&#xff1a;n_neighbors, …

PowerDesigner导入SQL脚本生成带中文注释(comment)的ER图并保存为图片格式(含通用可执行vb脚本文件)

目录 1、安装数据库建模工具PowerDesigner 16.5 2、打开 PowerDesigner&#xff0c;选择反向工程 3、选择数据库类型 4、导入SQL脚本文件并生成数据库表模型 5、去掉Diagram画板黑色网格线&#xff08;选做&#xff09; 6、ER图常规显示&#xff08;包含是否为Null及表名…

D. Same Count One(模拟 + 思维转换(行不行,从列入手))

Problem - D - Codeforces ChthollyNotaSeniorious收到了AquaMoon的一份特殊礼物&#xff1a;n个长度为m的二进制数组。AquaMoon告诉他&#xff0c;在一次操作中&#xff0c;他可以选择任何两个数组和1到m中的任何位置&#xff0c;并交换这些数组中位置的元素。 他对这个游戏很…

RabbitMQ知识总结一

更多知识在我的语雀平台&#xff1a; https://www.yuque.com/ambition-bcpii/muziteng RabbitMQ 1. RabbitMQ引言 1.1 什么是MQ MQ&#xff08;Message Queue&#xff09;消息队列&#xff0c;是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦&#xff0…

带token的登陆页面爆破方法(burp宏+爬虫脚本分享)

文章目录前言一、token参数分析二、burp设置宏操作三、爬虫脚本四、小结前言 在工作中&#xff0c;会遇到很多登陆页面有token保护&#xff0c;如果用Burpsuite直接抓取数据包并使用爆破模块&#xff0c;则会因token过期导致无法爆破。此时至少可以采用三种办法&#xff1a; 第…

Java诊断工具——arthas,实时监控,了解一下

文章目录1、arthas 简介官方文档2、arthas 的使用场景3、安装&启动3.1 安装3.2 启动4、常用命令5、使用示例5.1 stack5.2 jad5.3 sc5.4 watch5.5 trace5.6 jobs5.7 logger5.8 dashboard5.9 redefine6、其它1、arthas 简介 arthas是由阿里巴巴中间件团队开源的Java诊断工具。…

kubernetes对外服务之Ingress

目录 ​​​​​​​一、Ingress 是什么 1.1Service的作用 1.2Ingress简介 二、Ingress 安装 三、Ingress 代理访问 3.1Ingress HTTP 代理访问 3.2 Ingress: HTTPS 代理访问 3.3Ingress Contronler怎么工作的&#xff1f; ​​​​​​​​​​​​​​一、Ingress 是什…

Java核心实操:内存溢出 实战、内存泄漏实战

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

ARM系列之MMU TLB和ASID基础概念介绍。

目录1、为什么要设计TLB&#xff1f;TLB中不包含我们需要的映射关系怎么办&#xff1f;2、TLB中都包含了啥&#xff1f;3、那什么是ASIDAddress Space ID&#xff08;ASID&#xff09;4、小结内存寻址简要过程如下&#xff1a;VA以页表大小取余&#xff0c;得到PA的低位&#x…

Go sync.Pool池化的学习

一句话总结&#xff1a;保存和复用临时对象&#xff0c;减少内存分配&#xff0c;降低 GC 压力。 一.前言 Go 语言标准库也大量使用了 sync.Pool&#xff0c;例如 fmt 和 encoding/json。 1.1 要解决的问题 一个新技术亦或是一个新名词&#xff0c;总是为了解决一些问题才出…

数据挖掘课程设计报告总结

一、实验题目 实验一 Apriori算法设计与应用 二、背景介绍 Apriori算法是一种挖掘关联规则的频繁项集算法&#xff0c;其核心思想是通过候选集生成和向下封闭检测两个阶段来挖掘频繁项集。 三、实验内容 1.3.1 运用的理论知识 关联规则挖掘是数据挖掘中最活跃的研究方法之…

数控恒流源电路简单讲解

&#xff08;1&#xff09;最近课设是做一个可步进的恒流源&#xff0c;所以查查找了很多资料之后。说一下自己对于恒流源电路的简单理解。 &#xff08;2&#xff09;我只是会将怎么使用和调整数据进行讲解&#xff0c;至于为什么这样只会讲我懂的部分。本人知道的也不是很多&…