究竟是什么中断?

时间:2019-03-21 11:31:34

标签: hardware interrupt cpu-architecture 6502

我想了解Logisim中类似我的6502工作相似的处理器项目的确切中断是什么。  我知道中断会执行以下步骤:

  1. 停止处理当前程序
  2. 将所有未完成的数据保存到堆栈中
  3. “有什么事情”
  4. 加载未完成的数据,让程序继续正常运行。

    我的问题是:在“某些事情” 步骤中会发生什么?程序计数器是否重定向到要执行的特殊程序?像读取按钮的ASCII码并将其保存到寄存器或某个内存位置中一样?如果是这样,那个特殊程序通常存储在存储器中的什么位置?而且,您可以制造这样一种CPU来处理各种中断吗?也许如果您按下按钮“ a”,那么它的ASCII将存储在A寄存器中,但是如果您按下按钮“ b”,则它将被存储在X寄存器中?

非常感谢您的帮助。

编辑:谢谢大家的回答。我学到了很多东西,现在可以继续我的项目了。

4 个答案:

答案 0 :(得分:11)

  

我的问题是:在“ SOMETHING”步骤中会发生什么?程序计数器是否重定向到要执行的特殊程序?

6502可屏蔽中断会发生以下情况:

  • 引发中断(这意味着芯片上的中断引脚被强制为低电平。
  • 当需要执行一条新指令时,6502会检查中断引脚是否为低电平,以及状态寄存器中的中断屏蔽是否未设置。如果不是这种情况,即中断引脚为高电平或中断屏蔽为高电平,则CPU继续运行。
  • 假设需要中断,CPU将PC保存在堆栈中
  • 然后,CPU将状态寄存器保存在堆栈中,但是B位设置为0。B位是“ break”位。对于BRK指令,它将设置为1,这是区分硬件中断和BRK指令之间区别的唯一方法。
  • 然后,CPU提取地址$FFFE$FFFF处的地址,并将其填充到PC中,因此从该地址再次开始执行。

仅此而已。一切由程序员决定,直到程序员执行RTI,然后将状态字和返回地址从堆栈中拉出并恢复到各自的寄存器中。保存所有寄存器和其他数据是程序员的责任。

  

程序计数器是否重定向到要执行的特殊程序?像读取被按下按钮的ASCII码并将其保存到寄存器或某个内存位置中一样?

是正确的。在基于6502的计算机系统中,内存顶部有三个向量:

$FFFA - $FFFB:不可屏蔽的中断(除了上面提到的状态寄存器中的I位以外,其他都一样)。

$FFFC - $FFFD:CPU检测到重置时使用的重置向量

$FFFE - $FFFF:正常中断向量。

上面的内容通常在ROM中,因为CPU启动时必须至少有一个复位向量。每个地址都指向机器操作系统中用于处理中断的例程。

通常,中断例程将首先通过RAM中存储的向量进行间接跳转。这允许在机器运行时更​​改中断例程。

然后,中断例程必须确定中断源。例如,在Commodore PET上,中断可能源自VIA芯片或PIA芯片中的任何一个,并且每个中断都可能出于各种原因(例如中断)引发中断。当监视器进行垂直空白显示时,即当它完成对屏幕的扫描并返回到第一行时,其中一个PIA芯片会引发中断。在此中断期间,PET执行一个例程以扫描键盘,并执行另一个例程以反转光标。当VIA计时器为零时,程序员可以插入一个中断例程,例如,切换输出线以产生声音的方波,则可能会发生另一个中断。


评论中一些问题的答案。

  

程序计数器转到地址$ FFFE以重新定位到该地址

否,程序计数器设置为该地址处的值。如果您有:

FFFE: 00 
FFFF: 10

程序计数器将设置为$1000(6502为小字节序),这是中断例程必须开始的地方。另外,NMI的向量在$FFFA。普通中断与$FFFE指令共享BRK,而不是NMI。

  

复位向量到底是做什么的?它会重置CPU吗?

复位向量包含在处理器通电或发生复位后 运行的代码的位置。

  

NMI和IRQ有什么区别?然后,我也想知道蒙版怎么了?是将处理器状态寄存器中的“ I”标志设置为高还是低的方法?

6502状态寄存器包含七个标志。通常,它们与算术指令的结果有关,例如如果运算结果为零,则设置Z;当运算溢出8位并移位时,设置C。 I标志启用和禁用普通中断(IRQ)。如果为零,则将遵守IRQ上的中断。如果为1,则禁止中断。您可以使用SEICLI指令手动设置和禁用它,并在发生中断时自动设置该标志(这是为了防止中断中断中断)。

NMI是不可屏蔽的中断。区别在于它忽略了I标志的状态并使用了不同的向量。

  

最后,向量是什么?它们是间接地址的同义词吗?

是的

  

哦,如果您确实知道,如何将以$ FFFA开头的中断地址存储在ROM中而不是真实的6502中的RAM中?

您必须安排地址解码逻辑将这些地址指向ROM而不是RAM。实际上,在Commodore系统中,$F000的整个块是包含操作系统一部分的ROM。这可能适用于大多数其他基于6502的系统。

答案 1 :(得分:3)

6502上有四种中断类型:RESET,NMI,IRQ和BRK。前三个是硬件中断,最后一个是软件中断。硬件中断在微处理器本身的引脚上具有物理输入电压。软件中断是由BRK指令引起的。

所有中断均为“向量”。这意味着当它们发生时,程序计数器(PC)立即从存储在内存中的地址装入,并且指令从该地址继续执行。

在64k存储器空间的末尾,地址以两个字节的小端格式存储。它们是(十六进制):

NMI     $FFFA/$FFFB 
RESET   $FFFC/$FFFD
IRQ     $FFFE/$FFFF 
BRK     $FFFE/$FFFF

对于NMI,IRQ和BRK,在加载中断地址之前,将当前PC地址压入堆栈。处理器状态寄存器也被压入堆栈。

将寄存器推送到堆栈上,足以为中断提供服务(处理)后恢复执行。但是,A,X和Y寄存器不会自动压入堆栈。相反,中断服务例程应在必要时执行此操作-并在服务结束时将其从堆栈中拉回。

请注意,IRQ和BRK向量具有相同的地址。为了区分服务代码中发生的情况,您需要检查推送的处理器状态寄存器的间隔位。如果中断来自BRK指令,则将设置中断位。

当前执行的指令将始终在服务中断之前完成。

中断处理有许多细微之处。其中之一是在同时发生(认定)中断的情况下获胜。另一个是在指令周期内发生中断的时间点。如果该中断发生在该指令的倒数第二个周期之前,那么它将在下一条指令中得到服务。如果是倒数第二个周期或之后,那么它将延迟到之后的一条指令。

通过使用SEI指令将处理器状态寄存器中的位置1,可以“关闭”或忽略IRQ中断。

通常,中断服务程序需要确定中断原因(光盘驱动器,键盘等),并确保清除中断条件并执行任何处理(例如,将按键放入缓冲区)。通常,它可以通过读取/写入映射到硬件的特定内存位置来做到这一点。

此链接上有更多信息:https://www.pagetable.com/?p=410

有关在实际的8位计算机中中断如何工作的更多信息(第59、86、295页):BBC Microcomputer Advanced User Guide

有关物理芯片封装的更多信息,您可以在其中查看芯片封装本身上的NMI,RES(ET)和IRQ引脚(第2,3页):6502 Datasheet

答案 2 :(得分:1)

我猜您要求硬件中断(IRQ或NMI)。在堆栈的第2步(不在堆栈寄存器中)存储程序计数器和标志寄存器。稍后,您调用RTI以恢复程序执行。程序计数器加载有“某物”的起始地址,该地址是中断子程序或处理中断的程序。如果需要在RTI之前修改它们的值并恢复它们,则必须存储A,X,Y寄存器。可以使用I标志来屏蔽(延迟)IRQ中断,并且NMI是不可屏蔽的,即始终对其进行处理。它们具有不同的子例程地址。

答案 3 :(得分:0)

中断是通过硬件或软件向正在运行的处理器发出信号,以便处理器关注该操作并根据中断消息执行操作。 中断分为三种:

  • 内部中断:-包括时钟周期中断,其中cpu必须执行特定操作直到特定时间,并且必须去执行另一个操作。
  • 软件中断:- 当软件本身出现问题或错误时会发生此中断。例如,用户试图将某物除以零并发生错误。还有中断。
  • 外部中断:- 外部中断由 IO 设备(例如鼠标和键盘)引起。

Cpu 设计用于处理此类中断并在中断发生之前恢复进程。